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,525 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Monomial symmetric functions
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>
|
|
8
|
+
# 2010 Anne Schilling <anne at math.ucdavis.edu> (addition)
|
|
9
|
+
# 2012 Mike Zabrocki <mike.zabrocki@gmail.com>
|
|
10
|
+
#
|
|
11
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
12
|
+
#
|
|
13
|
+
# This code is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
16
|
+
# General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# The full text of the GPL is available at:
|
|
19
|
+
#
|
|
20
|
+
# https://www.gnu.org/licenses/
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
|
|
23
|
+
from sage.arith.misc import binomial, factorial, multinomial
|
|
24
|
+
from sage.combinat.partition import _Partitions
|
|
25
|
+
from sage.misc.lazy_import import lazy_import
|
|
26
|
+
from sage.rings.infinity import infinity
|
|
27
|
+
from sage.rings.integer import Integer
|
|
28
|
+
|
|
29
|
+
lazy_import('sage.libs.symmetrica', 'all', as_='symmetrica')
|
|
30
|
+
|
|
31
|
+
from . import classical
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class SymmetricFunctionAlgebra_monomial(classical.SymmetricFunctionAlgebra_classical):
|
|
35
|
+
def __init__(self, Sym):
|
|
36
|
+
"""
|
|
37
|
+
A class for methods related to monomial symmetric functions.
|
|
38
|
+
|
|
39
|
+
INPUT:
|
|
40
|
+
|
|
41
|
+
- ``self`` -- a monomial symmetric function basis
|
|
42
|
+
- ``Sym`` -- an instance of the ring of the symmetric functions
|
|
43
|
+
|
|
44
|
+
TESTS::
|
|
45
|
+
|
|
46
|
+
sage: # needs lrcalc_python
|
|
47
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
48
|
+
sage: m == loads(dumps(m))
|
|
49
|
+
True
|
|
50
|
+
sage: TestSuite(m).run(skip=['_test_associativity', '_test_distributivity', '_test_prod'])
|
|
51
|
+
sage: TestSuite(m).run(elements = [m[1,1]+m[2], m[1]+2*m[1,1]])
|
|
52
|
+
"""
|
|
53
|
+
classical.SymmetricFunctionAlgebra_classical.__init__(self, Sym, "monomial", 'm')
|
|
54
|
+
|
|
55
|
+
def _dual_basis_default(self):
|
|
56
|
+
"""
|
|
57
|
+
Return the default dual basis to ``self`` when no scalar product is specified.
|
|
58
|
+
|
|
59
|
+
This method returns the dual basis of the monomial basis with
|
|
60
|
+
respect to the standard scalar product, which is the
|
|
61
|
+
homogeneous basis.
|
|
62
|
+
|
|
63
|
+
EXAMPLES::
|
|
64
|
+
|
|
65
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
66
|
+
sage: h = SymmetricFunctions(QQ).h()
|
|
67
|
+
sage: m.dual_basis() == h
|
|
68
|
+
True
|
|
69
|
+
|
|
70
|
+
TESTS::
|
|
71
|
+
|
|
72
|
+
sage: m._dual_basis_default() is m.dual_basis()
|
|
73
|
+
True
|
|
74
|
+
sage: zee = lambda x : x.centralizer_size()
|
|
75
|
+
sage: dm = m.dual_basis(zee)
|
|
76
|
+
sage: dm[3,1].scalar(m[2,1,1])
|
|
77
|
+
0
|
|
78
|
+
sage: m[2,1,1].scalar(dm[3,1])
|
|
79
|
+
0
|
|
80
|
+
"""
|
|
81
|
+
return self.realization_of().h()
|
|
82
|
+
|
|
83
|
+
def product(self, left, right):
|
|
84
|
+
"""
|
|
85
|
+
Return the product of ``left`` and ``right``.
|
|
86
|
+
|
|
87
|
+
- ``left``, ``right`` -- symmetric functions written in the
|
|
88
|
+
monomial basis ``self``
|
|
89
|
+
|
|
90
|
+
OUTPUT:
|
|
91
|
+
|
|
92
|
+
- the product of ``left`` and ``right``, expanded in the
|
|
93
|
+
monomial basis, as a dictionary whose keys are partitions and
|
|
94
|
+
whose values are the coefficients of these partitions (more
|
|
95
|
+
precisely, their respective monomial symmetric functions) in the
|
|
96
|
+
product.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
101
|
+
sage: a = m([2,1])
|
|
102
|
+
sage: a^2
|
|
103
|
+
4*m[2, 2, 1, 1] + 6*m[2, 2, 2] + 2*m[3, 2, 1] + 2*m[3, 3] + 2*m[4, 1, 1] + m[4, 2]
|
|
104
|
+
|
|
105
|
+
::
|
|
106
|
+
|
|
107
|
+
sage: QQx.<x> = QQ['x']
|
|
108
|
+
sage: m = SymmetricFunctions(QQx).m()
|
|
109
|
+
sage: a = m([2,1])+x
|
|
110
|
+
sage: 2*a # indirect doctest
|
|
111
|
+
2*x*m[] + 2*m[2, 1]
|
|
112
|
+
sage: a^2
|
|
113
|
+
x^2*m[] + 2*x*m[2, 1] + 4*m[2, 2, 1, 1] + 6*m[2, 2, 2] + 2*m[3, 2, 1] + 2*m[3, 3] + 2*m[4, 1, 1] + m[4, 2]
|
|
114
|
+
"""
|
|
115
|
+
# Use symmetrica to do the multiplication
|
|
116
|
+
# A = left.parent()
|
|
117
|
+
|
|
118
|
+
# Hack due to symmetrica crashing when both of the
|
|
119
|
+
# partitions are the empty partition
|
|
120
|
+
# if R is ZZ or R is QQ:
|
|
121
|
+
# return symmetrica.mult_monomial_monomial(left, right)
|
|
122
|
+
|
|
123
|
+
z_elt = {}
|
|
124
|
+
for left_m, left_c in left._monomial_coefficients.items():
|
|
125
|
+
for right_m, right_c in right._monomial_coefficients.items():
|
|
126
|
+
|
|
127
|
+
# Hack due to symmetrica crashing when both of the
|
|
128
|
+
# partitions are the empty partition
|
|
129
|
+
if not left_m and not right_m:
|
|
130
|
+
z_elt[left_m] = left_c * right_c
|
|
131
|
+
continue
|
|
132
|
+
|
|
133
|
+
d = symmetrica.mult_monomial_monomial({left_m: Integer(1)},
|
|
134
|
+
{right_m: Integer(1)}).monomial_coefficients()
|
|
135
|
+
for m in d:
|
|
136
|
+
if m in z_elt:
|
|
137
|
+
z_elt[m] += left_c * right_c * d[m]
|
|
138
|
+
else:
|
|
139
|
+
z_elt[m] = left_c * right_c * d[m]
|
|
140
|
+
return self._from_dict(z_elt)
|
|
141
|
+
|
|
142
|
+
def from_polynomial(self, f, check=True):
|
|
143
|
+
r"""
|
|
144
|
+
Return the symmetric function in the monomial basis corresponding
|
|
145
|
+
to the polynomial ``f``.
|
|
146
|
+
|
|
147
|
+
INPUT:
|
|
148
|
+
|
|
149
|
+
- ``self`` -- a monomial symmetric function basis
|
|
150
|
+
- ``f`` -- a polynomial in finitely many variables over the
|
|
151
|
+
same base ring as ``self``; it is assumed that this
|
|
152
|
+
polynomial is symmetric
|
|
153
|
+
- ``check`` -- boolean (default: ``True``); checks whether
|
|
154
|
+
the polynomial is indeed symmetric
|
|
155
|
+
|
|
156
|
+
OUTPUT:
|
|
157
|
+
|
|
158
|
+
- This function converts a symmetric polynomial `f` in a
|
|
159
|
+
polynomial ring in finitely many variables to a symmetric
|
|
160
|
+
function in the monomial basis of the ring of symmetric
|
|
161
|
+
functions over the same base ring.
|
|
162
|
+
|
|
163
|
+
EXAMPLES::
|
|
164
|
+
|
|
165
|
+
sage: # needs sage.groups
|
|
166
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
167
|
+
sage: P = PolynomialRing(QQ, 'x', 3)
|
|
168
|
+
sage: x = P.gens()
|
|
169
|
+
sage: f = x[0] + x[1] + x[2]
|
|
170
|
+
sage: m.from_polynomial(f)
|
|
171
|
+
m[1]
|
|
172
|
+
sage: f = x[0]**2+x[1]**2+x[2]**2
|
|
173
|
+
sage: m.from_polynomial(f)
|
|
174
|
+
m[2]
|
|
175
|
+
sage: f = x[0]^2+x[1]
|
|
176
|
+
sage: m.from_polynomial(f)
|
|
177
|
+
Traceback (most recent call last):
|
|
178
|
+
...
|
|
179
|
+
ValueError: x0^2 + x1 is not a symmetric polynomial
|
|
180
|
+
sage: f = (m[2,1]+m[1,1]).expand(3)
|
|
181
|
+
sage: m.from_polynomial(f)
|
|
182
|
+
m[1, 1] + m[2, 1]
|
|
183
|
+
sage: f = (2*m[2,1]+m[1,1]+3*m[3]).expand(3)
|
|
184
|
+
sage: m.from_polynomial(f)
|
|
185
|
+
m[1, 1] + 2*m[2, 1] + 3*m[3]
|
|
186
|
+
|
|
187
|
+
"""
|
|
188
|
+
assert self.base_ring() == f.base_ring()
|
|
189
|
+
if check and not f.is_symmetric():
|
|
190
|
+
raise ValueError("%s is not a symmetric polynomial" % f)
|
|
191
|
+
out = self._from_dict({_Partitions.element_class(_Partitions, list(e)): c
|
|
192
|
+
for e, c in f.monomial_coefficients().items()
|
|
193
|
+
if all(e[i+1] <= e[i] for i in range(len(e)-1))},
|
|
194
|
+
remove_zeros=False)
|
|
195
|
+
return out
|
|
196
|
+
|
|
197
|
+
def from_polynomial_exp(self, p):
|
|
198
|
+
r"""
|
|
199
|
+
Conversion from polynomial in exponential notation.
|
|
200
|
+
|
|
201
|
+
INPUT:
|
|
202
|
+
|
|
203
|
+
- ``self`` -- a monomial symmetric function basis
|
|
204
|
+
- ``p`` -- a polynomial over the same base ring as ``self``
|
|
205
|
+
|
|
206
|
+
OUTPUT:
|
|
207
|
+
|
|
208
|
+
- This returns a symmetric function by mapping each monomial of
|
|
209
|
+
`p` with exponents ``exp`` into `m_\lambda` where `\lambda` is
|
|
210
|
+
the partition with exponential notation ``exp``.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
215
|
+
sage: P = PolynomialRing(QQ,'x',5)
|
|
216
|
+
sage: x = P.gens()
|
|
217
|
+
|
|
218
|
+
The exponential notation of the partition `(5,5,5,3,1,1)` is::
|
|
219
|
+
|
|
220
|
+
sage: Partition([5,5,5,3,1,1]).to_exp()
|
|
221
|
+
[2, 0, 1, 0, 3]
|
|
222
|
+
|
|
223
|
+
Therefore, the monomial::
|
|
224
|
+
|
|
225
|
+
sage: f = x[0]^2 * x[2] * x[4]^3
|
|
226
|
+
|
|
227
|
+
is mapped to::
|
|
228
|
+
|
|
229
|
+
sage: m.from_polynomial_exp(f)
|
|
230
|
+
m[5, 5, 5, 3, 1, 1]
|
|
231
|
+
|
|
232
|
+
Furthermore, this function is linear::
|
|
233
|
+
|
|
234
|
+
sage: f = 3 * x[3] + 2 * x[0]^2 * x[2] * x[4]^3
|
|
235
|
+
sage: m.from_polynomial_exp(f)
|
|
236
|
+
3*m[4] + 2*m[5, 5, 5, 3, 1, 1]
|
|
237
|
+
|
|
238
|
+
.. SEEALSO::
|
|
239
|
+
|
|
240
|
+
:func:`Partition`, :meth:`Partition.to_exp`
|
|
241
|
+
"""
|
|
242
|
+
assert self.base_ring() == p.parent().base_ring()
|
|
243
|
+
from sage.combinat.sf.sfa import _from_polynomial
|
|
244
|
+
return _from_polynomial(p, self)
|
|
245
|
+
|
|
246
|
+
def antipode_by_coercion(self, element):
|
|
247
|
+
r"""
|
|
248
|
+
The antipode of ``element`` via coercion to and from the power-sum
|
|
249
|
+
basis or the Schur basis (depending on whether the power sums really
|
|
250
|
+
form a basis over the given ground ring).
|
|
251
|
+
|
|
252
|
+
INPUT:
|
|
253
|
+
|
|
254
|
+
- ``element`` -- element in a basis of the ring of symmetric functions
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: Sym = SymmetricFunctions(QQ)
|
|
259
|
+
sage: m = Sym.monomial()
|
|
260
|
+
sage: m[3,2].antipode()
|
|
261
|
+
m[3, 2] + 2*m[5]
|
|
262
|
+
sage: m.antipode_by_coercion(m[3,2])
|
|
263
|
+
m[3, 2] + 2*m[5]
|
|
264
|
+
|
|
265
|
+
sage: Sym = SymmetricFunctions(ZZ)
|
|
266
|
+
sage: m = Sym.monomial()
|
|
267
|
+
sage: m[3,2].antipode()
|
|
268
|
+
m[3, 2] + 2*m[5]
|
|
269
|
+
sage: m.antipode_by_coercion(m[3,2])
|
|
270
|
+
m[3, 2] + 2*m[5]
|
|
271
|
+
|
|
272
|
+
.. TODO::
|
|
273
|
+
|
|
274
|
+
Is there a not too difficult way to get the power-sum computations
|
|
275
|
+
to work over any ring, not just one with coercion from `\QQ`?
|
|
276
|
+
"""
|
|
277
|
+
from sage.rings.rational_field import RationalField
|
|
278
|
+
if self.has_coerce_map_from(RationalField()):
|
|
279
|
+
p = self.realization_of().powersum()
|
|
280
|
+
return self(p.antipode(p(element)))
|
|
281
|
+
|
|
282
|
+
s = self.realization_of().schur()
|
|
283
|
+
return self(s.antipode(s(element)))
|
|
284
|
+
|
|
285
|
+
def _magma_init_(self, magma):
|
|
286
|
+
"""
|
|
287
|
+
Used in converting this ring to the corresponding ring in MAGMA.
|
|
288
|
+
|
|
289
|
+
EXAMPLES::
|
|
290
|
+
|
|
291
|
+
sage: # optional - magma
|
|
292
|
+
sage: M = SymmetricFunctions(QQ).m()
|
|
293
|
+
sage: t = 4*M[3,2]+9
|
|
294
|
+
sage: mt = magma(t); mt
|
|
295
|
+
9 + 4*$.[3,2]
|
|
296
|
+
sage: mt.sage()
|
|
297
|
+
9*m[] + 4*m[3, 2]
|
|
298
|
+
"""
|
|
299
|
+
B = magma(self.base_ring())
|
|
300
|
+
Bref = B._ref()
|
|
301
|
+
return f"SymmetricFunctionAlgebraMonomial({Bref})"
|
|
302
|
+
|
|
303
|
+
class Element(classical.SymmetricFunctionAlgebra_classical.Element):
|
|
304
|
+
def expand(self, n, alphabet='x'):
|
|
305
|
+
"""
|
|
306
|
+
Expand the symmetric function ``self`` as a symmetric polynomial
|
|
307
|
+
in ``n`` variables.
|
|
308
|
+
|
|
309
|
+
INPUT:
|
|
310
|
+
|
|
311
|
+
- ``n`` -- nonnegative integer
|
|
312
|
+
|
|
313
|
+
- ``alphabet`` -- (default: ``'x'``) a variable for the expansion
|
|
314
|
+
|
|
315
|
+
OUTPUT:
|
|
316
|
+
|
|
317
|
+
A monomial expansion of ``self`` in the `n` variables
|
|
318
|
+
labelled by ``alphabet``.
|
|
319
|
+
|
|
320
|
+
EXAMPLES::
|
|
321
|
+
|
|
322
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
323
|
+
sage: m([2,1]).expand(3)
|
|
324
|
+
x0^2*x1 + x0*x1^2 + x0^2*x2 + x1^2*x2 + x0*x2^2 + x1*x2^2
|
|
325
|
+
sage: m([1,1,1]).expand(2)
|
|
326
|
+
0
|
|
327
|
+
sage: m([2,1]).expand(3,alphabet='z')
|
|
328
|
+
z0^2*z1 + z0*z1^2 + z0^2*z2 + z1^2*z2 + z0*z2^2 + z1*z2^2
|
|
329
|
+
sage: m([2,1]).expand(3,alphabet='x,y,z')
|
|
330
|
+
x^2*y + x*y^2 + x^2*z + y^2*z + x*z^2 + y*z^2
|
|
331
|
+
sage: m([1]).expand(0)
|
|
332
|
+
0
|
|
333
|
+
sage: (3*m([])).expand(0)
|
|
334
|
+
3
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
def condition(part):
|
|
338
|
+
return len(part) > n
|
|
339
|
+
return self._expand(condition, n, alphabet)
|
|
340
|
+
|
|
341
|
+
def principal_specialization(self, n=infinity, q=None):
|
|
342
|
+
r"""
|
|
343
|
+
Return the principal specialization of a symmetric function.
|
|
344
|
+
|
|
345
|
+
The *principal specialization* of order `n` at `q`
|
|
346
|
+
is the ring homomorphism `ps_{n,q}` from the ring of
|
|
347
|
+
symmetric functions to another commutative ring `R`
|
|
348
|
+
given by `x_i \mapsto q^{i-1}` for `i \in \{1,\dots,n\}`
|
|
349
|
+
and `x_i \mapsto 0` for `i > n`.
|
|
350
|
+
Here, `q` is a given element of `R`, and we assume that
|
|
351
|
+
the variables of our symmetric functions are
|
|
352
|
+
`x_1, x_2, x_3, \ldots`.
|
|
353
|
+
(To be more precise, `ps_{n,q}` is a `K`-algebra
|
|
354
|
+
homomorphism, where `K` is the base ring.)
|
|
355
|
+
See Section 7.8 of [EnumComb2]_.
|
|
356
|
+
|
|
357
|
+
The *stable principal specialization* at `q` is the ring
|
|
358
|
+
homomorphism `ps_q` from the ring of symmetric functions
|
|
359
|
+
to another commutative ring `R` given by
|
|
360
|
+
`x_i \mapsto q^{i-1}` for all `i`.
|
|
361
|
+
This is well-defined only if the resulting infinite sums
|
|
362
|
+
converge; thus, in particular, setting `q = 1` in the
|
|
363
|
+
stable principal specialization is an invalid operation.
|
|
364
|
+
|
|
365
|
+
INPUT:
|
|
366
|
+
|
|
367
|
+
- ``n`` -- (default: ``infinity``) a nonnegative integer or
|
|
368
|
+
``infinity``, specifying whether to compute the principal
|
|
369
|
+
specialization of order ``n`` or the stable principal
|
|
370
|
+
specialization.
|
|
371
|
+
|
|
372
|
+
- ``q`` -- (default: ``None``) the value to use for `q`; the
|
|
373
|
+
default is to create a ring of polynomials in ``q``
|
|
374
|
+
(or a field of rational functions in ``q``) over the
|
|
375
|
+
given coefficient ring.
|
|
376
|
+
|
|
377
|
+
For ``q=1`` and finite ``n`` we use the formula from
|
|
378
|
+
Proposition 7.8.3 of [EnumComb2]_:
|
|
379
|
+
|
|
380
|
+
.. MATH::
|
|
381
|
+
|
|
382
|
+
ps_{n,1}(m_\lambda) = \binom{n}{\ell(\lambda)}
|
|
383
|
+
\binom{\ell(\lambda)}{m_1(\lambda), m_2(\lambda),\dots},
|
|
384
|
+
|
|
385
|
+
where `\ell(\lambda)` denotes the length of `\lambda`.
|
|
386
|
+
|
|
387
|
+
In all other cases, we convert to complete homogeneous
|
|
388
|
+
symmetric functions.
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
393
|
+
sage: x = m[3,1]
|
|
394
|
+
sage: x.principal_specialization(3)
|
|
395
|
+
q^7 + q^6 + q^5 + q^3 + q^2 + q
|
|
396
|
+
|
|
397
|
+
sage: x = 5*m[2] + 3*m[1] + 1
|
|
398
|
+
sage: x.principal_specialization(3, q=var("q")) # needs sage.symbolic
|
|
399
|
+
-10*(q^3 - 1)*q/(q - 1) + 5*(q^3 - 1)^2/(q - 1)^2 + 3*(q^3 - 1)/(q - 1) + 1
|
|
400
|
+
|
|
401
|
+
TESTS::
|
|
402
|
+
|
|
403
|
+
sage: m.zero().principal_specialization(3)
|
|
404
|
+
0
|
|
405
|
+
"""
|
|
406
|
+
if q == 1:
|
|
407
|
+
if n == infinity:
|
|
408
|
+
raise ValueError("the stable principal specialization at q=1 is not defined")
|
|
409
|
+
f = lambda partition: binomial(n, len(partition))*multinomial(partition.to_exp())
|
|
410
|
+
return self.parent()._apply_module_morphism(self, f, q.parent())
|
|
411
|
+
|
|
412
|
+
# heuristically, it seems fastest to fall back to the
|
|
413
|
+
# elementary basis - using the powersum basis would
|
|
414
|
+
# introduce singularities, because it is not a Z-basis
|
|
415
|
+
return self.parent().realization_of().elementary()(self).principal_specialization(n=n, q=q)
|
|
416
|
+
|
|
417
|
+
def exponential_specialization(self, t=None, q=1):
|
|
418
|
+
r"""
|
|
419
|
+
Return the exponential specialization of a
|
|
420
|
+
symmetric function (when `q = 1`), or the
|
|
421
|
+
`q`-exponential specialization (when `q \neq 1`).
|
|
422
|
+
|
|
423
|
+
The *exponential specialization* `ex` at `t` is a
|
|
424
|
+
`K`-algebra homomorphism from the `K`-algebra of
|
|
425
|
+
symmetric functions to another `K`-algebra `R`.
|
|
426
|
+
It is defined whenever the base ring `K` is a
|
|
427
|
+
`\QQ`-algebra and `t` is an element of `R`.
|
|
428
|
+
The easiest way to define it is by specifying its
|
|
429
|
+
values on the powersum symmetric functions to be
|
|
430
|
+
`p_1 = t` and `p_n = 0` for `n > 1`.
|
|
431
|
+
Equivalently, on the homogeneous functions it is
|
|
432
|
+
given by `ex(h_n) = t^n / n!`; see Proposition 7.8.4 of
|
|
433
|
+
[EnumComb2]_.
|
|
434
|
+
|
|
435
|
+
By analogy, the `q`-exponential specialization is a
|
|
436
|
+
`K`-algebra homomorphism from the `K`-algebra of
|
|
437
|
+
symmetric functions to another `K`-algebra `R` that
|
|
438
|
+
depends on two elements `t` and `q` of `R` for which
|
|
439
|
+
the elements `1 - q^i` for all positive integers `i`
|
|
440
|
+
are invertible.
|
|
441
|
+
It can be defined by specifying its values on the
|
|
442
|
+
complete homogeneous symmetric functions to be
|
|
443
|
+
|
|
444
|
+
.. MATH::
|
|
445
|
+
|
|
446
|
+
ex_q(h_n) = t^n / [n]_q!,
|
|
447
|
+
|
|
448
|
+
where `[n]_q!` is the `q`-factorial. Equivalently, for
|
|
449
|
+
`q \neq 1` and a homogeneous symmetric function `f` of
|
|
450
|
+
degree `n`, we have
|
|
451
|
+
|
|
452
|
+
.. MATH::
|
|
453
|
+
|
|
454
|
+
ex_q(f) = (1-q)^n t^n ps_q(f),
|
|
455
|
+
|
|
456
|
+
where `ps_q(f)` is the stable principal specialization of `f`
|
|
457
|
+
(see :meth:`principal_specialization`).
|
|
458
|
+
(See (7.29) in [EnumComb2]_.)
|
|
459
|
+
|
|
460
|
+
The limit of `ex_q` as `q \to 1` is `ex`.
|
|
461
|
+
|
|
462
|
+
INPUT:
|
|
463
|
+
|
|
464
|
+
- ``t`` -- (default: ``None``) the value to use for `t`;
|
|
465
|
+
the default is to create a ring of polynomials in ``t``
|
|
466
|
+
|
|
467
|
+
- ``q`` -- (default: `1`) the value to use for `q`; if
|
|
468
|
+
``q`` is ``None``, then a ring (or fraction field) of
|
|
469
|
+
polynomials in ``q`` is created
|
|
470
|
+
|
|
471
|
+
EXAMPLES::
|
|
472
|
+
|
|
473
|
+
sage: m = SymmetricFunctions(QQ).m()
|
|
474
|
+
sage: (m[3]+m[2,1]+m[1,1,1]).exponential_specialization()
|
|
475
|
+
1/6*t^3
|
|
476
|
+
|
|
477
|
+
sage: x = 5*m[1,1,1] + 3*m[2,1] + 1
|
|
478
|
+
sage: x.exponential_specialization()
|
|
479
|
+
5/6*t^3 + 1
|
|
480
|
+
|
|
481
|
+
We also support the `q`-exponential_specialization::
|
|
482
|
+
|
|
483
|
+
sage: factor(m[3].exponential_specialization(q=var("q"), t=var("t"))) # needs sage.symbolic
|
|
484
|
+
(q - 1)^2*t^3/(q^2 + q + 1)
|
|
485
|
+
|
|
486
|
+
TESTS::
|
|
487
|
+
|
|
488
|
+
sage: m.zero().exponential_specialization()
|
|
489
|
+
0
|
|
490
|
+
"""
|
|
491
|
+
def get_variable(ring, name):
|
|
492
|
+
try:
|
|
493
|
+
ring(name)
|
|
494
|
+
except TypeError:
|
|
495
|
+
from sage.rings.polynomial.polynomial_ring_constructor import (
|
|
496
|
+
PolynomialRing,
|
|
497
|
+
)
|
|
498
|
+
return PolynomialRing(ring, name).gen()
|
|
499
|
+
else:
|
|
500
|
+
raise ValueError("the variable %s is in the base ring, pass it explicitly" % name)
|
|
501
|
+
|
|
502
|
+
if q == 1:
|
|
503
|
+
if t is None:
|
|
504
|
+
t = get_variable(self.base_ring(), 't')
|
|
505
|
+
|
|
506
|
+
def f(partition):
|
|
507
|
+
n = 0
|
|
508
|
+
for part in partition:
|
|
509
|
+
if part != 1:
|
|
510
|
+
return 0
|
|
511
|
+
n += 1
|
|
512
|
+
return t**n / factorial(n)
|
|
513
|
+
|
|
514
|
+
return self.parent()._apply_module_morphism(self, f, t.parent())
|
|
515
|
+
|
|
516
|
+
# heuristically, it seems fastest to fall back to the
|
|
517
|
+
# elementary basis - using the powersum basis would
|
|
518
|
+
# introduce singularities, because it is not a Z-basis
|
|
519
|
+
return self.parent().realization_of().elementary()(self).exponential_specialization(t=t, q=q)
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
# Backward compatibility for unpickling
|
|
523
|
+
from sage.misc.persist import register_unpickle_override
|
|
524
|
+
|
|
525
|
+
register_unpickle_override('sage.combinat.sf.monomial', 'SymmetricFunctionAlgebraElement_monomial', SymmetricFunctionAlgebra_monomial.Element)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Multiplicative symmetric functions
|
|
5
|
+
|
|
6
|
+
A realization `h` of the ring of symmetric functions is multiplicative if for
|
|
7
|
+
a partition `\lambda = (\lambda_1,\lambda_2,\ldots)` we have
|
|
8
|
+
`h_\lambda = h_{\lambda_1} h_{\lambda_2} \cdots`.
|
|
9
|
+
"""
|
|
10
|
+
#*****************************************************************************
|
|
11
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
12
|
+
#
|
|
13
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
14
|
+
#
|
|
15
|
+
# This code is distributed in the hope that it will be useful,
|
|
16
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
17
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
18
|
+
# General Public License for more details.
|
|
19
|
+
#
|
|
20
|
+
# The full text of the GPL is available at:
|
|
21
|
+
#
|
|
22
|
+
# https://www.gnu.org/licenses/
|
|
23
|
+
#*****************************************************************************
|
|
24
|
+
import sage.combinat.partition
|
|
25
|
+
|
|
26
|
+
from . import classical
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SymmetricFunctionAlgebra_multiplicative(classical.SymmetricFunctionAlgebra_classical):
|
|
30
|
+
r"""
|
|
31
|
+
The class of multiplicative bases of the ring of symmetric functions.
|
|
32
|
+
|
|
33
|
+
A realization `q` of the ring of symmetric functions is multiplicative if
|
|
34
|
+
for a partition `\lambda = (\lambda_1,\lambda_2,\ldots)` we have
|
|
35
|
+
`q_\lambda = q_{\lambda_1} q_{\lambda_2} \cdots` (with `q_0` meaning `1`).
|
|
36
|
+
|
|
37
|
+
Examples of multiplicative realizations are the elementary symmetric basis,
|
|
38
|
+
the complete homogeneous basis, the powersum basis (if the base ring is a
|
|
39
|
+
`\QQ`-algebra), and the Witt basis (but not the Schur basis or the
|
|
40
|
+
monomial basis).
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def product_on_basis(self, left, right):
|
|
44
|
+
"""
|
|
45
|
+
Return the product of ``left`` and ``right``.
|
|
46
|
+
|
|
47
|
+
INPUT:
|
|
48
|
+
|
|
49
|
+
- ``left``, ``right`` -- partitions
|
|
50
|
+
|
|
51
|
+
OUTPUT: an element of ``self``
|
|
52
|
+
|
|
53
|
+
EXAMPLES::
|
|
54
|
+
|
|
55
|
+
sage: e = SymmetricFunctions(QQ).e()
|
|
56
|
+
sage: e([2,1])^2 # indirect doctest
|
|
57
|
+
e[2, 2, 1, 1]
|
|
58
|
+
|
|
59
|
+
::
|
|
60
|
+
|
|
61
|
+
sage: h = SymmetricFunctions(QQ).h()
|
|
62
|
+
sage: h([2,1])^2
|
|
63
|
+
h[2, 2, 1, 1]
|
|
64
|
+
|
|
65
|
+
::
|
|
66
|
+
|
|
67
|
+
sage: p = SymmetricFunctions(QQ).p()
|
|
68
|
+
sage: p([2,1])^2
|
|
69
|
+
p[2, 2, 1, 1]
|
|
70
|
+
|
|
71
|
+
::
|
|
72
|
+
|
|
73
|
+
sage: QQx.<x> = QQ[]
|
|
74
|
+
sage: p = SymmetricFunctions(QQx).p()
|
|
75
|
+
sage: (x*p([2]))^2
|
|
76
|
+
x^2*p[2, 2]
|
|
77
|
+
|
|
78
|
+
sage: TestSuite(p).run() # to silence sage -coverage
|
|
79
|
+
"""
|
|
80
|
+
m = list(left) + list(right)
|
|
81
|
+
m.sort(reverse=True)
|
|
82
|
+
return self.monomial(sage.combinat.partition.Partition(m))
|
|
83
|
+
|
|
84
|
+
def coproduct_on_basis(self, mu):
|
|
85
|
+
r"""
|
|
86
|
+
Return the coproduct on a basis element for multiplicative bases.
|
|
87
|
+
|
|
88
|
+
INPUT:
|
|
89
|
+
|
|
90
|
+
- ``mu`` -- a partition
|
|
91
|
+
|
|
92
|
+
OUTPUT:
|
|
93
|
+
|
|
94
|
+
- the image of ``self[mu]`` under comultiplication; this is an
|
|
95
|
+
element of the tensor square of ``self``
|
|
96
|
+
|
|
97
|
+
EXAMPLES::
|
|
98
|
+
|
|
99
|
+
sage: Sym = SymmetricFunctions(QQ)
|
|
100
|
+
sage: p = Sym.powersum()
|
|
101
|
+
sage: p.coproduct_on_basis([2,1])
|
|
102
|
+
p[] # p[2, 1] + p[1] # p[2] + p[2] # p[1] + p[2, 1] # p[]
|
|
103
|
+
|
|
104
|
+
sage: e = Sym.elementary()
|
|
105
|
+
sage: e.coproduct_on_basis([3,1])
|
|
106
|
+
e[] # e[3, 1] + e[1] # e[2, 1] + e[1] # e[3] + e[1, 1] # e[2] + e[2] # e[1, 1] + e[2, 1] # e[1] + e[3] # e[1] + e[3, 1] # e[]
|
|
107
|
+
|
|
108
|
+
sage: h = Sym.homogeneous()
|
|
109
|
+
sage: h.coproduct_on_basis([3,1])
|
|
110
|
+
h[] # h[3, 1] + h[1] # h[2, 1] + h[1] # h[3] + h[1, 1] # h[2] + h[2] # h[1, 1] + h[2, 1] # h[1] + h[3] # h[1] + h[3, 1] # h[]
|
|
111
|
+
"""
|
|
112
|
+
T = self.tensor_square()
|
|
113
|
+
return T.prod(self.coproduct_on_generators(p) for p in mu)
|