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,268 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.groups sage.libs.flint
|
|
3
|
+
"""
|
|
4
|
+
Permutation 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 .structure import GenericSpeciesStructure
|
|
23
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
24
|
+
from sage.combinat.permutation import Permutation, Permutations
|
|
25
|
+
from sage.combinat.species.misc import accept_size
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class PermutationSpeciesStructure(GenericSpeciesStructure):
|
|
29
|
+
def canonical_label(self):
|
|
30
|
+
"""
|
|
31
|
+
EXAMPLES::
|
|
32
|
+
|
|
33
|
+
sage: P = species.PermutationSpecies()
|
|
34
|
+
sage: S = P.structures(["a", "b", "c"])
|
|
35
|
+
sage: [s.canonical_label() for s in S]
|
|
36
|
+
[['a', 'b', 'c'],
|
|
37
|
+
['b', 'a', 'c'],
|
|
38
|
+
['b', 'a', 'c'],
|
|
39
|
+
['b', 'c', 'a'],
|
|
40
|
+
['b', 'c', 'a'],
|
|
41
|
+
['b', 'a', 'c']]
|
|
42
|
+
"""
|
|
43
|
+
P = self.parent()
|
|
44
|
+
return P._canonical_rep_from_partition(self.__class__, self._labels, Permutation(self._list).cycle_type())
|
|
45
|
+
|
|
46
|
+
def permutation_group_element(self):
|
|
47
|
+
"""
|
|
48
|
+
Return ``self`` as a permutation group element.
|
|
49
|
+
|
|
50
|
+
EXAMPLES::
|
|
51
|
+
|
|
52
|
+
sage: p = PermutationGroupElement((2,3,4))
|
|
53
|
+
sage: P = species.PermutationSpecies()
|
|
54
|
+
sage: a = P.structures(["a", "b", "c", "d"])[2]; a
|
|
55
|
+
['a', 'c', 'b', 'd']
|
|
56
|
+
sage: a.permutation_group_element()
|
|
57
|
+
(2,3)
|
|
58
|
+
"""
|
|
59
|
+
return Permutation(self._list).to_permutation_group_element()
|
|
60
|
+
|
|
61
|
+
def transport(self, perm):
|
|
62
|
+
"""
|
|
63
|
+
Return the transport of this structure along the permutation
|
|
64
|
+
perm.
|
|
65
|
+
|
|
66
|
+
EXAMPLES::
|
|
67
|
+
|
|
68
|
+
sage: p = PermutationGroupElement((2,3,4))
|
|
69
|
+
sage: P = species.PermutationSpecies()
|
|
70
|
+
sage: a = P.structures(["a", "b", "c", "d"])[2]; a
|
|
71
|
+
['a', 'c', 'b', 'd']
|
|
72
|
+
sage: a.transport(p)
|
|
73
|
+
['a', 'd', 'c', 'b']
|
|
74
|
+
"""
|
|
75
|
+
p = self.permutation_group_element()
|
|
76
|
+
p = perm*p*~perm
|
|
77
|
+
return self.__class__(self.parent(), self._labels, p.domain())
|
|
78
|
+
|
|
79
|
+
def automorphism_group(self):
|
|
80
|
+
"""
|
|
81
|
+
Return the group of permutations whose action on this structure
|
|
82
|
+
leave it fixed.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: set_random_seed(0)
|
|
87
|
+
sage: p = PermutationGroupElement((2,3,4))
|
|
88
|
+
sage: P = species.PermutationSpecies()
|
|
89
|
+
sage: a = P.structures(["a", "b", "c", "d"])[2]; a
|
|
90
|
+
['a', 'c', 'b', 'd']
|
|
91
|
+
sage: a.automorphism_group()
|
|
92
|
+
Permutation Group with generators [(2,3), (1,4)]
|
|
93
|
+
|
|
94
|
+
::
|
|
95
|
+
|
|
96
|
+
sage: [a.transport(perm) for perm in a.automorphism_group()]
|
|
97
|
+
[['a', 'c', 'b', 'd'],
|
|
98
|
+
['a', 'c', 'b', 'd'],
|
|
99
|
+
['a', 'c', 'b', 'd'],
|
|
100
|
+
['a', 'c', 'b', 'd']]
|
|
101
|
+
"""
|
|
102
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
103
|
+
from sage.groups.perm_gps.permgroup import PermutationGroup
|
|
104
|
+
S = SymmetricGroup(len(self._labels))
|
|
105
|
+
p = self.permutation_group_element()
|
|
106
|
+
return PermutationGroup(S.centralizer(p).gens())
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class PermutationSpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
110
|
+
@staticmethod
|
|
111
|
+
@accept_size
|
|
112
|
+
def __classcall__(cls, *args, **kwds):
|
|
113
|
+
"""
|
|
114
|
+
EXAMPLES::
|
|
115
|
+
|
|
116
|
+
sage: P = species.PermutationSpecies(); P
|
|
117
|
+
Permutation species
|
|
118
|
+
"""
|
|
119
|
+
return super().__classcall__(cls, *args, **kwds)
|
|
120
|
+
|
|
121
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
122
|
+
"""
|
|
123
|
+
Return the species of permutations.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: P = species.PermutationSpecies()
|
|
128
|
+
sage: P.generating_series()[0:5]
|
|
129
|
+
[1, 1, 1, 1, 1]
|
|
130
|
+
sage: P.isotype_generating_series()[0:5]
|
|
131
|
+
[1, 1, 2, 3, 5]
|
|
132
|
+
|
|
133
|
+
sage: P = species.PermutationSpecies()
|
|
134
|
+
sage: c = P.generating_series()[0:3]
|
|
135
|
+
sage: P._check()
|
|
136
|
+
True
|
|
137
|
+
sage: P == loads(dumps(P))
|
|
138
|
+
True
|
|
139
|
+
"""
|
|
140
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=max, weight=weight)
|
|
141
|
+
self._name = "Permutation species"
|
|
142
|
+
|
|
143
|
+
_default_structure_class = PermutationSpeciesStructure
|
|
144
|
+
|
|
145
|
+
def _structures(self, structure_class, labels):
|
|
146
|
+
"""
|
|
147
|
+
EXAMPLES::
|
|
148
|
+
|
|
149
|
+
sage: P = species.PermutationSpecies()
|
|
150
|
+
sage: P.structures([1,2,3]).list()
|
|
151
|
+
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
|
|
152
|
+
"""
|
|
153
|
+
if labels == []:
|
|
154
|
+
yield structure_class(self, labels, [])
|
|
155
|
+
else:
|
|
156
|
+
for p in Permutations(len(labels)):
|
|
157
|
+
yield structure_class(self, labels, list(p))
|
|
158
|
+
|
|
159
|
+
def _isotypes(self, structure_class, labels):
|
|
160
|
+
"""
|
|
161
|
+
EXAMPLES::
|
|
162
|
+
|
|
163
|
+
sage: P = species.PermutationSpecies()
|
|
164
|
+
sage: P.isotypes([1,2,3]).list()
|
|
165
|
+
[[2, 3, 1], [2, 1, 3], [1, 2, 3]]
|
|
166
|
+
"""
|
|
167
|
+
from sage.combinat.partition import Partitions
|
|
168
|
+
if labels == []:
|
|
169
|
+
yield structure_class(self, labels, [])
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
for p in Partitions(len(labels)):
|
|
173
|
+
yield self._canonical_rep_from_partition(structure_class, labels, p)
|
|
174
|
+
|
|
175
|
+
def _canonical_rep_from_partition(self, structure_class, labels, p):
|
|
176
|
+
"""
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: P = species.PermutationSpecies()
|
|
180
|
+
sage: P._canonical_rep_from_partition(P._default_structure_class, ["a","b","c"], [2,1])
|
|
181
|
+
['b', 'a', 'c']
|
|
182
|
+
"""
|
|
183
|
+
indices = list(range(1, len(labels) + 1))
|
|
184
|
+
breaks = [sum(p[:i]) for i in range(len(p)+1)]
|
|
185
|
+
cycles = tuple(tuple(indices[breaks[i]:breaks[i+1]]) for i in range(len(p)))
|
|
186
|
+
perm = list(Permutation(cycles))
|
|
187
|
+
return structure_class(self, labels, perm)
|
|
188
|
+
|
|
189
|
+
def _gs_list(self, base_ring, n):
|
|
190
|
+
r"""
|
|
191
|
+
The generating series for the species of linear orders is
|
|
192
|
+
`\frac{1}{1-x}`.
|
|
193
|
+
|
|
194
|
+
EXAMPLES::
|
|
195
|
+
|
|
196
|
+
sage: P = species.PermutationSpecies()
|
|
197
|
+
sage: g = P.generating_series()
|
|
198
|
+
sage: g[0:10]
|
|
199
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
200
|
+
"""
|
|
201
|
+
return base_ring.one()
|
|
202
|
+
|
|
203
|
+
def _itgs_callable(self, base_ring, n):
|
|
204
|
+
r"""
|
|
205
|
+
The isomorphism type generating series is given by
|
|
206
|
+
`\frac{1}{1-x}`.
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: P = species.PermutationSpecies()
|
|
211
|
+
sage: g = P.isotype_generating_series()
|
|
212
|
+
sage: [g.coefficient(i) for i in range(10)]
|
|
213
|
+
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30]
|
|
214
|
+
"""
|
|
215
|
+
from sage.combinat.partition import number_of_partitions
|
|
216
|
+
return base_ring(number_of_partitions(n))
|
|
217
|
+
|
|
218
|
+
def _cis(self, series_ring, base_ring):
|
|
219
|
+
r"""
|
|
220
|
+
The cycle index series for the species of permutations is given by.
|
|
221
|
+
|
|
222
|
+
.. MATH::
|
|
223
|
+
|
|
224
|
+
\prod{n=1}^\infty \frac{1}{1-x_n}.
|
|
225
|
+
|
|
226
|
+
EXAMPLES::
|
|
227
|
+
|
|
228
|
+
sage: P = species.PermutationSpecies()
|
|
229
|
+
sage: g = P.cycle_index_series() # needs sage.modules
|
|
230
|
+
sage: g[0:5] # needs sage.modules
|
|
231
|
+
[p[],
|
|
232
|
+
p[1],
|
|
233
|
+
p[1, 1] + p[2],
|
|
234
|
+
p[1, 1, 1] + p[2, 1] + p[3],
|
|
235
|
+
p[1, 1, 1, 1] + p[2, 1, 1] + p[2, 2] + p[3, 1] + p[4]]
|
|
236
|
+
"""
|
|
237
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
238
|
+
from sage.combinat.partition import Partitions
|
|
239
|
+
p = SymmetricFunctions(base_ring).p()
|
|
240
|
+
CIS = series_ring
|
|
241
|
+
return CIS(lambda n: sum(p(la) for la in Partitions(n)))
|
|
242
|
+
|
|
243
|
+
def _cis_gen(self, base_ring, m, n):
|
|
244
|
+
"""
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: P = species.PermutationSpecies()
|
|
248
|
+
sage: [P._cis_gen(QQ, 2, i) for i in range(10)] # needs sage.modules
|
|
249
|
+
[p[], 0, p[2], 0, p[2, 2], 0, p[2, 2, 2], 0, p[2, 2, 2, 2], 0]
|
|
250
|
+
"""
|
|
251
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
252
|
+
p = SymmetricFunctions(base_ring).power()
|
|
253
|
+
|
|
254
|
+
pn = p([m])
|
|
255
|
+
|
|
256
|
+
if not n:
|
|
257
|
+
return p(1)
|
|
258
|
+
if m == 1:
|
|
259
|
+
if n % 2:
|
|
260
|
+
return base_ring.zero()
|
|
261
|
+
return pn**(n//2)
|
|
262
|
+
elif n % m:
|
|
263
|
+
return base_ring.zero()
|
|
264
|
+
return pn**(n//m)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
#Backward compatibility
|
|
268
|
+
PermutationSpecies_class = PermutationSpecies
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Product 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
|
+
from .species import GenericCombinatorialSpecies
|
|
20
|
+
from .structure import GenericSpeciesStructure
|
|
21
|
+
from .subset_species import SubsetSpecies
|
|
22
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ProductSpeciesStructure(GenericSpeciesStructure):
|
|
26
|
+
def __init__(self, parent, labels, subset, left, right):
|
|
27
|
+
"""
|
|
28
|
+
TESTS::
|
|
29
|
+
|
|
30
|
+
sage: S = species.SetSpecies()
|
|
31
|
+
sage: F = S * S
|
|
32
|
+
sage: a = F.structures(['a','b','c']).random_element()
|
|
33
|
+
sage: a == loads(dumps(a))
|
|
34
|
+
True
|
|
35
|
+
"""
|
|
36
|
+
self._subset = subset
|
|
37
|
+
GenericSpeciesStructure.__init__(self, parent, labels, [left, right])
|
|
38
|
+
|
|
39
|
+
def __repr__(self):
|
|
40
|
+
"""
|
|
41
|
+
Return the string representation of this object.
|
|
42
|
+
|
|
43
|
+
EXAMPLES::
|
|
44
|
+
|
|
45
|
+
sage: S = species.SetSpecies()
|
|
46
|
+
sage: (S*S).structures(['a','b','c'])[0]
|
|
47
|
+
{}*{'a', 'b', 'c'}
|
|
48
|
+
sage: (S*S*S).structures(['a','b','c'])[13]
|
|
49
|
+
({'c'}*{'a'})*{'b'}
|
|
50
|
+
"""
|
|
51
|
+
left, right = map(repr, self._list)
|
|
52
|
+
if "*" in left:
|
|
53
|
+
left = "(%s)" % left
|
|
54
|
+
if "*" in right:
|
|
55
|
+
right = "(%s)" % right
|
|
56
|
+
return "%s*%s" % (left, right)
|
|
57
|
+
|
|
58
|
+
def transport(self, perm):
|
|
59
|
+
"""
|
|
60
|
+
EXAMPLES::
|
|
61
|
+
|
|
62
|
+
sage: # needs sage.groups
|
|
63
|
+
sage: p = PermutationGroupElement((2,3))
|
|
64
|
+
sage: S = species.SetSpecies()
|
|
65
|
+
sage: F = S * S
|
|
66
|
+
sage: a = F.structures(['a','b','c'])[4]; a
|
|
67
|
+
{'a', 'b'}*{'c'}
|
|
68
|
+
sage: a.transport(p)
|
|
69
|
+
{'a', 'c'}*{'b'}
|
|
70
|
+
"""
|
|
71
|
+
left, right = self._list
|
|
72
|
+
new_subset = self._subset.transport(perm)
|
|
73
|
+
left_labels = new_subset.label_subset()
|
|
74
|
+
right_labels = new_subset.complement().label_subset()
|
|
75
|
+
|
|
76
|
+
return self.__class__(self.parent(), self._labels,
|
|
77
|
+
new_subset,
|
|
78
|
+
left.change_labels(left_labels),
|
|
79
|
+
right.change_labels(right_labels))
|
|
80
|
+
|
|
81
|
+
def canonical_label(self):
|
|
82
|
+
"""
|
|
83
|
+
EXAMPLES::
|
|
84
|
+
|
|
85
|
+
sage: S = species.SetSpecies()
|
|
86
|
+
sage: F = S * S
|
|
87
|
+
sage: S = F.structures(['a','b','c']).list(); S
|
|
88
|
+
[{}*{'a', 'b', 'c'},
|
|
89
|
+
{'a'}*{'b', 'c'},
|
|
90
|
+
{'b'}*{'a', 'c'},
|
|
91
|
+
{'c'}*{'a', 'b'},
|
|
92
|
+
{'a', 'b'}*{'c'},
|
|
93
|
+
{'a', 'c'}*{'b'},
|
|
94
|
+
{'b', 'c'}*{'a'},
|
|
95
|
+
{'a', 'b', 'c'}*{}]
|
|
96
|
+
|
|
97
|
+
::
|
|
98
|
+
|
|
99
|
+
sage: F.isotypes(['a','b','c']).cardinality()
|
|
100
|
+
4
|
|
101
|
+
sage: [s.canonical_label() for s in S]
|
|
102
|
+
[{}*{'a', 'b', 'c'},
|
|
103
|
+
{'a'}*{'b', 'c'},
|
|
104
|
+
{'a'}*{'b', 'c'},
|
|
105
|
+
{'a'}*{'b', 'c'},
|
|
106
|
+
{'a', 'b'}*{'c'},
|
|
107
|
+
{'a', 'b'}*{'c'},
|
|
108
|
+
{'a', 'b'}*{'c'},
|
|
109
|
+
{'a', 'b', 'c'}*{}]
|
|
110
|
+
"""
|
|
111
|
+
left, right = self._list
|
|
112
|
+
new_subset = self._subset.canonical_label()
|
|
113
|
+
left_labels = new_subset.label_subset()
|
|
114
|
+
right_labels = new_subset.complement().label_subset()
|
|
115
|
+
|
|
116
|
+
return self.__class__(self.parent(), self._labels,
|
|
117
|
+
new_subset,
|
|
118
|
+
left.canonical_label().change_labels(left_labels),
|
|
119
|
+
right.canonical_label().change_labels(right_labels))
|
|
120
|
+
|
|
121
|
+
def change_labels(self, labels):
|
|
122
|
+
"""
|
|
123
|
+
Return a relabelled structure.
|
|
124
|
+
|
|
125
|
+
INPUT:
|
|
126
|
+
|
|
127
|
+
- ``labels`` -- list of labels
|
|
128
|
+
|
|
129
|
+
OUTPUT:
|
|
130
|
+
|
|
131
|
+
A structure with the `i`-th label of ``self`` replaced with the `i`-th
|
|
132
|
+
label of the list.
|
|
133
|
+
|
|
134
|
+
EXAMPLES::
|
|
135
|
+
|
|
136
|
+
sage: S = species.SetSpecies()
|
|
137
|
+
sage: F = S * S
|
|
138
|
+
sage: a = F.structures(['a','b','c'])[0]; a
|
|
139
|
+
{}*{'a', 'b', 'c'}
|
|
140
|
+
sage: a.change_labels([1,2,3])
|
|
141
|
+
{}*{1, 2, 3}
|
|
142
|
+
"""
|
|
143
|
+
left, right = self._list
|
|
144
|
+
new_subset = self._subset.change_labels(labels)
|
|
145
|
+
left_labels = new_subset.label_subset()
|
|
146
|
+
right_labels = new_subset.complement().label_subset()
|
|
147
|
+
return self.__class__(self.parent(), labels,
|
|
148
|
+
new_subset,
|
|
149
|
+
left.change_labels(left_labels),
|
|
150
|
+
right.change_labels(right_labels))
|
|
151
|
+
|
|
152
|
+
def automorphism_group(self):
|
|
153
|
+
"""
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: # needs sage.groups
|
|
157
|
+
sage: p = PermutationGroupElement((2,3))
|
|
158
|
+
sage: S = species.SetSpecies()
|
|
159
|
+
sage: F = S * S
|
|
160
|
+
sage: a = F.structures([1,2,3,4])[1]; a
|
|
161
|
+
{1}*{2, 3, 4}
|
|
162
|
+
sage: a.automorphism_group()
|
|
163
|
+
Permutation Group with generators [(2,3), (2,3,4)]
|
|
164
|
+
|
|
165
|
+
::
|
|
166
|
+
|
|
167
|
+
sage: [a.transport(g) for g in a.automorphism_group()] # needs sage.groups
|
|
168
|
+
[{1}*{2, 3, 4},
|
|
169
|
+
{1}*{2, 3, 4},
|
|
170
|
+
{1}*{2, 3, 4},
|
|
171
|
+
{1}*{2, 3, 4},
|
|
172
|
+
{1}*{2, 3, 4},
|
|
173
|
+
{1}*{2, 3, 4}]
|
|
174
|
+
|
|
175
|
+
::
|
|
176
|
+
|
|
177
|
+
sage: a = F.structures([1,2,3,4])[8]; a # needs sage.groups
|
|
178
|
+
{2, 3}*{1, 4}
|
|
179
|
+
sage: [a.transport(g) for g in a.automorphism_group()] # needs sage.groups
|
|
180
|
+
[{2, 3}*{1, 4}, {2, 3}*{1, 4}, {2, 3}*{1, 4}, {2, 3}*{1, 4}]
|
|
181
|
+
"""
|
|
182
|
+
from sage.groups.perm_gps.constructor import PermutationGroupElement
|
|
183
|
+
from sage.groups.perm_gps.permgroup import PermutationGroup
|
|
184
|
+
from sage.combinat.species.misc import change_support
|
|
185
|
+
|
|
186
|
+
left, right = self._list
|
|
187
|
+
|
|
188
|
+
# Get the supports for each of the sides
|
|
189
|
+
l_support = self._subset._list
|
|
190
|
+
r_support = self._subset.complement()._list
|
|
191
|
+
|
|
192
|
+
# Get the automorphism group for the left object and
|
|
193
|
+
# make it have the correct support. Do the same to the
|
|
194
|
+
# right side.
|
|
195
|
+
l_aut = change_support(left.automorphism_group(), l_support)
|
|
196
|
+
r_aut = change_support(right.automorphism_group(), r_support)
|
|
197
|
+
|
|
198
|
+
identity = PermutationGroupElement([])
|
|
199
|
+
|
|
200
|
+
gens = l_aut.gens() + r_aut.gens()
|
|
201
|
+
gens = [g for g in gens if g != identity]
|
|
202
|
+
gens = sorted(set(gens)) if gens else [[]]
|
|
203
|
+
return PermutationGroup(gens)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class ProductSpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
207
|
+
def __init__(self, F, G, min=None, max=None, weight=None):
|
|
208
|
+
"""
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: X = species.SingletonSpecies()
|
|
212
|
+
sage: A = X*X
|
|
213
|
+
sage: A.generating_series()[0:4]
|
|
214
|
+
[0, 0, 1, 0]
|
|
215
|
+
|
|
216
|
+
sage: P = species.PermutationSpecies()
|
|
217
|
+
sage: F = P * P; F
|
|
218
|
+
Product of (Permutation species) and (Permutation species)
|
|
219
|
+
sage: F == loads(dumps(F))
|
|
220
|
+
True
|
|
221
|
+
sage: F._check() # needs sage.libs.flint
|
|
222
|
+
True
|
|
223
|
+
|
|
224
|
+
TESTS::
|
|
225
|
+
|
|
226
|
+
sage: X = species.SingletonSpecies()
|
|
227
|
+
sage: X*X is X*X
|
|
228
|
+
True
|
|
229
|
+
"""
|
|
230
|
+
self._F = F
|
|
231
|
+
self._G = G
|
|
232
|
+
self._state_info = [F, G]
|
|
233
|
+
GenericCombinatorialSpecies.__init__(self, min=None, max=None, weight=weight)
|
|
234
|
+
|
|
235
|
+
_default_structure_class = ProductSpeciesStructure
|
|
236
|
+
|
|
237
|
+
def left_factor(self):
|
|
238
|
+
"""
|
|
239
|
+
Return the left factor of this product.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: P = species.PermutationSpecies()
|
|
244
|
+
sage: X = species.SingletonSpecies()
|
|
245
|
+
sage: F = P*X
|
|
246
|
+
sage: F.left_factor()
|
|
247
|
+
Permutation species
|
|
248
|
+
"""
|
|
249
|
+
return self._F
|
|
250
|
+
|
|
251
|
+
def right_factor(self):
|
|
252
|
+
"""
|
|
253
|
+
Return the right factor of this product.
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: P = species.PermutationSpecies()
|
|
258
|
+
sage: X = species.SingletonSpecies()
|
|
259
|
+
sage: F = P*X
|
|
260
|
+
sage: F.right_factor()
|
|
261
|
+
Singleton species
|
|
262
|
+
"""
|
|
263
|
+
return self._G
|
|
264
|
+
|
|
265
|
+
def _name(self):
|
|
266
|
+
"""
|
|
267
|
+
Note that we use a function to return the name of this species
|
|
268
|
+
because we can't do it in the __init__ method due to it
|
|
269
|
+
requiring that self.left_factor() and self.right_factor()
|
|
270
|
+
already be unpickled.
|
|
271
|
+
|
|
272
|
+
EXAMPLES::
|
|
273
|
+
|
|
274
|
+
sage: P = species.PermutationSpecies()
|
|
275
|
+
sage: F = P * P
|
|
276
|
+
sage: F._name()
|
|
277
|
+
'Product of (Permutation species) and (Permutation species)'
|
|
278
|
+
"""
|
|
279
|
+
return "Product of (%s) and (%s)" % (self.left_factor(), self.right_factor())
|
|
280
|
+
|
|
281
|
+
def _structures(self, structure_class, labels):
|
|
282
|
+
"""
|
|
283
|
+
EXAMPLES::
|
|
284
|
+
|
|
285
|
+
sage: S = species.SetSpecies()
|
|
286
|
+
sage: F = S * S
|
|
287
|
+
sage: F.structures([1,2]).list()
|
|
288
|
+
[{}*{1, 2}, {1}*{2}, {2}*{1}, {1, 2}*{}]
|
|
289
|
+
"""
|
|
290
|
+
return self._times_gen(structure_class, "structures", labels)
|
|
291
|
+
|
|
292
|
+
def _isotypes(self, structure_class, labels):
|
|
293
|
+
"""
|
|
294
|
+
EXAMPLES::
|
|
295
|
+
|
|
296
|
+
sage: S = species.SetSpecies()
|
|
297
|
+
sage: F = S * S
|
|
298
|
+
sage: F.isotypes([1,2,3]).list()
|
|
299
|
+
[{}*{1, 2, 3}, {1}*{2, 3}, {1, 2}*{3}, {1, 2, 3}*{}]
|
|
300
|
+
"""
|
|
301
|
+
return self._times_gen(structure_class, "isotypes", labels)
|
|
302
|
+
|
|
303
|
+
def _times_gen(self, structure_class, attr, labels):
|
|
304
|
+
"""
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: S = species.SetSpecies()
|
|
308
|
+
sage: F = S * S
|
|
309
|
+
sage: list(F._times_gen(F._default_structure_class, 'structures',[1,2]))
|
|
310
|
+
[{}*{1, 2}, {1}*{2}, {2}*{1}, {1, 2}*{}]
|
|
311
|
+
"""
|
|
312
|
+
def c(F, n):
|
|
313
|
+
return F.generating_series().coefficient(n)
|
|
314
|
+
S = SubsetSpecies()
|
|
315
|
+
|
|
316
|
+
for u in getattr(S, attr)(labels):
|
|
317
|
+
vl = u.complement().label_subset()
|
|
318
|
+
ul = u.label_subset()
|
|
319
|
+
if c(self.left_factor(), len(ul)) == 0 or c(self.right_factor(), len(vl)) == 0:
|
|
320
|
+
continue
|
|
321
|
+
for x in getattr(self.left_factor(), attr)(ul):
|
|
322
|
+
for y in getattr(self.right_factor(), attr)(vl):
|
|
323
|
+
yield structure_class(self, labels, u, x, y)
|
|
324
|
+
|
|
325
|
+
def _gs(self, series_ring, base_ring):
|
|
326
|
+
"""
|
|
327
|
+
EXAMPLES::
|
|
328
|
+
|
|
329
|
+
sage: P = species.PermutationSpecies()
|
|
330
|
+
sage: F = P * P
|
|
331
|
+
sage: F.generating_series()[0:5]
|
|
332
|
+
[1, 2, 3, 4, 5]
|
|
333
|
+
"""
|
|
334
|
+
res = (self.left_factor().generating_series(base_ring) *
|
|
335
|
+
self.right_factor().generating_series(base_ring))
|
|
336
|
+
if self.is_weighted():
|
|
337
|
+
res = self._weight * res
|
|
338
|
+
return res
|
|
339
|
+
|
|
340
|
+
def _itgs(self, series_ring, base_ring):
|
|
341
|
+
"""
|
|
342
|
+
EXAMPLES::
|
|
343
|
+
|
|
344
|
+
sage: P = species.PermutationSpecies()
|
|
345
|
+
sage: F = P * P
|
|
346
|
+
sage: F.isotype_generating_series()[0:5] # needs sage.libs.flint
|
|
347
|
+
[1, 2, 5, 10, 20]
|
|
348
|
+
"""
|
|
349
|
+
res = (self.left_factor().isotype_generating_series(base_ring) *
|
|
350
|
+
self.right_factor().isotype_generating_series(base_ring))
|
|
351
|
+
if self.is_weighted():
|
|
352
|
+
res = self._weight * res
|
|
353
|
+
return res
|
|
354
|
+
|
|
355
|
+
def _cis(self, series_ring, base_ring):
|
|
356
|
+
"""
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: P = species.PermutationSpecies()
|
|
360
|
+
sage: F = P * P
|
|
361
|
+
sage: F.cycle_index_series()[0:5] # needs sage.modules
|
|
362
|
+
[p[],
|
|
363
|
+
2*p[1],
|
|
364
|
+
3*p[1, 1] + 2*p[2],
|
|
365
|
+
4*p[1, 1, 1] + 4*p[2, 1] + 2*p[3],
|
|
366
|
+
5*p[1, 1, 1, 1] + 6*p[2, 1, 1] + 3*p[2, 2] + 4*p[3, 1] + 2*p[4]]
|
|
367
|
+
"""
|
|
368
|
+
res = (self.left_factor().cycle_index_series(base_ring) *
|
|
369
|
+
self.right_factor().cycle_index_series(base_ring))
|
|
370
|
+
if self.is_weighted():
|
|
371
|
+
res = self._weight * res
|
|
372
|
+
return res
|
|
373
|
+
|
|
374
|
+
def weight_ring(self):
|
|
375
|
+
"""
|
|
376
|
+
Return the weight ring for this species. This is determined by
|
|
377
|
+
asking Sage's coercion model what the result is when you multiply
|
|
378
|
+
(and add) elements of the weight rings for each of the operands.
|
|
379
|
+
|
|
380
|
+
EXAMPLES::
|
|
381
|
+
|
|
382
|
+
sage: S = species.SetSpecies()
|
|
383
|
+
sage: C = S*S
|
|
384
|
+
sage: C.weight_ring()
|
|
385
|
+
Rational Field
|
|
386
|
+
|
|
387
|
+
::
|
|
388
|
+
|
|
389
|
+
sage: S = species.SetSpecies(weight=QQ['t'].gen())
|
|
390
|
+
sage: C = S*S
|
|
391
|
+
sage: C.weight_ring()
|
|
392
|
+
Univariate Polynomial Ring in t over Rational Field
|
|
393
|
+
|
|
394
|
+
::
|
|
395
|
+
|
|
396
|
+
sage: S = species.SetSpecies()
|
|
397
|
+
sage: C = (S*S).weighted(QQ['t'].gen())
|
|
398
|
+
sage: C.weight_ring()
|
|
399
|
+
Univariate Polynomial Ring in t over Rational Field
|
|
400
|
+
"""
|
|
401
|
+
return self._common_parent([self.left_factor().weight_ring(),
|
|
402
|
+
self.right_factor().weight_ring(),
|
|
403
|
+
self._weight.parent()])
|
|
404
|
+
|
|
405
|
+
def _equation(self, var_mapping):
|
|
406
|
+
"""
|
|
407
|
+
Return the right hand side of an algebraic equation satisfied by
|
|
408
|
+
this species. This is a utility function called by the
|
|
409
|
+
algebraic_equation_system method.
|
|
410
|
+
|
|
411
|
+
EXAMPLES::
|
|
412
|
+
|
|
413
|
+
sage: X = species.SingletonSpecies()
|
|
414
|
+
sage: S = X * X
|
|
415
|
+
sage: S.algebraic_equation_system() # needs sage.graphs
|
|
416
|
+
[node0 + (-z^2)]
|
|
417
|
+
"""
|
|
418
|
+
from sage.misc.misc_c import prod
|
|
419
|
+
return prod(var_mapping[operand] for operand in self._state_info)
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
# Backward compatibility
|
|
423
|
+
ProductSpecies_class = ProductSpecies
|