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,476 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Recursive 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 sage.combinat.species.species import GenericCombinatorialSpecies
|
|
20
|
+
from sage.combinat.species.structure import SpeciesStructureWrapper
|
|
21
|
+
from sage.rings.rational_field import QQ
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CombinatorialSpeciesStructure(SpeciesStructureWrapper):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CombinatorialSpecies(GenericCombinatorialSpecies):
|
|
29
|
+
def __init__(self, min=None):
|
|
30
|
+
"""
|
|
31
|
+
EXAMPLES::
|
|
32
|
+
|
|
33
|
+
sage: F = CombinatorialSpecies()
|
|
34
|
+
sage: loads(dumps(F))
|
|
35
|
+
Combinatorial species
|
|
36
|
+
|
|
37
|
+
::
|
|
38
|
+
|
|
39
|
+
sage: X = species.SingletonSpecies()
|
|
40
|
+
sage: E = species.EmptySetSpecies()
|
|
41
|
+
sage: L = CombinatorialSpecies()
|
|
42
|
+
sage: L.define(E+X*L)
|
|
43
|
+
sage: L.generating_series()[0:4]
|
|
44
|
+
[1, 1, 1, 1]
|
|
45
|
+
sage: LL = loads(dumps(L))
|
|
46
|
+
sage: LL.generating_series()[0:4]
|
|
47
|
+
[1, 1, 1, 1]
|
|
48
|
+
"""
|
|
49
|
+
self._generating_series = {}
|
|
50
|
+
self._isotype_generating_series = {}
|
|
51
|
+
self._cycle_index_series = {}
|
|
52
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=None, weight=None)
|
|
53
|
+
|
|
54
|
+
_default_structure_class = CombinatorialSpeciesStructure
|
|
55
|
+
|
|
56
|
+
def __hash__(self):
|
|
57
|
+
"""
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: hash(CombinatorialSpecies) #random
|
|
61
|
+
53751280
|
|
62
|
+
|
|
63
|
+
::
|
|
64
|
+
|
|
65
|
+
sage: X = species.SingletonSpecies()
|
|
66
|
+
sage: E = species.EmptySetSpecies()
|
|
67
|
+
sage: L = CombinatorialSpecies()
|
|
68
|
+
sage: L.define(E+X*L)
|
|
69
|
+
sage: hash(L) #random
|
|
70
|
+
-826511807095108317
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
return hash(('CombinatorialSpecies', id(self._reference)))
|
|
74
|
+
except AttributeError:
|
|
75
|
+
return hash('CombinatorialSpecies')
|
|
76
|
+
|
|
77
|
+
def __eq__(self, other):
|
|
78
|
+
"""
|
|
79
|
+
TESTS::
|
|
80
|
+
|
|
81
|
+
sage: A = species.CombinatorialSpecies()
|
|
82
|
+
sage: B = species.CombinatorialSpecies()
|
|
83
|
+
sage: A == B
|
|
84
|
+
False
|
|
85
|
+
sage: X = species.SingletonSpecies()
|
|
86
|
+
sage: A.define(X+A*A)
|
|
87
|
+
sage: B.define(X+B*B)
|
|
88
|
+
sage: A == B
|
|
89
|
+
True
|
|
90
|
+
|
|
91
|
+
sage: C = species.CombinatorialSpecies()
|
|
92
|
+
sage: E = species.EmptySetSpecies()
|
|
93
|
+
sage: C.define(E+X*C*C)
|
|
94
|
+
sage: A == C
|
|
95
|
+
False
|
|
96
|
+
"""
|
|
97
|
+
if not isinstance(other, CombinatorialSpecies):
|
|
98
|
+
return False
|
|
99
|
+
if not hasattr(self, "_reference"):
|
|
100
|
+
return False
|
|
101
|
+
if hasattr(self, '_computing_eq'):
|
|
102
|
+
return True
|
|
103
|
+
|
|
104
|
+
self._computing_eq = True
|
|
105
|
+
res = self._unique_info() == other._unique_info()
|
|
106
|
+
del self._computing_eq
|
|
107
|
+
return res
|
|
108
|
+
|
|
109
|
+
def __ne__(self, other):
|
|
110
|
+
"""
|
|
111
|
+
Check whether ``self`` is not equal to ``other``.
|
|
112
|
+
|
|
113
|
+
EXAMPLES::
|
|
114
|
+
|
|
115
|
+
sage: A = species.CombinatorialSpecies()
|
|
116
|
+
sage: B = species.CombinatorialSpecies()
|
|
117
|
+
sage: A != B
|
|
118
|
+
True
|
|
119
|
+
sage: X = species.SingletonSpecies()
|
|
120
|
+
sage: A.define(X+A*A)
|
|
121
|
+
sage: B.define(X+B*B)
|
|
122
|
+
sage: A != B
|
|
123
|
+
False
|
|
124
|
+
|
|
125
|
+
sage: C = species.CombinatorialSpecies()
|
|
126
|
+
sage: E = species.EmptySetSpecies()
|
|
127
|
+
sage: C.define(E+X*C*C)
|
|
128
|
+
sage: A != C
|
|
129
|
+
True
|
|
130
|
+
"""
|
|
131
|
+
return not (self == other)
|
|
132
|
+
|
|
133
|
+
def _unique_info(self):
|
|
134
|
+
"""
|
|
135
|
+
Return a tuple which should uniquely identify the species.
|
|
136
|
+
|
|
137
|
+
EXAMPLES::
|
|
138
|
+
|
|
139
|
+
sage: F = CombinatorialSpecies()
|
|
140
|
+
sage: F._unique_info()
|
|
141
|
+
(<class 'sage.combinat.species.recursive_species.CombinatorialSpecies'>,)
|
|
142
|
+
|
|
143
|
+
::
|
|
144
|
+
|
|
145
|
+
sage: X = species.SingletonSpecies()
|
|
146
|
+
sage: E = species.EmptySetSpecies()
|
|
147
|
+
sage: L = CombinatorialSpecies()
|
|
148
|
+
sage: L.define(E+X*L)
|
|
149
|
+
sage: L._unique_info()
|
|
150
|
+
(<class 'sage.combinat.species.recursive_species.CombinatorialSpecies'>,
|
|
151
|
+
<class 'sage.combinat.species.sum_species.SumSpecies'>,
|
|
152
|
+
None,
|
|
153
|
+
None,
|
|
154
|
+
1,
|
|
155
|
+
Empty set species,
|
|
156
|
+
Product of (Singleton species) and (Combinatorial species))
|
|
157
|
+
"""
|
|
158
|
+
if hasattr(self, "_reference"):
|
|
159
|
+
return (self.__class__,) + self._reference._unique_info()
|
|
160
|
+
else:
|
|
161
|
+
return (self.__class__,)
|
|
162
|
+
|
|
163
|
+
def __getstate__(self):
|
|
164
|
+
"""
|
|
165
|
+
EXAMPLES::
|
|
166
|
+
|
|
167
|
+
sage: X = species.SingletonSpecies()
|
|
168
|
+
sage: E = species.EmptySetSpecies()
|
|
169
|
+
sage: L = CombinatorialSpecies()
|
|
170
|
+
sage: L.define(E+X*L)
|
|
171
|
+
sage: L.__getstate__()
|
|
172
|
+
{'reference': Sum of (Empty set species) and (Product of (Singleton species) and (Combinatorial species))}
|
|
173
|
+
"""
|
|
174
|
+
state = {}
|
|
175
|
+
if hasattr(self, '_reference'):
|
|
176
|
+
state['reference'] = self._reference
|
|
177
|
+
return state
|
|
178
|
+
|
|
179
|
+
def __setstate__(self, state):
|
|
180
|
+
"""
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: X = species.SingletonSpecies()
|
|
184
|
+
sage: E = species.EmptySetSpecies()
|
|
185
|
+
sage: L = CombinatorialSpecies()
|
|
186
|
+
sage: L.define(E+X*L)
|
|
187
|
+
sage: state = L.__getstate__(); state
|
|
188
|
+
{'reference': Sum of (Empty set species) and (Product of (Singleton species) and (Combinatorial species))}
|
|
189
|
+
sage: L._reference = None
|
|
190
|
+
sage: L.__setstate__(state)
|
|
191
|
+
sage: L._reference
|
|
192
|
+
Sum of (Empty set species) and (Product of (Singleton species) and (Combinatorial species))
|
|
193
|
+
"""
|
|
194
|
+
CombinatorialSpecies.__init__(self)
|
|
195
|
+
if 'reference' in state:
|
|
196
|
+
self.define(state['reference'])
|
|
197
|
+
|
|
198
|
+
def _structures(self, structure_class, labels):
|
|
199
|
+
"""
|
|
200
|
+
EXAMPLES::
|
|
201
|
+
|
|
202
|
+
sage: F = CombinatorialSpecies()
|
|
203
|
+
sage: list(F._structures(F._default_structure_class, [1,2,3]))
|
|
204
|
+
Traceback (most recent call last):
|
|
205
|
+
...
|
|
206
|
+
NotImplementedError
|
|
207
|
+
"""
|
|
208
|
+
if not hasattr(self, "_reference"):
|
|
209
|
+
raise NotImplementedError
|
|
210
|
+
for s in self._reference.structures(labels):
|
|
211
|
+
yield structure_class(self, s)
|
|
212
|
+
|
|
213
|
+
def _isotypes(self, structure_class, labels):
|
|
214
|
+
"""
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: F = CombinatorialSpecies()
|
|
218
|
+
sage: list(F._isotypes(F._default_structure_class, [1,2,3]))
|
|
219
|
+
Traceback (most recent call last):
|
|
220
|
+
...
|
|
221
|
+
NotImplementedError
|
|
222
|
+
"""
|
|
223
|
+
if not hasattr(self, "_reference"):
|
|
224
|
+
raise NotImplementedError
|
|
225
|
+
for s in self._reference.isotypes(labels):
|
|
226
|
+
yield structure_class(self, s)
|
|
227
|
+
|
|
228
|
+
def _gs(self, series_ring, base_ring):
|
|
229
|
+
"""
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: F = CombinatorialSpecies()
|
|
233
|
+
sage: F.generating_series()
|
|
234
|
+
Uninitialized Lazy Series
|
|
235
|
+
"""
|
|
236
|
+
if base_ring not in self._generating_series:
|
|
237
|
+
self._generating_series[base_ring] = series_ring.undefined(valuation=(0 if self._min is None else self._min))
|
|
238
|
+
|
|
239
|
+
res = self._generating_series[base_ring]
|
|
240
|
+
if hasattr(self, "_reference") and not hasattr(res, "_reference"):
|
|
241
|
+
res._reference = None
|
|
242
|
+
res.define(self._reference.generating_series(base_ring))
|
|
243
|
+
return res
|
|
244
|
+
|
|
245
|
+
def _itgs(self, series_ring, base_ring):
|
|
246
|
+
"""
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: F = CombinatorialSpecies()
|
|
250
|
+
sage: F.isotype_generating_series()
|
|
251
|
+
Uninitialized Lazy Series
|
|
252
|
+
"""
|
|
253
|
+
if base_ring not in self._isotype_generating_series:
|
|
254
|
+
self._isotype_generating_series[base_ring] = series_ring.undefined(valuation=(0 if self._min is None else self._min))
|
|
255
|
+
|
|
256
|
+
res = self._isotype_generating_series[base_ring]
|
|
257
|
+
if hasattr(self, "_reference") and not hasattr(res, "_reference"):
|
|
258
|
+
res._reference = None
|
|
259
|
+
res.define(self._reference.isotype_generating_series(base_ring))
|
|
260
|
+
return res
|
|
261
|
+
|
|
262
|
+
def _cis(self, series_ring, base_ring):
|
|
263
|
+
"""
|
|
264
|
+
EXAMPLES::
|
|
265
|
+
|
|
266
|
+
sage: F = CombinatorialSpecies()
|
|
267
|
+
sage: F.cycle_index_series() # needs sage.modules
|
|
268
|
+
Uninitialized Lazy Series
|
|
269
|
+
"""
|
|
270
|
+
if base_ring not in self._cycle_index_series:
|
|
271
|
+
self._cycle_index_series[base_ring] = series_ring.undefined(valuation=(0 if self._min is None else self._min))
|
|
272
|
+
|
|
273
|
+
res = self._cycle_index_series[base_ring]
|
|
274
|
+
if hasattr(self, "_reference") and not hasattr(res, "_reference"):
|
|
275
|
+
res._reference = None
|
|
276
|
+
res.define(self._reference.cycle_index_series(base_ring))
|
|
277
|
+
return res
|
|
278
|
+
|
|
279
|
+
def weight_ring(self):
|
|
280
|
+
"""
|
|
281
|
+
EXAMPLES::
|
|
282
|
+
|
|
283
|
+
sage: F = species.CombinatorialSpecies()
|
|
284
|
+
sage: F.weight_ring()
|
|
285
|
+
Rational Field
|
|
286
|
+
|
|
287
|
+
::
|
|
288
|
+
|
|
289
|
+
sage: X = species.SingletonSpecies()
|
|
290
|
+
sage: E = species.EmptySetSpecies()
|
|
291
|
+
sage: L = CombinatorialSpecies()
|
|
292
|
+
sage: L.define(E+X*L)
|
|
293
|
+
sage: L.weight_ring()
|
|
294
|
+
Rational Field
|
|
295
|
+
"""
|
|
296
|
+
if not hasattr(self, "_reference"):
|
|
297
|
+
return QQ
|
|
298
|
+
|
|
299
|
+
if hasattr(self, "_weight_ring_been_called"):
|
|
300
|
+
return QQ
|
|
301
|
+
else:
|
|
302
|
+
self._weight_ring_been_called = True
|
|
303
|
+
res = self._reference.weight_ring()
|
|
304
|
+
del self._weight_ring_been_called
|
|
305
|
+
return res
|
|
306
|
+
|
|
307
|
+
def define(self, x):
|
|
308
|
+
"""
|
|
309
|
+
Define ``self`` to be equal to the combinatorial species ``x``.
|
|
310
|
+
|
|
311
|
+
This is used to define combinatorial species recursively. All of the
|
|
312
|
+
real work is done by calling the ``.set()`` method for each of the
|
|
313
|
+
series associated to ``self``.
|
|
314
|
+
|
|
315
|
+
EXAMPLES: The species of linear orders `L` can be recursively defined
|
|
316
|
+
by `L = 1 + X*L` where 1 represents the empty set species
|
|
317
|
+
and `X` represents the singleton species::
|
|
318
|
+
|
|
319
|
+
sage: X = species.SingletonSpecies()
|
|
320
|
+
sage: E = species.EmptySetSpecies()
|
|
321
|
+
sage: L = CombinatorialSpecies()
|
|
322
|
+
sage: L.define(E+X*L)
|
|
323
|
+
sage: L.generating_series()[0:4]
|
|
324
|
+
[1, 1, 1, 1]
|
|
325
|
+
sage: L.structures([1,2,3]).cardinality()
|
|
326
|
+
6
|
|
327
|
+
sage: L.structures([1,2,3]).list()
|
|
328
|
+
[1*(2*(3*{})),
|
|
329
|
+
1*(3*(2*{})),
|
|
330
|
+
2*(1*(3*{})),
|
|
331
|
+
2*(3*(1*{})),
|
|
332
|
+
3*(1*(2*{})),
|
|
333
|
+
3*(2*(1*{}))]
|
|
334
|
+
|
|
335
|
+
::
|
|
336
|
+
|
|
337
|
+
sage: L = species.LinearOrderSpecies()
|
|
338
|
+
sage: L.generating_series()[0:4]
|
|
339
|
+
[1, 1, 1, 1]
|
|
340
|
+
sage: L.structures([1,2,3]).cardinality()
|
|
341
|
+
6
|
|
342
|
+
sage: L.structures([1,2,3]).list()
|
|
343
|
+
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
|
|
344
|
+
|
|
345
|
+
TESTS::
|
|
346
|
+
|
|
347
|
+
sage: A = CombinatorialSpecies()
|
|
348
|
+
sage: A.define(E+X*A*A)
|
|
349
|
+
sage: A.generating_series()[0:6]
|
|
350
|
+
[1, 1, 2, 5, 14, 42]
|
|
351
|
+
sage: A.generating_series().counts(6)
|
|
352
|
+
[1, 1, 4, 30, 336, 5040]
|
|
353
|
+
sage: len(A.structures([1,2,3,4]).list())
|
|
354
|
+
336
|
|
355
|
+
sage: A.isotype_generating_series()[0:6]
|
|
356
|
+
[1, 1, 2, 5, 14, 42]
|
|
357
|
+
sage: len(A.isotypes([1,2,3,4]).list())
|
|
358
|
+
14
|
|
359
|
+
|
|
360
|
+
::
|
|
361
|
+
|
|
362
|
+
sage: A = CombinatorialSpecies(min=1)
|
|
363
|
+
sage: A.define(X+A*A)
|
|
364
|
+
sage: A.generating_series()[0:6]
|
|
365
|
+
[0, 1, 1, 2, 5, 14]
|
|
366
|
+
sage: A.generating_series().counts(6)
|
|
367
|
+
[0, 1, 2, 12, 120, 1680]
|
|
368
|
+
sage: len(A.structures([1,2,3]).list())
|
|
369
|
+
12
|
|
370
|
+
sage: A.isotype_generating_series()[0:6]
|
|
371
|
+
[0, 1, 1, 2, 5, 14]
|
|
372
|
+
sage: len(A.isotypes([1,2,3,4]).list())
|
|
373
|
+
5
|
|
374
|
+
|
|
375
|
+
::
|
|
376
|
+
|
|
377
|
+
sage: X2 = X*X
|
|
378
|
+
sage: X5 = X2*X2*X
|
|
379
|
+
sage: A = CombinatorialSpecies(min=1)
|
|
380
|
+
sage: B = CombinatorialSpecies(min=1)
|
|
381
|
+
sage: C = CombinatorialSpecies(min=1)
|
|
382
|
+
sage: A.define(X5+B*B)
|
|
383
|
+
sage: B.define(X5+C*C)
|
|
384
|
+
sage: C.define(X2+C*C+A*A)
|
|
385
|
+
sage: A.generating_series()[0:15]
|
|
386
|
+
[0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 5, 4, 14, 10, 48]
|
|
387
|
+
sage: B.generating_series()[0:15]
|
|
388
|
+
[0, 0, 0, 0, 1, 1, 2, 0, 5, 0, 14, 0, 44, 0, 138]
|
|
389
|
+
sage: C.generating_series()[0:15]
|
|
390
|
+
[0, 0, 1, 0, 1, 0, 2, 0, 5, 0, 15, 0, 44, 2, 142]
|
|
391
|
+
|
|
392
|
+
::
|
|
393
|
+
|
|
394
|
+
sage: F = CombinatorialSpecies()
|
|
395
|
+
sage: F.define(E+X+(X*F+X*X*F))
|
|
396
|
+
sage: F.generating_series().counts(10)
|
|
397
|
+
[1, 2, 6, 30, 192, 1560, 15120, 171360, 2217600, 32296320]
|
|
398
|
+
sage: F.generating_series()[0:10]
|
|
399
|
+
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
|
|
400
|
+
sage: F.isotype_generating_series()[0:10]
|
|
401
|
+
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
|
|
402
|
+
|
|
403
|
+
Check that :issue:`35071` is fixed::
|
|
404
|
+
|
|
405
|
+
sage: X = species.SingletonSpecies()
|
|
406
|
+
sage: E = species.SetSpecies(max=3)
|
|
407
|
+
sage: B = species.CombinatorialSpecies(min=1)
|
|
408
|
+
sage: B.define(X*E(B))
|
|
409
|
+
sage: B.generating_series()
|
|
410
|
+
z + z^2 + 3/2*z^3 + 5/2*z^4 + 9/2*z^5 + 17/2*z^6 + 133/8*z^7 + O(z^8)
|
|
411
|
+
"""
|
|
412
|
+
if not isinstance(x, GenericCombinatorialSpecies):
|
|
413
|
+
raise TypeError("x must be a combinatorial species")
|
|
414
|
+
|
|
415
|
+
if self.__class__ is not CombinatorialSpecies:
|
|
416
|
+
raise TypeError("only undefined combinatorial species can be set")
|
|
417
|
+
|
|
418
|
+
self._reference = x
|
|
419
|
+
|
|
420
|
+
def _add_to_digraph(self, d):
|
|
421
|
+
"""
|
|
422
|
+
Add this species as a vertex to the digraph d along with any
|
|
423
|
+
'children' of this species.
|
|
424
|
+
|
|
425
|
+
Note that to avoid infinite recursion, we just return if this
|
|
426
|
+
species already occurs in the digraph d.
|
|
427
|
+
|
|
428
|
+
EXAMPLES::
|
|
429
|
+
|
|
430
|
+
sage: d = DiGraph(multiedges=True) # needs sage.graphs
|
|
431
|
+
sage: X = species.SingletonSpecies()
|
|
432
|
+
sage: B = species.CombinatorialSpecies()
|
|
433
|
+
sage: B.define(X+B*B)
|
|
434
|
+
sage: B._add_to_digraph(d); d # needs sage.graphs
|
|
435
|
+
Multi-digraph on 4 vertices
|
|
436
|
+
|
|
437
|
+
TESTS::
|
|
438
|
+
|
|
439
|
+
sage: C = species.CombinatorialSpecies()
|
|
440
|
+
sage: C._add_to_digraph(d) # needs sage.graphs
|
|
441
|
+
Traceback (most recent call last):
|
|
442
|
+
...
|
|
443
|
+
NotImplementedError
|
|
444
|
+
"""
|
|
445
|
+
if self in d:
|
|
446
|
+
return
|
|
447
|
+
try:
|
|
448
|
+
d.add_edge(self, self._reference)
|
|
449
|
+
self._reference._add_to_digraph(d)
|
|
450
|
+
except AttributeError:
|
|
451
|
+
raise NotImplementedError
|
|
452
|
+
|
|
453
|
+
def _equation(self, var_mapping):
|
|
454
|
+
"""
|
|
455
|
+
Return the right hand side of an algebraic equation satisfied by
|
|
456
|
+
this species. This is a utility function called by the
|
|
457
|
+
algebraic_equation_system method.
|
|
458
|
+
|
|
459
|
+
EXAMPLES::
|
|
460
|
+
|
|
461
|
+
sage: C = species.CombinatorialSpecies()
|
|
462
|
+
sage: C.algebraic_equation_system() # needs sage.graphs
|
|
463
|
+
Traceback (most recent call last):
|
|
464
|
+
...
|
|
465
|
+
NotImplementedError
|
|
466
|
+
|
|
467
|
+
::
|
|
468
|
+
|
|
469
|
+
sage: B = species.BinaryTreeSpecies()
|
|
470
|
+
sage: B.algebraic_equation_system() # needs sage.graphs
|
|
471
|
+
[-node3^2 + node1, -node1 + node3 + (-z)]
|
|
472
|
+
"""
|
|
473
|
+
try:
|
|
474
|
+
return var_mapping[self._reference]
|
|
475
|
+
except AttributeError:
|
|
476
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Set 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
|
+
|
|
20
|
+
from .species import GenericCombinatorialSpecies
|
|
21
|
+
from sage.combinat.species.structure import GenericSpeciesStructure
|
|
22
|
+
from sage.combinat.species.misc import accept_size
|
|
23
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
24
|
+
from sage.arith.misc import factorial
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SetSpeciesStructure(GenericSpeciesStructure):
|
|
28
|
+
def __repr__(self):
|
|
29
|
+
"""
|
|
30
|
+
EXAMPLES::
|
|
31
|
+
|
|
32
|
+
sage: S = species.SetSpecies()
|
|
33
|
+
sage: a = S.structures(["a","b","c"]).random_element(); a
|
|
34
|
+
{'a', 'b', 'c'}
|
|
35
|
+
"""
|
|
36
|
+
s = GenericSpeciesStructure.__repr__(self)
|
|
37
|
+
return "{"+s[1:-1]+"}"
|
|
38
|
+
|
|
39
|
+
def canonical_label(self):
|
|
40
|
+
"""
|
|
41
|
+
EXAMPLES::
|
|
42
|
+
|
|
43
|
+
sage: S = species.SetSpecies()
|
|
44
|
+
sage: a = S.structures(["a","b","c"]).random_element(); a
|
|
45
|
+
{'a', 'b', 'c'}
|
|
46
|
+
sage: a.canonical_label()
|
|
47
|
+
{'a', 'b', 'c'}
|
|
48
|
+
"""
|
|
49
|
+
rng = list(range(1, len(self._labels) + 1))
|
|
50
|
+
return SetSpeciesStructure(self.parent(), self._labels, rng)
|
|
51
|
+
|
|
52
|
+
def transport(self, perm):
|
|
53
|
+
"""
|
|
54
|
+
Return the transport of this set along the permutation perm.
|
|
55
|
+
|
|
56
|
+
EXAMPLES::
|
|
57
|
+
|
|
58
|
+
sage: F = species.SetSpecies()
|
|
59
|
+
sage: a = F.structures(["a", "b", "c"]).random_element(); a
|
|
60
|
+
{'a', 'b', 'c'}
|
|
61
|
+
sage: p = PermutationGroupElement((1,2)) # needs sage.groups
|
|
62
|
+
sage: a.transport(p) # needs sage.groups
|
|
63
|
+
{'a', 'b', 'c'}
|
|
64
|
+
"""
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
def automorphism_group(self):
|
|
68
|
+
"""
|
|
69
|
+
Return the group of permutations whose action on this set leave it
|
|
70
|
+
fixed. For the species of sets, there is only one isomorphism
|
|
71
|
+
class, so every permutation is in its automorphism group.
|
|
72
|
+
|
|
73
|
+
EXAMPLES::
|
|
74
|
+
|
|
75
|
+
sage: F = species.SetSpecies()
|
|
76
|
+
sage: a = F.structures(["a", "b", "c"]).random_element(); a
|
|
77
|
+
{'a', 'b', 'c'}
|
|
78
|
+
sage: a.automorphism_group() # needs sage.groups
|
|
79
|
+
Symmetric group of order 3! as a permutation group
|
|
80
|
+
"""
|
|
81
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
82
|
+
return SymmetricGroup(max(1,len(self._labels)))
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class SetSpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
86
|
+
@staticmethod
|
|
87
|
+
@accept_size
|
|
88
|
+
def __classcall__(cls, *args, **kwds):
|
|
89
|
+
"""
|
|
90
|
+
EXAMPLES::
|
|
91
|
+
|
|
92
|
+
sage: E = species.SetSpecies(); E
|
|
93
|
+
Set species
|
|
94
|
+
"""
|
|
95
|
+
return super().__classcall__(cls, *args, **kwds)
|
|
96
|
+
|
|
97
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
98
|
+
"""
|
|
99
|
+
Return the species of sets.
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: E = species.SetSpecies()
|
|
104
|
+
sage: E.structures([1,2,3]).list()
|
|
105
|
+
[{1, 2, 3}]
|
|
106
|
+
sage: E.isotype_generating_series()[0:4]
|
|
107
|
+
[1, 1, 1, 1]
|
|
108
|
+
|
|
109
|
+
sage: S = species.SetSpecies()
|
|
110
|
+
sage: c = S.generating_series()[0:3]
|
|
111
|
+
sage: S._check()
|
|
112
|
+
True
|
|
113
|
+
sage: S == loads(dumps(S))
|
|
114
|
+
True
|
|
115
|
+
"""
|
|
116
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=max, weight=weight)
|
|
117
|
+
self._name = "Set species"
|
|
118
|
+
|
|
119
|
+
_default_structure_class = SetSpeciesStructure
|
|
120
|
+
|
|
121
|
+
def _structures(self, structure_class, labels):
|
|
122
|
+
"""
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: S = species.SetSpecies()
|
|
126
|
+
sage: S.structures([1,2,3]).list()
|
|
127
|
+
[{1, 2, 3}]
|
|
128
|
+
"""
|
|
129
|
+
n = len(labels)
|
|
130
|
+
yield structure_class(self, labels, range(1,n+1))
|
|
131
|
+
|
|
132
|
+
_isotypes = _structures
|
|
133
|
+
|
|
134
|
+
def _gs_callable(self, base_ring, n):
|
|
135
|
+
r"""
|
|
136
|
+
The generating series for the species of sets is given by
|
|
137
|
+
`e^x`.
|
|
138
|
+
|
|
139
|
+
EXAMPLES::
|
|
140
|
+
|
|
141
|
+
sage: S = species.SetSpecies()
|
|
142
|
+
sage: g = S.generating_series()
|
|
143
|
+
sage: [g.coefficient(i) for i in range(10)]
|
|
144
|
+
[1, 1, 1/2, 1/6, 1/24, 1/120, 1/720, 1/5040, 1/40320, 1/362880]
|
|
145
|
+
sage: [g.count(i) for i in range(10)]
|
|
146
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
147
|
+
"""
|
|
148
|
+
return base_ring(self._weight / factorial(n))
|
|
149
|
+
|
|
150
|
+
def _itgs_list(self, base_ring, n):
|
|
151
|
+
r"""
|
|
152
|
+
The isomorphism type generating series for the species of sets is
|
|
153
|
+
`\frac{1}{1-x}`.
|
|
154
|
+
|
|
155
|
+
EXAMPLES::
|
|
156
|
+
|
|
157
|
+
sage: S = species.SetSpecies()
|
|
158
|
+
sage: g = S.isotype_generating_series()
|
|
159
|
+
sage: g[0:10]
|
|
160
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
161
|
+
sage: [g.count(i) for i in range(10)]
|
|
162
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
163
|
+
"""
|
|
164
|
+
return base_ring(self._weight)
|
|
165
|
+
|
|
166
|
+
def _cis(self, series_ring, base_ring):
|
|
167
|
+
r"""
|
|
168
|
+
The cycle index series for the species of sets is given by
|
|
169
|
+
`exp\( \sum_{n=1}{\infty} = \frac{x_n}{n} \)`.
|
|
170
|
+
|
|
171
|
+
EXAMPLES::
|
|
172
|
+
|
|
173
|
+
sage: S = species.SetSpecies()
|
|
174
|
+
sage: g = S.cycle_index_series() # needs sage.modules
|
|
175
|
+
sage: g[0:5] # needs sage.modules
|
|
176
|
+
[p[],
|
|
177
|
+
p[1],
|
|
178
|
+
1/2*p[1, 1] + 1/2*p[2],
|
|
179
|
+
1/6*p[1, 1, 1] + 1/2*p[2, 1] + 1/3*p[3],
|
|
180
|
+
1/24*p[1, 1, 1, 1] + 1/4*p[2, 1, 1] + 1/8*p[2, 2] + 1/3*p[3, 1] + 1/4*p[4]]
|
|
181
|
+
"""
|
|
182
|
+
from .generating_series import ExponentialCycleIndexSeries
|
|
183
|
+
res = ExponentialCycleIndexSeries(base_ring)
|
|
184
|
+
|
|
185
|
+
if self.is_weighted():
|
|
186
|
+
res *= self._weight
|
|
187
|
+
|
|
188
|
+
return res
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
#Backward compatibility
|
|
192
|
+
SetSpecies_class = SetSpecies
|