passagemath-combinat 10.6.42__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_combinat/__init__.py +3 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
- passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
- passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
- passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +24 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +35 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +769 -0
- sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Enumerated sets
|
|
4
|
+
|
|
5
|
+
Basic enumerated sets
|
|
6
|
+
---------------------
|
|
7
|
+
|
|
8
|
+
- :class:`~sage.combinat.subset.Subsets`, :class:`~sage.combinat.combination.Combinations`
|
|
9
|
+
- :class:`~sage.combinat.permutation.Arrangements`, :class:`~sage.combinat.tuple.Tuples`
|
|
10
|
+
- :class:`~sage.sets.finite_enumerated_set.FiniteEnumeratedSet`
|
|
11
|
+
- :class:`~DisjointUnionEnumeratedSets`
|
|
12
|
+
|
|
13
|
+
Integer lists
|
|
14
|
+
-------------
|
|
15
|
+
|
|
16
|
+
- :ref:`sage.combinat.partition`
|
|
17
|
+
- :ref:`sage.combinat.composition`
|
|
18
|
+
- :class:`~sage.combinat.composition_signed.SignedCompositions`
|
|
19
|
+
- :class:`IntegerListsLex`
|
|
20
|
+
- :ref:`sage.combinat.superpartition`
|
|
21
|
+
|
|
22
|
+
- :class:`~sage.combinat.integer_vector.IntegerVectors`
|
|
23
|
+
- :func:`~sage.combinat.integer_vector_weighted.WeightedIntegerVectors`
|
|
24
|
+
- :class:`~sage.combinat.integer_vectors_mod_permgroup.IntegerVectorsModPermutationGroup`
|
|
25
|
+
|
|
26
|
+
- :ref:`sage.combinat.parking_functions`
|
|
27
|
+
- :ref:`sage.combinat.non_decreasing_parking_function`
|
|
28
|
+
|
|
29
|
+
- :ref:`sage.combinat.sidon_sets`
|
|
30
|
+
|
|
31
|
+
Words
|
|
32
|
+
-----
|
|
33
|
+
|
|
34
|
+
- :class:`Words`
|
|
35
|
+
- :ref:`sage.combinat.subword`
|
|
36
|
+
- :ref:`sage.combinat.necklace`
|
|
37
|
+
- :ref:`sage.combinat.words.lyndon_word`
|
|
38
|
+
- :ref:`sage.combinat.dyck_word`
|
|
39
|
+
- :ref:`sage.combinat.debruijn_sequence`
|
|
40
|
+
- :ref:`sage.combinat.shuffle`
|
|
41
|
+
|
|
42
|
+
Permutations and arrangements
|
|
43
|
+
-----------------------------
|
|
44
|
+
|
|
45
|
+
- :ref:`sage.combinat.permutation`
|
|
46
|
+
- :ref:`sage.combinat.permutation_cython`
|
|
47
|
+
- :ref:`sage.combinat.affine_permutation`
|
|
48
|
+
- :class:`~sage.combinat.permutation.Arrangements`
|
|
49
|
+
- :ref:`sage.combinat.derangements`
|
|
50
|
+
- :ref:`sage.combinat.baxter_permutations`
|
|
51
|
+
|
|
52
|
+
.. SEEALSO::
|
|
53
|
+
|
|
54
|
+
- :class:`SymmetricGroup`, :func:`PermutationGroup`, :ref:`sage.groups.perm_gps.permutation_groups_catalog`
|
|
55
|
+
- :class:`FiniteSetMaps`
|
|
56
|
+
- :ref:`sage.combinat.integer_vectors_mod_permgroup`
|
|
57
|
+
- :ref:`sage.combinat.rsk`
|
|
58
|
+
|
|
59
|
+
Polyominoes
|
|
60
|
+
-----------
|
|
61
|
+
|
|
62
|
+
- :ref:`sage.combinat.parallelogram_polyomino`
|
|
63
|
+
|
|
64
|
+
Integer matrices and arrays
|
|
65
|
+
---------------------------
|
|
66
|
+
|
|
67
|
+
- :ref:`sage.combinat.integer_matrices`
|
|
68
|
+
- :ref:`sage.combinat.matrices.hadamard_matrix`
|
|
69
|
+
- :ref:`sage.combinat.matrices.latin`
|
|
70
|
+
- :ref:`sage.combinat.alternating_sign_matrix`
|
|
71
|
+
- :ref:`sage.combinat.six_vertex_model`
|
|
72
|
+
- :ref:`sage.combinat.similarity_class_type`
|
|
73
|
+
- :ref:`sage.combinat.restricted_growth`
|
|
74
|
+
- :ref:`sage.combinat.vector_partition`
|
|
75
|
+
|
|
76
|
+
Subsets and set partitions
|
|
77
|
+
--------------------------
|
|
78
|
+
|
|
79
|
+
- :class:`~sage.combinat.subset.Subsets`, :class:`~sage.combinat.combination.Combinations`
|
|
80
|
+
- :class:`~sage.combinat.subsets_pairwise.PairwiseCompatibleSubsets`
|
|
81
|
+
- :ref:`sage.combinat.subsets_hereditary`
|
|
82
|
+
- :ref:`sage.combinat.set_partition_ordered`
|
|
83
|
+
- :ref:`sage.combinat.set_partition`
|
|
84
|
+
- :ref:`sage.combinat.diagram_algebras`
|
|
85
|
+
- :class:`~sage.combinat.multiset_partition_into_sets_ordered.OrderedMultisetPartitionsIntoSets`,
|
|
86
|
+
:class:`~sage.combinat.multiset_partition_into_sets_ordered.OrderedMultisetPartitionIntoSets`
|
|
87
|
+
|
|
88
|
+
Trees
|
|
89
|
+
-----
|
|
90
|
+
|
|
91
|
+
- :ref:`sage.combinat.abstract_tree`
|
|
92
|
+
- :ref:`sage.combinat.ordered_tree`
|
|
93
|
+
- :ref:`sage.combinat.binary_tree`
|
|
94
|
+
- :ref:`sage.combinat.rooted_tree`
|
|
95
|
+
|
|
96
|
+
Enumerated sets related to graphs
|
|
97
|
+
---------------------------------
|
|
98
|
+
|
|
99
|
+
- :ref:`sage.combinat.degree_sequences`
|
|
100
|
+
- :ref:`sage.combinat.graph_path`
|
|
101
|
+
- :ref:`sage.combinat.perfect_matching`
|
|
102
|
+
|
|
103
|
+
Miscellaneous enumerated sets
|
|
104
|
+
-----------------------------
|
|
105
|
+
|
|
106
|
+
- :class:`~sage.combinat.integer_lists.invlex.IntegerListsLex`
|
|
107
|
+
- :class:`~sage.combinat.integer_vectors_mod_permgroup.IntegerVectorsModPermutationGroup`
|
|
108
|
+
- :ref:`sage.combinat.gray_codes`
|
|
109
|
+
- :class:`~sage.combinat.gelfand_tsetlin_patterns.GelfandTsetlinPattern`, :class:`~sage.combinat.gelfand_tsetlin_patterns.GelfandTsetlinPatterns`
|
|
110
|
+
- :class:`~sage.combinat.knutson_tao_puzzles.KnutsonTaoPuzzleSolver`
|
|
111
|
+
- :func:`LatticePolytope`
|
|
112
|
+
|
|
113
|
+
Backtracking solvers
|
|
114
|
+
--------------------
|
|
115
|
+
|
|
116
|
+
- :func:`~sage.sets.recursively_enumerated_set.RecursivelyEnumeratedSet`
|
|
117
|
+
- :class:`~sage.combinat.backtrack.GenericBacktracker`
|
|
118
|
+
- :mod:`sage.parallel.map_reduce`
|
|
119
|
+
- :ref:`sage.combinat.tiling`
|
|
120
|
+
- :ref:`sage.combinat.dlx`
|
|
121
|
+
- :ref:`sage.combinat.matrices.dlxcpp`
|
|
122
|
+
|
|
123
|
+
"""
|
|
Binary file
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Bell and Uppuluri-Carpenter numbers
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Nick Alexander
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from cysignals.memory cimport check_allocarray, sig_free
|
|
11
|
+
from sage.libs.gmp.mpz cimport *
|
|
12
|
+
from sage.rings.integer cimport Integer
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def expnums(int n, int aa):
|
|
16
|
+
r"""
|
|
17
|
+
Compute the first `n` exponential numbers around
|
|
18
|
+
`aa`, starting with the zero-th.
|
|
19
|
+
|
|
20
|
+
INPUT:
|
|
21
|
+
|
|
22
|
+
- ``n`` -- C machine int
|
|
23
|
+
|
|
24
|
+
- ``aa`` -- C machine int
|
|
25
|
+
|
|
26
|
+
OUTPUT: list of length `n`
|
|
27
|
+
|
|
28
|
+
ALGORITHM: We use the same integer addition algorithm as GAP. This
|
|
29
|
+
is an extension of Bell's triangle to the general case of
|
|
30
|
+
exponential numbers. The recursion performs `O(n^2)`
|
|
31
|
+
additions, but the running time is dominated by the cost of the
|
|
32
|
+
last integer addition, because the growth of the integer results of
|
|
33
|
+
partial computations is exponential in `n`. The algorithm
|
|
34
|
+
stores `O(n)` integers, but each is exponential in
|
|
35
|
+
`n`.
|
|
36
|
+
|
|
37
|
+
EXAMPLES::
|
|
38
|
+
|
|
39
|
+
sage: expnums(10, 1)
|
|
40
|
+
[1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147]
|
|
41
|
+
|
|
42
|
+
::
|
|
43
|
+
|
|
44
|
+
sage: expnums(10, -1)
|
|
45
|
+
[1, -1, 0, 1, 1, -2, -9, -9, 50, 267]
|
|
46
|
+
|
|
47
|
+
::
|
|
48
|
+
|
|
49
|
+
sage: expnums(1, 1)
|
|
50
|
+
[1]
|
|
51
|
+
sage: expnums(0, 1)
|
|
52
|
+
[]
|
|
53
|
+
sage: expnums(-1, 0)
|
|
54
|
+
[]
|
|
55
|
+
|
|
56
|
+
AUTHORS:
|
|
57
|
+
|
|
58
|
+
- Nick Alexander
|
|
59
|
+
"""
|
|
60
|
+
if n < 1:
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
cdef Integer z
|
|
64
|
+
if n == 1:
|
|
65
|
+
z = Integer.__new__(Integer)
|
|
66
|
+
mpz_set_si(z.value, 1)
|
|
67
|
+
return [z]
|
|
68
|
+
|
|
69
|
+
n = n - 1
|
|
70
|
+
|
|
71
|
+
r = []
|
|
72
|
+
z = Integer.__new__(Integer)
|
|
73
|
+
mpz_set_si(z.value, 1)
|
|
74
|
+
r.append(z)
|
|
75
|
+
|
|
76
|
+
z = Integer.__new__(Integer)
|
|
77
|
+
mpz_set_si(z.value, aa)
|
|
78
|
+
r.append(z)
|
|
79
|
+
|
|
80
|
+
cdef mpz_t *bell
|
|
81
|
+
bell = <mpz_t *>check_allocarray(n + 1, sizeof(mpz_t))
|
|
82
|
+
cdef mpz_t a
|
|
83
|
+
mpz_init_set_si(a, aa)
|
|
84
|
+
mpz_init_set_si(bell[1], aa)
|
|
85
|
+
cdef int i
|
|
86
|
+
cdef int k
|
|
87
|
+
for i in range(1, n):
|
|
88
|
+
mpz_init(bell[i+1])
|
|
89
|
+
mpz_mul(bell[i+1], a, bell[1])
|
|
90
|
+
for k in range(i):
|
|
91
|
+
mpz_add(bell[i-k], bell[i-k], bell[i-k+1])
|
|
92
|
+
|
|
93
|
+
z = Integer.__new__(Integer)
|
|
94
|
+
mpz_set(z.value, bell[1])
|
|
95
|
+
r.append(z)
|
|
96
|
+
|
|
97
|
+
for i in range(1, n + 1):
|
|
98
|
+
mpz_clear(bell[i])
|
|
99
|
+
sig_free(bell)
|
|
100
|
+
|
|
101
|
+
return r
|
|
102
|
+
|
|
103
|
+
# The following code is from GAP 4.4.9.
|
|
104
|
+
###################################################
|
|
105
|
+
# InstallGlobalFunction(Bell,function ( n )
|
|
106
|
+
# local bell, k, i;
|
|
107
|
+
# bell := [ 1 ];
|
|
108
|
+
# for i in [1..n-1] do
|
|
109
|
+
# bell[i+1] := bell[1];
|
|
110
|
+
# for k in [0..i-1] do
|
|
111
|
+
# bell[i-k] := bell[i-k] + bell[i-k+1];
|
|
112
|
+
# od;
|
|
113
|
+
# od;
|
|
114
|
+
# return bell[1];
|
|
115
|
+
# end);
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def expnums2(n, aa):
|
|
119
|
+
r"""
|
|
120
|
+
A vanilla python (but compiled via Cython) implementation of
|
|
121
|
+
expnums.
|
|
122
|
+
|
|
123
|
+
We Compute the first `n` exponential numbers around
|
|
124
|
+
`aa`, starting with the zero-th.
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: from sage.combinat.expnums import expnums2
|
|
129
|
+
sage: expnums2(10, 1)
|
|
130
|
+
[1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147]
|
|
131
|
+
"""
|
|
132
|
+
if n < 1:
|
|
133
|
+
return []
|
|
134
|
+
if n == 1:
|
|
135
|
+
return [Integer(1)]
|
|
136
|
+
|
|
137
|
+
n = n - 1
|
|
138
|
+
r = [Integer(1), Integer(aa)]
|
|
139
|
+
|
|
140
|
+
bell = [Integer(0)] * (n+1)
|
|
141
|
+
a = aa
|
|
142
|
+
bell[1] = aa
|
|
143
|
+
for i in range(1, n):
|
|
144
|
+
bell[i+1] = a * bell[1]
|
|
145
|
+
for k in range(i):
|
|
146
|
+
bell[i-k] = bell[i-k] + bell[i-k+1]
|
|
147
|
+
r.append(bell[1])
|
|
148
|
+
return r
|
|
Binary file
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Brent Yorgey's fast algorithm for integer vector (multiset) partitions
|
|
4
|
+
|
|
5
|
+
ALGORITHM:
|
|
6
|
+
|
|
7
|
+
Brent Yorgey, Generating Multiset Partitions, The Monad Reader, Issue 8,
|
|
8
|
+
September 2007, p. 5.
|
|
9
|
+
|
|
10
|
+
https://wiki.haskell.org/The_Monad.Reader/Previous_issues
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- D\. K\. Sunko (2020-02-19): initial version
|
|
15
|
+
- F\. Chapoton (2020-02-22): conversion to iterators and shorter doctests and
|
|
16
|
+
doc tweaks
|
|
17
|
+
- T\. Scrimshaw (2020-03-06): Cython optimizations and doc tweaks
|
|
18
|
+
"""
|
|
19
|
+
################################################################################
|
|
20
|
+
# Copyright (C) 2020 Denis Sunko <dks@phy.hr> #
|
|
21
|
+
# Copyright (C) 2020 Frédéric Chapoton <chapoton@math.unistra.fr> #
|
|
22
|
+
# Copyright (C) 2020 Travis Scrimshaw <tscrims@gmail.com> #
|
|
23
|
+
# #
|
|
24
|
+
# This program is free software: you can redistribute it and/or modify #
|
|
25
|
+
# it under the terms of the GNU General Public License as published by #
|
|
26
|
+
# the Free Software Foundation, either version 2 of the License, or #
|
|
27
|
+
# (at your option) any later version. The text of the license is found at #
|
|
28
|
+
# https://www.gnu.org/licenses/ #
|
|
29
|
+
################################################################################
|
|
30
|
+
#
|
|
31
|
+
# To understand the code below, consult the ALGORITHM.
|
|
32
|
+
|
|
33
|
+
cdef list vector_halve(list v):
|
|
34
|
+
r"""
|
|
35
|
+
Return the vector halfway (lexicographically) between ``v`` and zero.
|
|
36
|
+
|
|
37
|
+
Internal part of :func:`fast_vector_partitions`.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``v`` -- list of nonnegative integers, understood as a vector
|
|
42
|
+
|
|
43
|
+
OUTPUT:
|
|
44
|
+
|
|
45
|
+
A list, understood as the integer vector halfway down the list of
|
|
46
|
+
lexicographically ordered vectors between ``v`` and zero.
|
|
47
|
+
|
|
48
|
+
EXAMPLES::
|
|
49
|
+
|
|
50
|
+
sage: from sage.combinat.fast_vector_partitions import vector_halve # not tested
|
|
51
|
+
sage: vector_halve([1, 2, 3, 4, 5, 6, 7, 8, 9]) # not tested
|
|
52
|
+
[0, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
53
|
+
sage: vector_halve([2, 4, 6, 8, 5, 6, 7, 8, 9]) # not tested
|
|
54
|
+
[1, 2, 3, 4, 2, 6, 7, 8, 9]
|
|
55
|
+
|
|
56
|
+
.. NOTE::
|
|
57
|
+
|
|
58
|
+
For vectors, ``v = a + b`` implies ``v = b + a``, which means that a
|
|
59
|
+
downward search for such splittings, starting with ``v = v + 0``, need
|
|
60
|
+
only look as far as some "v / 2", given precise meaning here.
|
|
61
|
+
|
|
62
|
+
A similar logic is to stop the search for divisors of ``N`` at
|
|
63
|
+
``sqrt(N)``, halving the exponents in the prime decomposition.
|
|
64
|
+
However, here "v / 2" does not mean halving each coordinate.
|
|
65
|
+
"""
|
|
66
|
+
cdef list result = list(v) # make a copy
|
|
67
|
+
cdef Py_ssize_t i, vv
|
|
68
|
+
for i in range(len(v)):
|
|
69
|
+
vv = <Py_ssize_t> v[i]
|
|
70
|
+
result[i] = vv // 2
|
|
71
|
+
if vv % 2:
|
|
72
|
+
# the less significant part is just copied
|
|
73
|
+
return result
|
|
74
|
+
return result
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def recursive_within_from_to(list m, list s, list e, bint useS, bint useE):
|
|
78
|
+
r"""
|
|
79
|
+
Iterate over a lexicographically ordered list of lists ``v`` satisfying
|
|
80
|
+
``e <= v <= s`` and ``v <|= m`` as vectors.
|
|
81
|
+
|
|
82
|
+
Internal part of :func:`fast_vector_partitions`.
|
|
83
|
+
|
|
84
|
+
INPUT:
|
|
85
|
+
|
|
86
|
+
- ``m`` -- list of nonnegative integers, understood as a vector
|
|
87
|
+
- ``s`` -- list of nonnegative integers, understood as a vector
|
|
88
|
+
- ``e`` -- list of nonnegative integers, understood as a vector
|
|
89
|
+
- ``useS`` -- boolean
|
|
90
|
+
- ``useE`` -- boolean
|
|
91
|
+
|
|
92
|
+
EXAMPLES::
|
|
93
|
+
|
|
94
|
+
sage: from sage.combinat.fast_vector_partitions import recursive_within_from_to
|
|
95
|
+
sage: list(recursive_within_from_to([1, 2, 3],[1, 2, 2],[1, 1, 1],True,True))
|
|
96
|
+
[[1, 2, 2], [1, 2, 1], [1, 2, 0], [1, 1, 3], [1, 1, 2], [1, 1, 1]]
|
|
97
|
+
|
|
98
|
+
.. NOTE::
|
|
99
|
+
|
|
100
|
+
The flags ``useS`` and ``useE`` are used to implement the condition
|
|
101
|
+
efficiently. Because testing it loops over the vector, re-testing
|
|
102
|
+
at each step as the vector is parsed is inefficient: all but the last
|
|
103
|
+
comparison have been done cumulatively already. This code tests
|
|
104
|
+
only for the last one, using the flags to accumulate information
|
|
105
|
+
from previous calls.
|
|
106
|
+
|
|
107
|
+
.. WARNING::
|
|
108
|
+
|
|
109
|
+
Expects to be called with ``s <|= m``.
|
|
110
|
+
|
|
111
|
+
Expects to be called first with ``useS == useE == True``.
|
|
112
|
+
"""
|
|
113
|
+
cdef Py_ssize_t start, end, x
|
|
114
|
+
cdef bint useSS, useEE
|
|
115
|
+
|
|
116
|
+
if useS:
|
|
117
|
+
start = <Py_ssize_t> s[0]
|
|
118
|
+
else:
|
|
119
|
+
start = <Py_ssize_t> m[0]
|
|
120
|
+
|
|
121
|
+
if useE:
|
|
122
|
+
end = <Py_ssize_t> e[0]
|
|
123
|
+
else:
|
|
124
|
+
end = 0
|
|
125
|
+
|
|
126
|
+
if len(m) == 1:
|
|
127
|
+
# We use this style of Cython code for now in order to get this to convert
|
|
128
|
+
# to an optimized pure C for loop. See Cython github issue #532.
|
|
129
|
+
# for x in range(start, end - 1, -1):
|
|
130
|
+
for x from start >= x >= end by 1:
|
|
131
|
+
yield [x] # we know the answer for singletons
|
|
132
|
+
else:
|
|
133
|
+
# We use this style of Cython code for now in order to get this to convert
|
|
134
|
+
# to an optimized pure C for loop. See Cython github issue #532.
|
|
135
|
+
# for x in range(start, end - 1, -1):
|
|
136
|
+
for x from start >= x >= end by 1:
|
|
137
|
+
useSS = useS and x == <Py_ssize_t> s[0]
|
|
138
|
+
useEE = useE and x == <Py_ssize_t> e[0]
|
|
139
|
+
for o in recursive_within_from_to(m[1:], s[1:], e[1:], useSS, useEE):
|
|
140
|
+
yield [x] + o
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def within_from_to(list m, list s, list e):
|
|
144
|
+
r"""
|
|
145
|
+
Iterate over a lexicographically ordered list of lists ``v`` satisfying
|
|
146
|
+
``e <= v <= s`` and ``v <|= m`` as vectors.
|
|
147
|
+
|
|
148
|
+
Internal part of :func:`fast_vector_partitions`.
|
|
149
|
+
|
|
150
|
+
INPUT:
|
|
151
|
+
|
|
152
|
+
- ``m`` -- list of nonnegative integers, understood as a vector
|
|
153
|
+
- ``s`` -- list of nonnegative integers, understood as a vector
|
|
154
|
+
- ``e`` -- list of nonnegative integers, understood as a vector
|
|
155
|
+
|
|
156
|
+
EXAMPLES::
|
|
157
|
+
|
|
158
|
+
sage: from sage.combinat.fast_vector_partitions import within_from_to
|
|
159
|
+
sage: list(within_from_to([1, 2, 3], [1, 2, 2], [1, 1, 1]))
|
|
160
|
+
[[1, 2, 2], [1, 2, 1], [1, 2, 0], [1, 1, 3], [1, 1, 2], [1, 1, 1]]
|
|
161
|
+
|
|
162
|
+
.. NOTE::
|
|
163
|
+
|
|
164
|
+
The input ``s`` will be "clipped" internally if it does not satisfy
|
|
165
|
+
the condition ``s <|= m``.
|
|
166
|
+
|
|
167
|
+
To understand the input check, some line art is helpful. Assume
|
|
168
|
+
that ``(a,b)`` are the two least significant coordinates of some
|
|
169
|
+
vector. Say::
|
|
170
|
+
|
|
171
|
+
e = (2,3), s = (7,6), m = (9,8).
|
|
172
|
+
|
|
173
|
+
In the figure, these values are denoted by ``E``, ``S``, and ``M``,
|
|
174
|
+
while the letter ``X`` stands for all other allowed values of
|
|
175
|
+
``v = (a,b)``::
|
|
176
|
+
|
|
177
|
+
b ^
|
|
178
|
+
|
|
|
179
|
+
8 --------X---X---X---X---X-----------M
|
|
180
|
+
| |
|
|
181
|
+
7 - X X X X X |
|
|
182
|
+
| |
|
|
183
|
+
6 - X X X X X S |
|
|
184
|
+
| |
|
|
185
|
+
5 - X X X X X X |
|
|
186
|
+
| |
|
|
187
|
+
4 - X X X X X X |
|
|
188
|
+
| |
|
|
189
|
+
3 - E X X X X X |
|
|
190
|
+
| |
|
|
191
|
+
2 - X X X X X |
|
|
192
|
+
| |
|
|
193
|
+
1 - X X X X X |
|
|
194
|
+
| |
|
|
195
|
+
0 ----|---|---X---X---X---X---X---|---|--->
|
|
196
|
+
0 1 2 3 4 5 6 7 8 9 a
|
|
197
|
+
|
|
198
|
+
If ``S`` moves horizontally, the full-height columns fill the box in
|
|
199
|
+
until ``S`` reaches ``M``, at which point it remains the limit in the
|
|
200
|
+
b-direction as it moves out of the box, while M takes over as the
|
|
201
|
+
limit in the a-direction, so the ``M``-column remains filled only up to
|
|
202
|
+
``S``, no matter how much ``S`` moves further to the right.
|
|
203
|
+
|
|
204
|
+
If ``S`` moves vertically, its column will be filled to the top of the
|
|
205
|
+
box, but it remains the relevant limit in the a-direction, while ``M``
|
|
206
|
+
takes over in the b-direction as ``S`` goes out of the box upwards.
|
|
207
|
+
|
|
208
|
+
Both behaviors are captured by using the smaller coordinate of ``S``
|
|
209
|
+
and ``M``, whenever ``S`` is outside the box defined by M. The input
|
|
210
|
+
will be "clipped" accordingly in that case.
|
|
211
|
+
|
|
212
|
+
.. WARNING::
|
|
213
|
+
|
|
214
|
+
The "clipping" behavior is transparent to the user, but may be
|
|
215
|
+
puzzling when comparing outputs with the function
|
|
216
|
+
:func:`recursive_within_from_to` which has no input protection.
|
|
217
|
+
"""
|
|
218
|
+
cdef list ss = s
|
|
219
|
+
# if s is not in the box defined by m, we must clip:
|
|
220
|
+
cdef Py_ssize_t i, j
|
|
221
|
+
for i in range(len(m)): # should have the same length as s
|
|
222
|
+
if s[i] > m[i]:
|
|
223
|
+
ss = list(ss) # make a copy
|
|
224
|
+
ss[i] = m[i]
|
|
225
|
+
for j in range(i+1, len(m)):
|
|
226
|
+
if ss[j] > m[j]:
|
|
227
|
+
ss[j] = m[j]
|
|
228
|
+
break
|
|
229
|
+
if e > ss:
|
|
230
|
+
return
|
|
231
|
+
yield from recursive_within_from_to(m, ss, e, True, True)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
cdef inline list vector_sub(list a, list b):
|
|
235
|
+
"""
|
|
236
|
+
Return ``a - b`` considered as vectors.
|
|
237
|
+
|
|
238
|
+
This assumes ``len(b) >= len(a)``.
|
|
239
|
+
"""
|
|
240
|
+
cdef Py_ssize_t i
|
|
241
|
+
cdef list ret = []
|
|
242
|
+
for i in range(len(a)):
|
|
243
|
+
ret.append((<Py_ssize_t> a[i]) - (<Py_ssize_t> b[i]))
|
|
244
|
+
return ret
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def recursive_vector_partitions(list v, list vL):
|
|
248
|
+
r"""
|
|
249
|
+
Iterate over a lexicographically ordered list of lists, each list
|
|
250
|
+
representing a vector partition of ``v``, such that no part of any
|
|
251
|
+
partition is lexicographically smaller than ``vL``.
|
|
252
|
+
|
|
253
|
+
Internal part of :func:`fast_vector_partitions`.
|
|
254
|
+
|
|
255
|
+
INPUT:
|
|
256
|
+
|
|
257
|
+
- ``v`` -- list of nonnegative integers, understood as a vector
|
|
258
|
+
- ``vL`` -- list of nonnegative integers, understood as a vector
|
|
259
|
+
|
|
260
|
+
EXAMPLES::
|
|
261
|
+
|
|
262
|
+
sage: from sage.combinat.fast_vector_partitions import recursive_vector_partitions
|
|
263
|
+
sage: list(recursive_vector_partitions([2, 2, 2],[1, 1, 1]))
|
|
264
|
+
[[[2, 2, 2]], [[1, 1, 1], [1, 1, 1]]]
|
|
265
|
+
sage: list(recursive_vector_partitions([2, 2, 2],[1, 1, 0]))
|
|
266
|
+
[[[2, 2, 2]], [[1, 1, 1], [1, 1, 1]], [[1, 1, 0], [1, 1, 2]]]
|
|
267
|
+
sage: list(recursive_vector_partitions([2, 2, 2],[1, 0, 1]))
|
|
268
|
+
[[[2, 2, 2]],
|
|
269
|
+
[[1, 1, 1], [1, 1, 1]],
|
|
270
|
+
[[1, 1, 0], [1, 1, 2]],
|
|
271
|
+
[[1, 0, 2], [1, 2, 0]],
|
|
272
|
+
[[1, 0, 1], [1, 2, 1]]]
|
|
273
|
+
"""
|
|
274
|
+
cdef list v_minus_vv, pp, vv
|
|
275
|
+
yield [v]
|
|
276
|
+
for vv in within_from_to(v, vector_halve(v), vL):
|
|
277
|
+
v_minus_vv = vector_sub(v, vv)
|
|
278
|
+
for pp in recursive_vector_partitions(v_minus_vv, vv):
|
|
279
|
+
yield [vv] + pp
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def fast_vector_partitions(v, min_vals=None):
|
|
283
|
+
r"""
|
|
284
|
+
Brent Yorgey's fast algorithm for integer vector (multiset) partitions.
|
|
285
|
+
|
|
286
|
+
INPUT:
|
|
287
|
+
|
|
288
|
+
- ``v`` -- list of nonnegative integers, understood as the vector
|
|
289
|
+
to be partitioned
|
|
290
|
+
|
|
291
|
+
- ``min_vals`` -- (optional) list of nonnegative integers, of same
|
|
292
|
+
length as ``v``
|
|
293
|
+
|
|
294
|
+
OUTPUT: list of lists, each representing a vector partition of ``v``
|
|
295
|
+
|
|
296
|
+
If ``min_vals`` is given, only partitions with parts ``p >= min_vals`` in
|
|
297
|
+
the lexicographic ordering will appear.
|
|
298
|
+
|
|
299
|
+
If ``min_vals`` is given and ``len(min_vals) != len(v)``, an error
|
|
300
|
+
is raised.
|
|
301
|
+
|
|
302
|
+
EXAMPLES:
|
|
303
|
+
|
|
304
|
+
The older the computer, the more impressive the comparison::
|
|
305
|
+
|
|
306
|
+
sage: from sage.combinat.fast_vector_partitions import fast_vector_partitions
|
|
307
|
+
sage: fastvparts = list(fast_vector_partitions([3, 3, 3]))
|
|
308
|
+
sage: vparts = list(VectorPartitions([3, 3, 3]))
|
|
309
|
+
sage: vparts == fastvparts[::-1]
|
|
310
|
+
True
|
|
311
|
+
sage: len(fastvparts)
|
|
312
|
+
686
|
|
313
|
+
sage: list(fast_vector_partitions([1, 2, 3], min_vals=[0, 1, 1]))
|
|
314
|
+
[[[1, 2, 3]],
|
|
315
|
+
[[0, 2, 3], [1, 0, 0]],
|
|
316
|
+
[[0, 2, 2], [1, 0, 1]],
|
|
317
|
+
[[0, 2, 1], [1, 0, 2]],
|
|
318
|
+
[[0, 2, 0], [1, 0, 3]],
|
|
319
|
+
[[0, 1, 3], [1, 1, 0]],
|
|
320
|
+
[[0, 1, 2], [1, 1, 1]],
|
|
321
|
+
[[0, 1, 1], [1, 1, 2]],
|
|
322
|
+
[[0, 1, 1], [0, 1, 2], [1, 0, 0]],
|
|
323
|
+
[[0, 1, 1], [0, 1, 1], [1, 0, 1]]]
|
|
324
|
+
sage: L1 = list(fast_vector_partitions([5, 7, 6], min_vals=[1, 3, 2]))
|
|
325
|
+
sage: L1 == list(VectorPartitions([5, 7, 6], min=[1, 3, 2]))[::-1]
|
|
326
|
+
True
|
|
327
|
+
|
|
328
|
+
.. NOTE::
|
|
329
|
+
|
|
330
|
+
The partitions are returned as an iterator.
|
|
331
|
+
|
|
332
|
+
In this documentation, ``a <|= b`` means ``a[i] <= b[i]`` for all ``i``
|
|
333
|
+
(notation following B. Yorgey's paper). It is the monomial partial
|
|
334
|
+
ordering in Dickson's lemma: ``a <|= b`` iff ``x^a`` divides ``x^b`` as
|
|
335
|
+
monomials.
|
|
336
|
+
|
|
337
|
+
.. WARNING::
|
|
338
|
+
|
|
339
|
+
The ordering of the partitions is reversed with respect to the output of
|
|
340
|
+
Sage class :class:`~sage.combinat.vector_partition.VectorPartitions`.
|
|
341
|
+
"""
|
|
342
|
+
if min_vals is None:
|
|
343
|
+
min_vals = (len(v) - 1) * [0] + [1] # lexicographically smallest vector > 0
|
|
344
|
+
if len(v) != len(min_vals):
|
|
345
|
+
raise ValueError("the length of v and min_vals must be equal")
|
|
346
|
+
return recursive_vector_partitions(list(v), list(min_vals))
|