passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.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/DELVEWHEEL +2 -0
- passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.42.dist-info/RECORD +401 -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-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
- passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +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 +44 -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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +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.cp314t-win_amd64.pyd +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Cycle species
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2008 Mike Hansen <mhansen@gmail.com>,
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
# http://www.gnu.org/licenses/
|
|
14
|
+
# ***************************************************************************
|
|
15
|
+
|
|
16
|
+
from sage.arith.misc import divisors, euler_phi
|
|
17
|
+
from sage.combinat.species.misc import accept_size
|
|
18
|
+
from sage.combinat.species.species import GenericCombinatorialSpecies
|
|
19
|
+
from sage.combinat.species.structure import GenericSpeciesStructure
|
|
20
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CycleSpeciesStructure(GenericSpeciesStructure):
|
|
24
|
+
def __repr__(self):
|
|
25
|
+
"""
|
|
26
|
+
EXAMPLES::
|
|
27
|
+
|
|
28
|
+
sage: S = species.CycleSpecies()
|
|
29
|
+
sage: S.structures(["a","b","c"])[0]
|
|
30
|
+
('a', 'b', 'c')
|
|
31
|
+
"""
|
|
32
|
+
s = GenericSpeciesStructure.__repr__(self)
|
|
33
|
+
return "("+s[1:-1]+")"
|
|
34
|
+
|
|
35
|
+
def canonical_label(self):
|
|
36
|
+
"""
|
|
37
|
+
EXAMPLES::
|
|
38
|
+
|
|
39
|
+
sage: P = species.CycleSpecies()
|
|
40
|
+
sage: P.structures(["a","b","c"]).random_element().canonical_label()
|
|
41
|
+
('a', 'b', 'c')
|
|
42
|
+
"""
|
|
43
|
+
n = len(self._labels)
|
|
44
|
+
return CycleSpeciesStructure(self.parent(), self._labels, range(1, n+1))
|
|
45
|
+
|
|
46
|
+
def permutation_group_element(self):
|
|
47
|
+
"""
|
|
48
|
+
Return this cycle as a permutation group element.
|
|
49
|
+
|
|
50
|
+
EXAMPLES::
|
|
51
|
+
|
|
52
|
+
sage: F = species.CycleSpecies()
|
|
53
|
+
sage: a = F.structures(["a", "b", "c"])[0]; a
|
|
54
|
+
('a', 'b', 'c')
|
|
55
|
+
sage: a.permutation_group_element() # needs sage.groups
|
|
56
|
+
(1,2,3)
|
|
57
|
+
"""
|
|
58
|
+
from sage.groups.perm_gps.constructor import PermutationGroupElement
|
|
59
|
+
return PermutationGroupElement(tuple(self._list))
|
|
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: F = species.CycleSpecies()
|
|
69
|
+
sage: a = F.structures(["a", "b", "c"])[0]; a
|
|
70
|
+
('a', 'b', 'c')
|
|
71
|
+
sage: p = PermutationGroupElement((1,2)) # needs sage.groups
|
|
72
|
+
sage: a.transport(p) # needs sage.groups
|
|
73
|
+
('a', 'c', 'b')
|
|
74
|
+
"""
|
|
75
|
+
p = self.permutation_group_element()
|
|
76
|
+
p = perm*p*~perm
|
|
77
|
+
new_list = [1]
|
|
78
|
+
for i in range(len(self._list)-1):
|
|
79
|
+
new_list.append( p(new_list[-1]) )
|
|
80
|
+
return CycleSpeciesStructure(self.parent(), self._labels, new_list)
|
|
81
|
+
|
|
82
|
+
def automorphism_group(self):
|
|
83
|
+
"""
|
|
84
|
+
Return the group of permutations whose action on this structure
|
|
85
|
+
leave it fixed.
|
|
86
|
+
|
|
87
|
+
EXAMPLES::
|
|
88
|
+
|
|
89
|
+
sage: P = species.CycleSpecies()
|
|
90
|
+
sage: a = P.structures([1, 2, 3, 4])[0]; a
|
|
91
|
+
(1, 2, 3, 4)
|
|
92
|
+
sage: a.automorphism_group() # needs sage.groups
|
|
93
|
+
Permutation Group with generators [(1,2,3,4)]
|
|
94
|
+
|
|
95
|
+
::
|
|
96
|
+
|
|
97
|
+
sage: [a.transport(perm) for perm in a.automorphism_group()] # needs sage.groups
|
|
98
|
+
[(1, 2, 3, 4), (1, 2, 3, 4), (1, 2, 3, 4), (1, 2, 3, 4)]
|
|
99
|
+
"""
|
|
100
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
101
|
+
from sage.groups.perm_gps.permgroup import PermutationGroup
|
|
102
|
+
S = SymmetricGroup(len(self._labels))
|
|
103
|
+
p = self.permutation_group_element()
|
|
104
|
+
return PermutationGroup(S.centralizer(p).gens())
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class CycleSpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
108
|
+
@staticmethod
|
|
109
|
+
@accept_size
|
|
110
|
+
def __classcall__(cls, *args, **kwds):
|
|
111
|
+
r"""
|
|
112
|
+
EXAMPLES::
|
|
113
|
+
|
|
114
|
+
sage: C = species.CycleSpecies(); C
|
|
115
|
+
Cyclic permutation species
|
|
116
|
+
"""
|
|
117
|
+
return super().__classcall__(cls, *args, **kwds)
|
|
118
|
+
|
|
119
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
120
|
+
"""
|
|
121
|
+
Return the species of cycles.
|
|
122
|
+
|
|
123
|
+
EXAMPLES::
|
|
124
|
+
|
|
125
|
+
sage: C = species.CycleSpecies(); C
|
|
126
|
+
Cyclic permutation species
|
|
127
|
+
sage: C.structures([1,2,3,4]).list()
|
|
128
|
+
[(1, 2, 3, 4),
|
|
129
|
+
(1, 2, 4, 3),
|
|
130
|
+
(1, 3, 2, 4),
|
|
131
|
+
(1, 3, 4, 2),
|
|
132
|
+
(1, 4, 2, 3),
|
|
133
|
+
(1, 4, 3, 2)]
|
|
134
|
+
|
|
135
|
+
TESTS:
|
|
136
|
+
|
|
137
|
+
We check to verify that the caching of species is actually
|
|
138
|
+
working.
|
|
139
|
+
|
|
140
|
+
::
|
|
141
|
+
|
|
142
|
+
sage: species.CycleSpecies() is species.CycleSpecies()
|
|
143
|
+
True
|
|
144
|
+
|
|
145
|
+
sage: P = species.CycleSpecies()
|
|
146
|
+
sage: c = P.generating_series()[:3]
|
|
147
|
+
sage: P._check()
|
|
148
|
+
True
|
|
149
|
+
sage: P == loads(dumps(P))
|
|
150
|
+
True
|
|
151
|
+
"""
|
|
152
|
+
GenericCombinatorialSpecies.__init__(self, min=min, max=max, weight=weight)
|
|
153
|
+
self._name = "Cyclic permutation species"
|
|
154
|
+
|
|
155
|
+
_default_structure_class = CycleSpeciesStructure
|
|
156
|
+
|
|
157
|
+
def _structures(self, structure_class, labels):
|
|
158
|
+
"""
|
|
159
|
+
EXAMPLES::
|
|
160
|
+
|
|
161
|
+
sage: P = species.CycleSpecies()
|
|
162
|
+
sage: P.structures([1,2,3]).list()
|
|
163
|
+
[(1, 2, 3), (1, 3, 2)]
|
|
164
|
+
"""
|
|
165
|
+
from sage.combinat.permutation import CyclicPermutations
|
|
166
|
+
for c in CyclicPermutations(range(1, len(labels)+1)):
|
|
167
|
+
yield structure_class(self, labels, c)
|
|
168
|
+
|
|
169
|
+
def _isotypes(self, structure_class, labels):
|
|
170
|
+
"""
|
|
171
|
+
EXAMPLES::
|
|
172
|
+
|
|
173
|
+
sage: P = species.CycleSpecies()
|
|
174
|
+
sage: P.isotypes([1,2,3]).list()
|
|
175
|
+
[(1, 2, 3)]
|
|
176
|
+
"""
|
|
177
|
+
if len(labels) != 0:
|
|
178
|
+
yield structure_class(self, labels, range(1, len(labels)+1))
|
|
179
|
+
|
|
180
|
+
def _gs_callable(self, base_ring, n):
|
|
181
|
+
r"""
|
|
182
|
+
The generating series for cyclic permutations is
|
|
183
|
+
`-\log(1-x) = \sum_{n=1}^\infty x^n/n`.
|
|
184
|
+
|
|
185
|
+
EXAMPLES::
|
|
186
|
+
|
|
187
|
+
sage: P = species.CycleSpecies()
|
|
188
|
+
sage: g = P.generating_series()
|
|
189
|
+
sage: g[0:10]
|
|
190
|
+
[0, 1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9]
|
|
191
|
+
|
|
192
|
+
TESTS::
|
|
193
|
+
|
|
194
|
+
sage: P = species.CycleSpecies()
|
|
195
|
+
sage: g = P.generating_series(RR)
|
|
196
|
+
sage: g[0:3]
|
|
197
|
+
[0.0..., 1.0..., 0.5...]
|
|
198
|
+
"""
|
|
199
|
+
if n:
|
|
200
|
+
return self._weight * base_ring.one() / n
|
|
201
|
+
return base_ring.zero()
|
|
202
|
+
|
|
203
|
+
def _order(self):
|
|
204
|
+
"""
|
|
205
|
+
Return the order of the generating series.
|
|
206
|
+
|
|
207
|
+
EXAMPLES::
|
|
208
|
+
|
|
209
|
+
sage: P = species.CycleSpecies()
|
|
210
|
+
sage: P._order()
|
|
211
|
+
1
|
|
212
|
+
"""
|
|
213
|
+
return 1
|
|
214
|
+
|
|
215
|
+
def _itgs_list(self, base_ring, n):
|
|
216
|
+
"""
|
|
217
|
+
The isomorphism type generating series for cyclic permutations is
|
|
218
|
+
given by `x/(1-x)`.
|
|
219
|
+
|
|
220
|
+
EXAMPLES::
|
|
221
|
+
|
|
222
|
+
sage: P = species.CycleSpecies()
|
|
223
|
+
sage: g = P.isotype_generating_series()
|
|
224
|
+
sage: g[0:5]
|
|
225
|
+
[0, 1, 1, 1, 1]
|
|
226
|
+
|
|
227
|
+
TESTS::
|
|
228
|
+
|
|
229
|
+
sage: P = species.CycleSpecies()
|
|
230
|
+
sage: g = P.isotype_generating_series(RR)
|
|
231
|
+
sage: g[0:3]
|
|
232
|
+
[0.0..., 1.0..., 1.0...]
|
|
233
|
+
"""
|
|
234
|
+
if n:
|
|
235
|
+
return self._weight * base_ring.one()
|
|
236
|
+
return base_ring.zero()
|
|
237
|
+
|
|
238
|
+
def _cis_callable(self, base_ring, n):
|
|
239
|
+
r"""
|
|
240
|
+
The cycle index series of the species of cyclic permutations is
|
|
241
|
+
given by
|
|
242
|
+
|
|
243
|
+
.. MATH::
|
|
244
|
+
|
|
245
|
+
-\sum_{k=1}^\infty \phi(k)/k * log(1 - x_k)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
which is equal to
|
|
249
|
+
|
|
250
|
+
.. MATH::
|
|
251
|
+
|
|
252
|
+
\sum_{n=1}^\infty \frac{1}{n} * \sum_{k|n} \phi(k) * x_k^{n/k}
|
|
253
|
+
|
|
254
|
+
.
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: P = species.CycleSpecies()
|
|
259
|
+
sage: cis = P.cycle_index_series() # needs sage.modules
|
|
260
|
+
sage: cis[0:7] # needs sage.libs.pari sage.modules
|
|
261
|
+
[0,
|
|
262
|
+
p[1],
|
|
263
|
+
1/2*p[1, 1] + 1/2*p[2],
|
|
264
|
+
1/3*p[1, 1, 1] + 2/3*p[3],
|
|
265
|
+
1/4*p[1, 1, 1, 1] + 1/4*p[2, 2] + 1/2*p[4],
|
|
266
|
+
1/5*p[1, 1, 1, 1, 1] + 4/5*p[5],
|
|
267
|
+
1/6*p[1, 1, 1, 1, 1, 1] + 1/6*p[2, 2, 2] + 1/3*p[3, 3] + 1/3*p[6]]
|
|
268
|
+
"""
|
|
269
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
270
|
+
p = SymmetricFunctions(base_ring).power()
|
|
271
|
+
|
|
272
|
+
zero = base_ring.zero()
|
|
273
|
+
|
|
274
|
+
if not n:
|
|
275
|
+
return zero
|
|
276
|
+
res = zero
|
|
277
|
+
for k in divisors(n):
|
|
278
|
+
res += euler_phi(k)*p([k])**(n//k)
|
|
279
|
+
res /= n
|
|
280
|
+
return self._weight * res
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
#Backward compatibility
|
|
284
|
+
CycleSpecies_class = CycleSpecies
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Empty species
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2008 Florent Hivert <Florent.Hivert@univ-rouen,fr>,
|
|
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 sage.structure.unique_representation import UniqueRepresentation
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EmptySpecies(GenericCombinatorialSpecies, UniqueRepresentation):
|
|
24
|
+
"""
|
|
25
|
+
Return the empty species. This species has no structure at all.
|
|
26
|
+
It is the zero of the semi-ring of species.
|
|
27
|
+
|
|
28
|
+
EXAMPLES::
|
|
29
|
+
|
|
30
|
+
sage: X = species.EmptySpecies(); X
|
|
31
|
+
Empty species
|
|
32
|
+
sage: X.structures([]).list()
|
|
33
|
+
[]
|
|
34
|
+
sage: X.structures([1]).list()
|
|
35
|
+
[]
|
|
36
|
+
sage: X.structures([1,2]).list()
|
|
37
|
+
[]
|
|
38
|
+
sage: X.generating_series()[0:4]
|
|
39
|
+
[0, 0, 0, 0]
|
|
40
|
+
sage: X.isotype_generating_series()[0:4]
|
|
41
|
+
[0, 0, 0, 0]
|
|
42
|
+
sage: X.cycle_index_series()[0:4] # needs sage.modules
|
|
43
|
+
[0, 0, 0, 0]
|
|
44
|
+
|
|
45
|
+
The empty species is the zero of the semi-ring of species.
|
|
46
|
+
The following tests that it is neutral with respect to addition::
|
|
47
|
+
|
|
48
|
+
sage: Empt = species.EmptySpecies()
|
|
49
|
+
sage: S = species.CharacteristicSpecies(2)
|
|
50
|
+
sage: X = S + Empt
|
|
51
|
+
sage: X == S # TODO: Not Implemented
|
|
52
|
+
True
|
|
53
|
+
sage: (X.generating_series()[0:4] ==
|
|
54
|
+
....: S.generating_series()[0:4])
|
|
55
|
+
True
|
|
56
|
+
sage: (X.isotype_generating_series()[0:4] ==
|
|
57
|
+
....: S.isotype_generating_series()[0:4])
|
|
58
|
+
True
|
|
59
|
+
sage: (X.cycle_index_series()[0:4] == # needs sage.modules
|
|
60
|
+
....: S.cycle_index_series()[0:4])
|
|
61
|
+
True
|
|
62
|
+
|
|
63
|
+
The following tests that it is the zero element with respect to
|
|
64
|
+
multiplication::
|
|
65
|
+
|
|
66
|
+
sage: Y = Empt*S
|
|
67
|
+
sage: Y == Empt # TODO: Not Implemented
|
|
68
|
+
True
|
|
69
|
+
sage: Y.generating_series()[0:4]
|
|
70
|
+
[0, 0, 0, 0]
|
|
71
|
+
sage: Y.isotype_generating_series()[0:4]
|
|
72
|
+
[0, 0, 0, 0]
|
|
73
|
+
sage: Y.cycle_index_series()[0:4] # needs sage.modules
|
|
74
|
+
[0, 0, 0, 0]
|
|
75
|
+
|
|
76
|
+
TESTS::
|
|
77
|
+
|
|
78
|
+
sage: Empt = species.EmptySpecies()
|
|
79
|
+
sage: Empt2 = species.EmptySpecies()
|
|
80
|
+
sage: Empt is Empt2
|
|
81
|
+
True
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def __init__(self, min=None, max=None, weight=None):
|
|
85
|
+
"""
|
|
86
|
+
Initializer for the empty species.
|
|
87
|
+
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: F = species.EmptySpecies()
|
|
91
|
+
sage: F._check()
|
|
92
|
+
True
|
|
93
|
+
sage: F == loads(dumps(F))
|
|
94
|
+
True
|
|
95
|
+
"""
|
|
96
|
+
# There is no structure at all, so we set min and max accordingly.
|
|
97
|
+
GenericCombinatorialSpecies.__init__(self, weight=weight)
|
|
98
|
+
self._name = "Empty species"
|
|
99
|
+
|
|
100
|
+
def _gs(self, series_ring, base_ring):
|
|
101
|
+
"""
|
|
102
|
+
Return the generating series for ``self``.
|
|
103
|
+
|
|
104
|
+
EXAMPLES::
|
|
105
|
+
|
|
106
|
+
sage: F = species.EmptySpecies()
|
|
107
|
+
sage: F.generating_series()[0:5] # indirect doctest
|
|
108
|
+
[0, 0, 0, 0, 0]
|
|
109
|
+
sage: F.generating_series().count(3)
|
|
110
|
+
0
|
|
111
|
+
sage: F.generating_series().count(4)
|
|
112
|
+
0
|
|
113
|
+
"""
|
|
114
|
+
return series_ring.zero()
|
|
115
|
+
|
|
116
|
+
_itgs = _gs
|
|
117
|
+
_cis = _gs
|
|
118
|
+
|
|
119
|
+
def _structures(self, structure_class, labels):
|
|
120
|
+
"""
|
|
121
|
+
Thanks to the counting optimisation, this is never called... Otherwise
|
|
122
|
+
this should return an empty iterator.
|
|
123
|
+
|
|
124
|
+
EXAMPLES::
|
|
125
|
+
|
|
126
|
+
sage: F = species.EmptySpecies()
|
|
127
|
+
sage: F.structures([]).list() # indirect doctest
|
|
128
|
+
[]
|
|
129
|
+
sage: F.structures([1,2,3]).list() # indirect doctest
|
|
130
|
+
[]
|
|
131
|
+
"""
|
|
132
|
+
assert False, "This should never be called"
|
|
133
|
+
|
|
134
|
+
_default_structure_class = 0
|
|
135
|
+
_isotypes = _structures
|
|
136
|
+
|
|
137
|
+
def _equation(self, var_mapping):
|
|
138
|
+
"""
|
|
139
|
+
Return the right hand side of an algebraic equation satisfied by
|
|
140
|
+
this species. This is a utility function called by the
|
|
141
|
+
algebraic_equation_system method.
|
|
142
|
+
|
|
143
|
+
EXAMPLES::
|
|
144
|
+
|
|
145
|
+
sage: C = species.EmptySpecies()
|
|
146
|
+
sage: Qz = QQ['z']
|
|
147
|
+
sage: R.<node0> = Qz[]
|
|
148
|
+
sage: var_mapping = {'z':Qz.gen(), 'node0':R.gen()}
|
|
149
|
+
sage: C._equation(var_mapping)
|
|
150
|
+
0
|
|
151
|
+
"""
|
|
152
|
+
return 0
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
EmptySpecies_class = EmptySpecies
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Functorial composition 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
|
+
|
|
22
|
+
|
|
23
|
+
class FunctorialCompositionStructure(GenericSpeciesStructure):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class FunctorialCompositionSpecies(GenericCombinatorialSpecies):
|
|
28
|
+
def __init__(self, F, G, min=None, max=None, weight=None):
|
|
29
|
+
"""
|
|
30
|
+
Return the functorial composition of two species.
|
|
31
|
+
|
|
32
|
+
EXAMPLES::
|
|
33
|
+
|
|
34
|
+
sage: E = species.SetSpecies()
|
|
35
|
+
sage: E2 = species.SetSpecies(size=2)
|
|
36
|
+
sage: WP = species.SubsetSpecies()
|
|
37
|
+
sage: P2 = E2*E
|
|
38
|
+
sage: G = WP.functorial_composition(P2)
|
|
39
|
+
sage: G.isotype_generating_series()[0:5] # needs sage.modules
|
|
40
|
+
[1, 1, 2, 4, 11]
|
|
41
|
+
|
|
42
|
+
sage: G = species.SimpleGraphSpecies()
|
|
43
|
+
sage: c = G.generating_series()[0:2]
|
|
44
|
+
sage: type(G)
|
|
45
|
+
<class 'sage.combinat.species.functorial_composition_species.FunctorialCompositionSpecies'>
|
|
46
|
+
sage: G == loads(dumps(G))
|
|
47
|
+
True
|
|
48
|
+
sage: G._check() # False due to isomorphism types not being implemented # needs sage.modules
|
|
49
|
+
False
|
|
50
|
+
"""
|
|
51
|
+
self._F = F
|
|
52
|
+
self._G = G
|
|
53
|
+
self._state_info = [F, G]
|
|
54
|
+
self._name = f"Functorial composition of ({F}) and ({G})"
|
|
55
|
+
GenericCombinatorialSpecies.__init__(self, min=None, max=None, weight=None)
|
|
56
|
+
|
|
57
|
+
_default_structure_class = FunctorialCompositionStructure
|
|
58
|
+
|
|
59
|
+
def _structures(self, structure_class, s):
|
|
60
|
+
"""
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: G = species.SimpleGraphSpecies()
|
|
64
|
+
sage: G.structures([1,2,3]).list()
|
|
65
|
+
[{},
|
|
66
|
+
{{1, 2}*{3}},
|
|
67
|
+
{{1, 3}*{2}},
|
|
68
|
+
{{2, 3}*{1}},
|
|
69
|
+
{{1, 2}*{3}, {1, 3}*{2}},
|
|
70
|
+
{{1, 2}*{3}, {2, 3}*{1}},
|
|
71
|
+
{{1, 3}*{2}, {2, 3}*{1}},
|
|
72
|
+
{{1, 2}*{3}, {1, 3}*{2}, {2, 3}*{1}}]
|
|
73
|
+
"""
|
|
74
|
+
gs = self._G.structures(s).list()
|
|
75
|
+
yield from self._F.structures(gs)
|
|
76
|
+
|
|
77
|
+
def _isotypes(self, structure_class, s):
|
|
78
|
+
"""
|
|
79
|
+
There is no known algorithm for efficiently generating the
|
|
80
|
+
isomorphism types of the functorial composition of two species.
|
|
81
|
+
|
|
82
|
+
EXAMPLES::
|
|
83
|
+
|
|
84
|
+
sage: G = species.SimpleGraphSpecies()
|
|
85
|
+
sage: G.isotypes([1,2,3]).list() # needs sage.modules
|
|
86
|
+
Traceback (most recent call last):
|
|
87
|
+
...
|
|
88
|
+
NotImplementedError
|
|
89
|
+
"""
|
|
90
|
+
raise NotImplementedError
|
|
91
|
+
|
|
92
|
+
def _gs(self, series_ring, base_ring):
|
|
93
|
+
"""
|
|
94
|
+
EXAMPLES::
|
|
95
|
+
|
|
96
|
+
sage: G = species.SimpleGraphSpecies()
|
|
97
|
+
sage: G.generating_series()[0:5]
|
|
98
|
+
[1, 1, 1, 4/3, 8/3]
|
|
99
|
+
"""
|
|
100
|
+
return self._F.generating_series(base_ring).functorial_composition(self._G.generating_series(base_ring))
|
|
101
|
+
|
|
102
|
+
def _itgs(self, series_ring, base_ring):
|
|
103
|
+
"""
|
|
104
|
+
EXAMPLES::
|
|
105
|
+
|
|
106
|
+
sage: G = species.SimpleGraphSpecies()
|
|
107
|
+
sage: G.isotype_generating_series()[0:5] # needs sage.modules
|
|
108
|
+
[1, 1, 2, 4, 11]
|
|
109
|
+
"""
|
|
110
|
+
return self.cycle_index_series(base_ring).isotype_generating_series()
|
|
111
|
+
|
|
112
|
+
def _cis(self, series_ring, base_ring):
|
|
113
|
+
"""
|
|
114
|
+
EXAMPLES::
|
|
115
|
+
|
|
116
|
+
sage: G = species.SimpleGraphSpecies()
|
|
117
|
+
sage: G.cycle_index_series()[0:5] # needs sage.modules
|
|
118
|
+
[p[],
|
|
119
|
+
p[1],
|
|
120
|
+
p[1, 1] + p[2],
|
|
121
|
+
4/3*p[1, 1, 1] + 2*p[2, 1] + 2/3*p[3],
|
|
122
|
+
8/3*p[1, 1, 1, 1] + 4*p[2, 1, 1] + 2*p[2, 2] + 4/3*p[3, 1] + p[4]]
|
|
123
|
+
"""
|
|
124
|
+
return self._F.cycle_index_series(base_ring).functorial_composition(self._G.cycle_index_series(base_ring))
|
|
125
|
+
|
|
126
|
+
def weight_ring(self):
|
|
127
|
+
"""
|
|
128
|
+
Return the weight ring for this species. This is determined by
|
|
129
|
+
asking Sage's coercion model what the result is when you multiply
|
|
130
|
+
(and add) elements of the weight rings for each of the operands.
|
|
131
|
+
|
|
132
|
+
EXAMPLES::
|
|
133
|
+
|
|
134
|
+
sage: G = species.SimpleGraphSpecies()
|
|
135
|
+
sage: G.weight_ring()
|
|
136
|
+
Rational Field
|
|
137
|
+
"""
|
|
138
|
+
from sage.structure.element import get_coercion_model
|
|
139
|
+
cm = get_coercion_model()
|
|
140
|
+
|
|
141
|
+
f_weights = self._F.weight_ring()
|
|
142
|
+
g_weights = self._G.weight_ring()
|
|
143
|
+
|
|
144
|
+
return cm.explain(f_weights, g_weights, verbosity=0)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# Backward compatibility
|
|
148
|
+
FunctorialCompositionSpecies_class = FunctorialCompositionSpecies
|