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,148 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Examples of combinatorial species
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
#
|
|
10
|
+
# This code is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# The full text of the GPL is available at:
|
|
16
|
+
#
|
|
17
|
+
# https://www.gnu.org/licenses/
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
|
|
20
|
+
from .set_species import SetSpecies
|
|
21
|
+
from .partition_species import PartitionSpecies
|
|
22
|
+
from .subset_species import SubsetSpecies
|
|
23
|
+
from .recursive_species import CombinatorialSpecies
|
|
24
|
+
from .characteristic_species import CharacteristicSpecies, SingletonSpecies, EmptySetSpecies
|
|
25
|
+
from .cycle_species import CycleSpecies
|
|
26
|
+
from .linear_order_species import LinearOrderSpecies
|
|
27
|
+
from .permutation_species import PermutationSpecies
|
|
28
|
+
from .empty_species import EmptySpecies
|
|
29
|
+
from .sum_species import SumSpecies
|
|
30
|
+
from .product_species import ProductSpecies
|
|
31
|
+
from .composition_species import CompositionSpecies
|
|
32
|
+
from .functorial_composition_species import FunctorialCompositionSpecies
|
|
33
|
+
|
|
34
|
+
from sage.misc.cachefunc import cached_function
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@cached_function
|
|
38
|
+
def SimpleGraphSpecies():
|
|
39
|
+
"""
|
|
40
|
+
Return the species of simple graphs.
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: S = species.SimpleGraphSpecies()
|
|
45
|
+
sage: S.generating_series().counts(10)
|
|
46
|
+
[1, 1, 2, 8, 64, 1024, 32768, 2097152, 268435456, 68719476736]
|
|
47
|
+
sage: S.cycle_index_series()[:5] # needs sage.libs.pari sage.modules
|
|
48
|
+
[p[],
|
|
49
|
+
p[1],
|
|
50
|
+
p[1, 1] + p[2],
|
|
51
|
+
4/3*p[1, 1, 1] + 2*p[2, 1] + 2/3*p[3],
|
|
52
|
+
8/3*p[1, 1, 1, 1] + 4*p[2, 1, 1] + 2*p[2, 2] + 4/3*p[3, 1] + p[4]]
|
|
53
|
+
sage: S.isotype_generating_series()[:6] # needs sage.libs.pari sage.modules
|
|
54
|
+
[1, 1, 2, 4, 11, 34]
|
|
55
|
+
|
|
56
|
+
TESTS::
|
|
57
|
+
|
|
58
|
+
sage: seq = S.isotype_generating_series().counts(6)[1:] # needs sage.modules
|
|
59
|
+
sage: oeis(seq)[0] # optional - internet # needs sage.modules
|
|
60
|
+
A000088: ...
|
|
61
|
+
|
|
62
|
+
::
|
|
63
|
+
|
|
64
|
+
sage: seq = S.generating_series().counts(10)[1:] # needs sage.modules
|
|
65
|
+
sage: oeis(seq)[0] # optional - internet # needs sage.modules
|
|
66
|
+
A006125: a(n) = 2^(n*(n-1)/2).
|
|
67
|
+
"""
|
|
68
|
+
E = SetSpecies()
|
|
69
|
+
E2 = SetSpecies(size=2)
|
|
70
|
+
WP = SubsetSpecies()
|
|
71
|
+
P2 = E2 * E
|
|
72
|
+
return WP.functorial_composition(P2)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@cached_function
|
|
76
|
+
def BinaryTreeSpecies():
|
|
77
|
+
r"""
|
|
78
|
+
Return the species of binary trees on `n` leaves.
|
|
79
|
+
|
|
80
|
+
The species of binary trees `B` is defined by `B = X + B \cdot B`,
|
|
81
|
+
where `X` is the singleton species.
|
|
82
|
+
|
|
83
|
+
EXAMPLES::
|
|
84
|
+
|
|
85
|
+
sage: B = species.BinaryTreeSpecies()
|
|
86
|
+
sage: B.generating_series().counts(10)
|
|
87
|
+
[0, 1, 2, 12, 120, 1680, 30240, 665280, 17297280, 518918400]
|
|
88
|
+
sage: B.isotype_generating_series().counts(10)
|
|
89
|
+
[0, 1, 1, 2, 5, 14, 42, 132, 429, 1430]
|
|
90
|
+
sage: B._check()
|
|
91
|
+
True
|
|
92
|
+
|
|
93
|
+
::
|
|
94
|
+
|
|
95
|
+
sage: B = species.BinaryTreeSpecies()
|
|
96
|
+
sage: a = B.structures([1,2,3,4,5])[187]; a
|
|
97
|
+
2*((5*3)*(4*1))
|
|
98
|
+
sage: a.automorphism_group() # needs sage.groups
|
|
99
|
+
Permutation Group with generators [()]
|
|
100
|
+
|
|
101
|
+
TESTS::
|
|
102
|
+
|
|
103
|
+
sage: seq = B.isotype_generating_series().counts(10)[1:]
|
|
104
|
+
sage: oeis(seq)[0] # optional -- internet
|
|
105
|
+
A000108: Catalan numbers: ...
|
|
106
|
+
"""
|
|
107
|
+
B = CombinatorialSpecies(min=1)
|
|
108
|
+
X = SingletonSpecies()
|
|
109
|
+
B.define(X + B * B)
|
|
110
|
+
return B
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@cached_function
|
|
114
|
+
def BinaryForestSpecies():
|
|
115
|
+
"""
|
|
116
|
+
Return the species of binary forests.
|
|
117
|
+
|
|
118
|
+
Binary forests are defined as sets of binary trees.
|
|
119
|
+
|
|
120
|
+
EXAMPLES::
|
|
121
|
+
|
|
122
|
+
sage: F = species.BinaryForestSpecies()
|
|
123
|
+
sage: F.generating_series().counts(10)
|
|
124
|
+
[1, 1, 3, 19, 193, 2721, 49171, 1084483, 28245729, 848456353]
|
|
125
|
+
sage: F.isotype_generating_series().counts(10) # needs sage.modules
|
|
126
|
+
[1, 1, 2, 4, 10, 26, 77, 235, 758, 2504]
|
|
127
|
+
sage: F.cycle_index_series()[:7] # needs sage.modules
|
|
128
|
+
[p[],
|
|
129
|
+
p[1],
|
|
130
|
+
3/2*p[1, 1] + 1/2*p[2],
|
|
131
|
+
19/6*p[1, 1, 1] + 1/2*p[2, 1] + 1/3*p[3],
|
|
132
|
+
193/24*p[1, 1, 1, 1] + 3/4*p[2, 1, 1] + 5/8*p[2, 2] + 1/3*p[3, 1] + 1/4*p[4],
|
|
133
|
+
907/40*p[1, 1, 1, 1, 1] + 19/12*p[2, 1, 1, 1] + 5/8*p[2, 2, 1] + 1/2*p[3, 1, 1] + 1/6*p[3, 2] + 1/4*p[4, 1] + 1/5*p[5],
|
|
134
|
+
49171/720*p[1, 1, 1, 1, 1, 1] + 193/48*p[2, 1, 1, 1, 1] + 15/16*p[2, 2, 1, 1] + 61/48*p[2, 2, 2] + 19/18*p[3, 1, 1, 1] + 1/6*p[3, 2, 1] + 7/18*p[3, 3] + 3/8*p[4, 1, 1] + 1/8*p[4, 2] + 1/5*p[5, 1] + 1/6*p[6]]
|
|
135
|
+
|
|
136
|
+
TESTS::
|
|
137
|
+
|
|
138
|
+
sage: seq = F.isotype_generating_series().counts(10)[1:] # needs sage.modules
|
|
139
|
+
sage: oeis(seq)[0] # optional - internet # needs sage.modules
|
|
140
|
+
A052854: Number of forests of ordered trees on n total nodes.
|
|
141
|
+
"""
|
|
142
|
+
B = BinaryTreeSpecies()
|
|
143
|
+
S = SetSpecies()
|
|
144
|
+
F = S(B)
|
|
145
|
+
return F
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
del cached_function # so it doesn't get picked up by tab completion
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Linear-order species
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
#
|
|
10
|
+
# This code is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# The full text of the GPL is available at:
|
|
16
|
+
#
|
|
17
|
+
# http://www.gnu.org/licenses/
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
from .species import GenericCombinatorialSpecies
|
|
20
|
+
from .structure import GenericSpeciesStructure
|
|
21
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
22
|
+
from sage.combinat.species.misc import accept_size
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LinearOrderSpeciesStructure(GenericSpeciesStructure):
|
|
26
|
+
def canonical_label(self):
|
|
27
|
+
"""
|
|
28
|
+
EXAMPLES::
|
|
29
|
+
|
|
30
|
+
sage: P = species.LinearOrderSpecies()
|
|
31
|
+
sage: s = P.structures(["a", "b", "c"]).random_element()
|
|
32
|
+
sage: s.canonical_label()
|
|
33
|
+
['a', 'b', 'c']
|
|
34
|
+
"""
|
|
35
|
+
return self.__class__(self.parent(), self._labels, range(1, len(self._labels)+1))
|
|
36
|
+
|
|
37
|
+
def transport(self, perm):
|
|
38
|
+
"""
|
|
39
|
+
Return the transport of this structure along the permutation
|
|
40
|
+
perm.
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: F = species.LinearOrderSpecies()
|
|
45
|
+
sage: a = F.structures(["a", "b", "c"])[0]; a
|
|
46
|
+
['a', 'b', 'c']
|
|
47
|
+
sage: p = PermutationGroupElement((1,2)) # needs sage.groups
|
|
48
|
+
sage: a.transport(p) # needs sage.groups
|
|
49
|
+
['b', 'a', 'c']
|
|
50
|
+
"""
|
|
51
|
+
return LinearOrderSpeciesStructure(self.parent(), self._labels, [perm(i) for i in self._list])
|
|
52
|
+
|
|
53
|
+
def automorphism_group(self):
|
|
54
|
+
"""
|
|
55
|
+
Return the group of permutations whose action on this structure
|
|
56
|
+
leave it fixed. For the species of linear orders, there is no
|
|
57
|
+
non-trivial automorphism.
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: F = species.LinearOrderSpecies()
|
|
62
|
+
sage: a = F.structures(["a", "b", "c"])[0]; a
|
|
63
|
+
['a', 'b', 'c']
|
|
64
|
+
sage: a.automorphism_group() # needs sage.groups
|
|
65
|
+
Symmetric group of order 1! as a permutation group
|
|
66
|
+
"""
|
|
67
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
68
|
+
return SymmetricGroup(1)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class LinearOrderSpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
72
|
+
@staticmethod
|
|
73
|
+
@accept_size
|
|
74
|
+
def __classcall__(cls, *args, **kwds):
|
|
75
|
+
r"""
|
|
76
|
+
EXAMPLES::
|
|
77
|
+
|
|
78
|
+
sage: L = species.LinearOrderSpecies(); L
|
|
79
|
+
Linear order species
|
|
80
|
+
"""
|
|
81
|
+
return super().__classcall__(cls, *args, **kwds)
|
|
82
|
+
|
|
83
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
84
|
+
"""
|
|
85
|
+
Return the species of linear orders.
|
|
86
|
+
|
|
87
|
+
EXAMPLES::
|
|
88
|
+
|
|
89
|
+
sage: L = species.LinearOrderSpecies()
|
|
90
|
+
sage: L.generating_series()[0:5]
|
|
91
|
+
[1, 1, 1, 1, 1]
|
|
92
|
+
|
|
93
|
+
sage: L = species.LinearOrderSpecies()
|
|
94
|
+
sage: L._check()
|
|
95
|
+
True
|
|
96
|
+
sage: L == loads(dumps(L))
|
|
97
|
+
True
|
|
98
|
+
"""
|
|
99
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=max, weight=None)
|
|
100
|
+
self._name = "Linear order species"
|
|
101
|
+
|
|
102
|
+
_default_structure_class = LinearOrderSpeciesStructure
|
|
103
|
+
|
|
104
|
+
def _structures(self, structure_class, labels):
|
|
105
|
+
"""
|
|
106
|
+
EXAMPLES::
|
|
107
|
+
|
|
108
|
+
sage: L = species.LinearOrderSpecies()
|
|
109
|
+
sage: L.structures([1,2,3]).list()
|
|
110
|
+
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
|
|
111
|
+
"""
|
|
112
|
+
from sage.combinat.permutation import Permutations
|
|
113
|
+
for p in Permutations(len(labels)):
|
|
114
|
+
yield structure_class(self, labels, p._list)
|
|
115
|
+
|
|
116
|
+
def _isotypes(self, structure_class, labels):
|
|
117
|
+
"""
|
|
118
|
+
EXAMPLES::
|
|
119
|
+
|
|
120
|
+
sage: L = species.LinearOrderSpecies()
|
|
121
|
+
sage: L.isotypes([1,2,3]).list()
|
|
122
|
+
[[1, 2, 3]]
|
|
123
|
+
"""
|
|
124
|
+
yield structure_class(self, labels, range(1, len(labels)+1))
|
|
125
|
+
|
|
126
|
+
def _gs_list(self, base_ring, n):
|
|
127
|
+
r"""
|
|
128
|
+
The generating series for the species of linear orders is
|
|
129
|
+
`\frac{1}{1-x}`.
|
|
130
|
+
|
|
131
|
+
EXAMPLES::
|
|
132
|
+
|
|
133
|
+
sage: L = species.LinearOrderSpecies()
|
|
134
|
+
sage: g = L.generating_series()
|
|
135
|
+
sage: g[0:10]
|
|
136
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
137
|
+
"""
|
|
138
|
+
return base_ring.one()
|
|
139
|
+
|
|
140
|
+
def _itgs_list(self, base_ring, n):
|
|
141
|
+
r"""
|
|
142
|
+
The isomorphism type generating series is given by
|
|
143
|
+
`\frac{1}{1-x}`.
|
|
144
|
+
|
|
145
|
+
EXAMPLES::
|
|
146
|
+
|
|
147
|
+
sage: L = species.LinearOrderSpecies()
|
|
148
|
+
sage: g = L.isotype_generating_series()
|
|
149
|
+
sage: g[0:10]
|
|
150
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
151
|
+
"""
|
|
152
|
+
return base_ring.one()
|
|
153
|
+
|
|
154
|
+
def _cis_callable(self, base_ring, n):
|
|
155
|
+
"""
|
|
156
|
+
EXAMPLES::
|
|
157
|
+
|
|
158
|
+
sage: L = species.LinearOrderSpecies()
|
|
159
|
+
sage: g = L.cycle_index_series() # needs sage.modules
|
|
160
|
+
sage: g[0:5] # needs sage.modules
|
|
161
|
+
[p[], p[1], p[1, 1], p[1, 1, 1], p[1, 1, 1, 1]]
|
|
162
|
+
"""
|
|
163
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
164
|
+
p = SymmetricFunctions(base_ring).power()
|
|
165
|
+
return p([1]*n)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
#Backward compatibility
|
|
169
|
+
LinearOrderSpecies_class = LinearOrderSpecies
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.groups
|
|
3
|
+
"""
|
|
4
|
+
Miscellaneous functions
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
#
|
|
11
|
+
# This code is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# The full text of the GPL is available at:
|
|
17
|
+
#
|
|
18
|
+
# http://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
|
|
21
|
+
from functools import wraps
|
|
22
|
+
|
|
23
|
+
from sage.misc.misc_c import prod
|
|
24
|
+
from sage.misc.lazy_import import lazy_import
|
|
25
|
+
|
|
26
|
+
lazy_import('sage.groups.perm_gps.permgroup', ['PermutationGroup', 'PermutationGroup_generic'])
|
|
27
|
+
lazy_import('sage.groups.perm_gps.constructor', 'PermutationGroupElement')
|
|
28
|
+
lazy_import('sage.groups.perm_gps.permgroup_named', 'SymmetricGroup')
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def change_support(perm, support, change_perm=None):
|
|
32
|
+
"""
|
|
33
|
+
Changes the support of a permutation defined on [1, ..., n] to
|
|
34
|
+
support.
|
|
35
|
+
|
|
36
|
+
EXAMPLES::
|
|
37
|
+
|
|
38
|
+
sage: from sage.combinat.species.misc import change_support
|
|
39
|
+
sage: p = PermutationGroupElement((1,2,3)); p
|
|
40
|
+
(1,2,3)
|
|
41
|
+
sage: change_support(p, [3,4,5])
|
|
42
|
+
(3,4,5)
|
|
43
|
+
"""
|
|
44
|
+
if change_perm is None:
|
|
45
|
+
change_perm = prod([PermutationGroupElement((i+1, support[i]))
|
|
46
|
+
for i in range(len(support))
|
|
47
|
+
if i+1 != support[i]],
|
|
48
|
+
PermutationGroupElement([], SymmetricGroup(support)))
|
|
49
|
+
|
|
50
|
+
if isinstance(perm, PermutationGroup_generic):
|
|
51
|
+
return PermutationGroup([change_support(g, support, change_perm) for g in perm.gens()])
|
|
52
|
+
|
|
53
|
+
return change_perm*perm*~change_perm
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def accept_size(f):
|
|
57
|
+
"""
|
|
58
|
+
The purpose of this decorator is to change calls like
|
|
59
|
+
species.SetSpecies(size=1) to species.SetSpecies(min=1, max=2).
|
|
60
|
+
This is to make caching species easier and to restrict the number
|
|
61
|
+
of parameters that the lower level code needs to know about.
|
|
62
|
+
|
|
63
|
+
EXAMPLES::
|
|
64
|
+
|
|
65
|
+
sage: from sage.combinat.species.misc import accept_size
|
|
66
|
+
sage: def f(*args, **kwds):
|
|
67
|
+
....: print("{} {}".format(args, sorted(kwds.items())))
|
|
68
|
+
sage: f = accept_size(f)
|
|
69
|
+
sage: f(min=1)
|
|
70
|
+
() [('min', 1)]
|
|
71
|
+
sage: f(size=2)
|
|
72
|
+
() [('max', 3), ('min', 2)]
|
|
73
|
+
"""
|
|
74
|
+
@wraps(f)
|
|
75
|
+
def new_func(*args, **kwds):
|
|
76
|
+
if 'size' in kwds:
|
|
77
|
+
if 'min' in kwds or 'max' in kwds:
|
|
78
|
+
raise ValueError("cannot specify both size and (min or max)")
|
|
79
|
+
kwds['min'] = kwds['size']
|
|
80
|
+
kwds['max'] = kwds['size'] + 1
|
|
81
|
+
del kwds['size']
|
|
82
|
+
return f(*args, **kwds)
|
|
83
|
+
return new_func
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.libs.flint
|
|
3
|
+
"""
|
|
4
|
+
Partition species
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
8
|
+
#
|
|
9
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
10
|
+
#
|
|
11
|
+
# This code is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# The full text of the GPL is available at:
|
|
17
|
+
#
|
|
18
|
+
# http://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
|
|
21
|
+
from .species import GenericCombinatorialSpecies
|
|
22
|
+
from sage.arith.misc import factorial
|
|
23
|
+
from .subset_species import SubsetSpeciesStructure
|
|
24
|
+
from .set_species import SetSpecies
|
|
25
|
+
from .structure import GenericSpeciesStructure
|
|
26
|
+
from sage.combinat.species.misc import accept_size
|
|
27
|
+
from functools import reduce
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class PartitionSpeciesStructure(GenericSpeciesStructure):
|
|
31
|
+
def __init__(self, parent, labels, list):
|
|
32
|
+
"""
|
|
33
|
+
EXAMPLES::
|
|
34
|
+
|
|
35
|
+
sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure
|
|
36
|
+
sage: P = species.PartitionSpecies()
|
|
37
|
+
sage: s = PartitionSpeciesStructure(P, ['a','b','c'], [[1,2],[3]]); s
|
|
38
|
+
{{'a', 'b'}, {'c'}}
|
|
39
|
+
sage: s == loads(dumps(s))
|
|
40
|
+
True
|
|
41
|
+
"""
|
|
42
|
+
list = [SubsetSpeciesStructure(parent, labels, block) if not isinstance(block, SubsetSpeciesStructure) else block for block in list]
|
|
43
|
+
list.sort(key=lambda block:(-len(block), block))
|
|
44
|
+
GenericSpeciesStructure.__init__(self, parent, labels, list)
|
|
45
|
+
|
|
46
|
+
def __repr__(self):
|
|
47
|
+
"""
|
|
48
|
+
EXAMPLES::
|
|
49
|
+
|
|
50
|
+
sage: S = species.PartitionSpecies()
|
|
51
|
+
sage: a = S.structures(["a","b","c"])[0]; a
|
|
52
|
+
{{'a', 'b', 'c'}}
|
|
53
|
+
"""
|
|
54
|
+
s = GenericSpeciesStructure.__repr__(self)
|
|
55
|
+
return "{"+s[1:-1]+"}"
|
|
56
|
+
|
|
57
|
+
def canonical_label(self):
|
|
58
|
+
"""
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: P = species.PartitionSpecies()
|
|
62
|
+
sage: S = P.structures(["a", "b", "c"])
|
|
63
|
+
sage: [s.canonical_label() for s in S]
|
|
64
|
+
[{{'a', 'b', 'c'}},
|
|
65
|
+
{{'a', 'b'}, {'c'}},
|
|
66
|
+
{{'a', 'b'}, {'c'}},
|
|
67
|
+
{{'a', 'b'}, {'c'}},
|
|
68
|
+
{{'a'}, {'b'}, {'c'}}]
|
|
69
|
+
"""
|
|
70
|
+
P = self.parent()
|
|
71
|
+
p = [len(block) for block in self._list]
|
|
72
|
+
return P._canonical_rep_from_partition(self.__class__, self._labels, p)
|
|
73
|
+
|
|
74
|
+
def transport(self, perm):
|
|
75
|
+
"""
|
|
76
|
+
Return the transport of this set partition along the permutation
|
|
77
|
+
perm. For set partitions, this is the direct product of the
|
|
78
|
+
automorphism groups for each of the blocks.
|
|
79
|
+
|
|
80
|
+
EXAMPLES::
|
|
81
|
+
|
|
82
|
+
sage: p = PermutationGroupElement((2,3))
|
|
83
|
+
sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure
|
|
84
|
+
sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a
|
|
85
|
+
{{2, 3}, {4}}
|
|
86
|
+
sage: a.transport(p)
|
|
87
|
+
{{2, 4}, {3}}
|
|
88
|
+
"""
|
|
89
|
+
l = [block.transport(perm)._list for block in self._list]
|
|
90
|
+
l.sort(key=lambda block:(-len(block), block))
|
|
91
|
+
return PartitionSpeciesStructure(self.parent(), self._labels, l)
|
|
92
|
+
|
|
93
|
+
def automorphism_group(self):
|
|
94
|
+
"""
|
|
95
|
+
Return the group of permutations whose action on this set
|
|
96
|
+
partition leave it fixed.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: p = PermutationGroupElement((2,3))
|
|
101
|
+
sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure
|
|
102
|
+
sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a
|
|
103
|
+
{{2, 3}, {4}}
|
|
104
|
+
sage: a.automorphism_group()
|
|
105
|
+
Permutation Group with generators [(1,2)]
|
|
106
|
+
"""
|
|
107
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
108
|
+
return reduce(lambda a,b: a.direct_product(b, maps=False),
|
|
109
|
+
[SymmetricGroup(block._list) for block in self._list])
|
|
110
|
+
|
|
111
|
+
def change_labels(self, labels):
|
|
112
|
+
"""
|
|
113
|
+
Return a relabelled structure.
|
|
114
|
+
|
|
115
|
+
INPUT:
|
|
116
|
+
|
|
117
|
+
- ``labels`` -- list of labels
|
|
118
|
+
|
|
119
|
+
OUTPUT:
|
|
120
|
+
|
|
121
|
+
A structure with the `i`-th label of ``self`` replaced with the `i`-th
|
|
122
|
+
label of the list.
|
|
123
|
+
|
|
124
|
+
EXAMPLES::
|
|
125
|
+
|
|
126
|
+
sage: p = PermutationGroupElement((2,3))
|
|
127
|
+
sage: from sage.combinat.species.partition_species import PartitionSpeciesStructure
|
|
128
|
+
sage: a = PartitionSpeciesStructure(None, [2,3,4], [[1,2],[3]]); a
|
|
129
|
+
{{2, 3}, {4}}
|
|
130
|
+
sage: a.change_labels([1,2,3])
|
|
131
|
+
{{1, 2}, {3}}
|
|
132
|
+
"""
|
|
133
|
+
return PartitionSpeciesStructure(self.parent(), labels, [block.change_labels(labels) for block in self._list])
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class PartitionSpecies(GenericCombinatorialSpecies):
|
|
137
|
+
@staticmethod
|
|
138
|
+
@accept_size
|
|
139
|
+
def __classcall__(cls, *args, **kwds):
|
|
140
|
+
"""
|
|
141
|
+
EXAMPLES::
|
|
142
|
+
|
|
143
|
+
sage: P = species.PartitionSpecies(); P
|
|
144
|
+
Partition species
|
|
145
|
+
"""
|
|
146
|
+
return super().__classcall__(cls, *args, **kwds)
|
|
147
|
+
|
|
148
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
149
|
+
"""
|
|
150
|
+
Return the species of partitions.
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: P = species.PartitionSpecies()
|
|
155
|
+
sage: P.generating_series()[0:5]
|
|
156
|
+
[1, 1, 1, 5/6, 5/8]
|
|
157
|
+
sage: P.isotype_generating_series()[0:5]
|
|
158
|
+
[1, 1, 2, 3, 5]
|
|
159
|
+
|
|
160
|
+
sage: P = species.PartitionSpecies()
|
|
161
|
+
sage: P._check()
|
|
162
|
+
True
|
|
163
|
+
sage: P == loads(dumps(P))
|
|
164
|
+
True
|
|
165
|
+
"""
|
|
166
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=max, weight=weight)
|
|
167
|
+
self._name = "Partition species"
|
|
168
|
+
|
|
169
|
+
_default_structure_class = PartitionSpeciesStructure
|
|
170
|
+
|
|
171
|
+
def _structures(self, structure_class, labels):
|
|
172
|
+
"""
|
|
173
|
+
EXAMPLES::
|
|
174
|
+
|
|
175
|
+
sage: P = species.PartitionSpecies()
|
|
176
|
+
sage: P.structures([1,2,3]).list()
|
|
177
|
+
[{{1, 2, 3}}, {{1, 3}, {2}}, {{1, 2}, {3}}, {{2, 3}, {1}}, {{1}, {2}, {3}}]
|
|
178
|
+
"""
|
|
179
|
+
from sage.combinat.restricted_growth import RestrictedGrowthArrays
|
|
180
|
+
n = len(labels)
|
|
181
|
+
|
|
182
|
+
if n == 0:
|
|
183
|
+
yield structure_class(self, labels, [])
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
u = list(range(n, 0, -1))
|
|
187
|
+
s0 = u.pop()
|
|
188
|
+
|
|
189
|
+
# Reconstruct the set partitions from
|
|
190
|
+
# restricted growth arrays
|
|
191
|
+
for a in RestrictedGrowthArrays(n):
|
|
192
|
+
m = a.pop(0)
|
|
193
|
+
r = [[] for _ in range(m)]
|
|
194
|
+
i = n
|
|
195
|
+
for i, z in enumerate(u):
|
|
196
|
+
r[a[i]].append(z)
|
|
197
|
+
r[0].append(s0)
|
|
198
|
+
|
|
199
|
+
for sp in r:
|
|
200
|
+
sp.reverse()
|
|
201
|
+
|
|
202
|
+
r.sort(key=len, reverse=True)
|
|
203
|
+
|
|
204
|
+
yield structure_class(self, labels, r)
|
|
205
|
+
|
|
206
|
+
def _isotypes(self, structure_class, labels):
|
|
207
|
+
"""
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: P = species.PartitionSpecies()
|
|
211
|
+
sage: P.isotypes([1,2,3,4]).list()
|
|
212
|
+
[{{1, 2, 3, 4}},
|
|
213
|
+
{{1, 2, 3}, {4}},
|
|
214
|
+
{{1, 2}, {3, 4}},
|
|
215
|
+
{{1, 2}, {3}, {4}},
|
|
216
|
+
{{1}, {2}, {3}, {4}}]
|
|
217
|
+
"""
|
|
218
|
+
from sage.combinat.partition import Partitions
|
|
219
|
+
for p in Partitions(len(labels)):
|
|
220
|
+
yield self._canonical_rep_from_partition(structure_class, labels, p)
|
|
221
|
+
|
|
222
|
+
def _canonical_rep_from_partition(self, structure_class, labels, p):
|
|
223
|
+
"""
|
|
224
|
+
Return the canonical representative corresponding to the partition
|
|
225
|
+
p.
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: P = species.PartitionSpecies()
|
|
230
|
+
sage: P._canonical_rep_from_partition(P._default_structure_class,[1,2,3],[2,1])
|
|
231
|
+
{{1, 2}, {3}}
|
|
232
|
+
"""
|
|
233
|
+
breaks = [sum(p[:i]) for i in range(len(p) + 1)]
|
|
234
|
+
return structure_class(self, labels, [list(range(breaks[i]+1, breaks[i+1]+1)) for i in range(len(p))])
|
|
235
|
+
|
|
236
|
+
def _gs_callable(self, base_ring, n):
|
|
237
|
+
r"""
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: P = species.PartitionSpecies()
|
|
241
|
+
sage: g = P.generating_series()
|
|
242
|
+
sage: [g.coefficient(i) for i in range(5)]
|
|
243
|
+
[1, 1, 1, 5/6, 5/8]
|
|
244
|
+
"""
|
|
245
|
+
from sage.combinat.combinat import bell_number
|
|
246
|
+
return self._weight * base_ring(bell_number(n) / factorial(n))
|
|
247
|
+
|
|
248
|
+
def _itgs_callable(self, base_ring, n):
|
|
249
|
+
r"""
|
|
250
|
+
The isomorphism type generating series is given by
|
|
251
|
+
`\frac{1}{1-x}`.
|
|
252
|
+
|
|
253
|
+
EXAMPLES::
|
|
254
|
+
|
|
255
|
+
sage: P = species.PartitionSpecies()
|
|
256
|
+
sage: g = P.isotype_generating_series()
|
|
257
|
+
sage: [g.coefficient(i) for i in range(10)]
|
|
258
|
+
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30]
|
|
259
|
+
"""
|
|
260
|
+
from sage.combinat.partition import number_of_partitions
|
|
261
|
+
return self._weight*base_ring(number_of_partitions(n))
|
|
262
|
+
|
|
263
|
+
def _cis(self, series_ring, base_ring):
|
|
264
|
+
r"""
|
|
265
|
+
The cycle index series for the species of partitions is given by.
|
|
266
|
+
|
|
267
|
+
.. MATH::
|
|
268
|
+
|
|
269
|
+
exp \sum_{n \ge 1} \frac{1}{n} \left( exp \left( \sum_{k \ge 1} \frac{x_{kn}}{k} \right) -1 \right).
|
|
270
|
+
|
|
271
|
+
EXAMPLES::
|
|
272
|
+
|
|
273
|
+
sage: P = species.PartitionSpecies()
|
|
274
|
+
sage: g = P.cycle_index_series() # needs sage.modules
|
|
275
|
+
sage: g[0:5] # needs sage.modules
|
|
276
|
+
[p[],
|
|
277
|
+
p[1],
|
|
278
|
+
p[1, 1] + p[2],
|
|
279
|
+
5/6*p[1, 1, 1] + 3/2*p[2, 1] + 2/3*p[3],
|
|
280
|
+
5/8*p[1, 1, 1, 1] + 7/4*p[2, 1, 1] + 7/8*p[2, 2] + p[3, 1] + 3/4*p[4]]
|
|
281
|
+
"""
|
|
282
|
+
ciset = SetSpecies().cycle_index_series(base_ring)
|
|
283
|
+
res = ciset(ciset - 1)
|
|
284
|
+
if self.is_weighted():
|
|
285
|
+
res *= self._weight
|
|
286
|
+
return res
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
#Backward compatibility
|
|
290
|
+
PartitionSpecies_class = PartitionSpecies
|