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,593 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Dual symmetric functions in non-commuting variables
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2013-08-04): initial version
|
|
9
|
+
"""
|
|
10
|
+
# ****************************************************************************
|
|
11
|
+
# Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
12
|
+
#
|
|
13
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
14
|
+
# https://www.gnu.org/licenses/
|
|
15
|
+
# ****************************************************************************
|
|
16
|
+
|
|
17
|
+
from sage.arith.misc import factorial
|
|
18
|
+
from sage.categories.fields import Fields
|
|
19
|
+
from sage.categories.graded_hopf_algebras import GradedHopfAlgebras
|
|
20
|
+
from sage.categories.rings import Rings
|
|
21
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
22
|
+
from sage.combinat.ncsym.bases import NCSymBasis_abstract, NCSymDualBases
|
|
23
|
+
from sage.combinat.partition import Partition
|
|
24
|
+
from sage.combinat.set_partition import SetPartitions
|
|
25
|
+
from sage.combinat.sf.sf import SymmetricFunctions
|
|
26
|
+
from sage.combinat.subset import Subsets
|
|
27
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
28
|
+
from sage.misc.misc_c import prod
|
|
29
|
+
from sage.structure.parent import Parent
|
|
30
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SymmetricFunctionsNonCommutingVariablesDual(UniqueRepresentation, Parent):
|
|
34
|
+
r"""
|
|
35
|
+
The Hopf dual to the symmetric functions in non-commuting variables.
|
|
36
|
+
|
|
37
|
+
See Section 2.3 of [BZ05]_ for a study.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, R):
|
|
41
|
+
"""
|
|
42
|
+
Initialize ``self``.
|
|
43
|
+
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: NCSymD1 = SymmetricFunctionsNonCommutingVariablesDual(FiniteField(23))
|
|
47
|
+
sage: NCSymD2 = SymmetricFunctionsNonCommutingVariablesDual(Integers(23))
|
|
48
|
+
sage: TestSuite(SymmetricFunctionsNonCommutingVariables(QQ).dual()).run()
|
|
49
|
+
"""
|
|
50
|
+
# change the line below to assert R in Rings() once MRO issues from #15536, #15475 are resolved
|
|
51
|
+
assert R in Fields() or R in Rings() # side effect of this statement assures MRO exists for R
|
|
52
|
+
self._base = R # Won't be needed once CategoryObject won't override base_ring
|
|
53
|
+
category = GradedHopfAlgebras(R).Commutative()
|
|
54
|
+
Parent.__init__(self, category=category.WithRealizations())
|
|
55
|
+
|
|
56
|
+
# Bases
|
|
57
|
+
w = self.w()
|
|
58
|
+
|
|
59
|
+
# Embedding of Sym in the homogeneous bases into DNCSym in the w basis
|
|
60
|
+
Sym = SymmetricFunctions(self.base_ring())
|
|
61
|
+
Sym_h_to_w = Sym.h().module_morphism(w.sum_of_partitions,
|
|
62
|
+
triangular='lower',
|
|
63
|
+
inverse_on_support=w._set_par_to_par,
|
|
64
|
+
codomain=w, category=category)
|
|
65
|
+
Sym_h_to_w.register_as_coercion()
|
|
66
|
+
self.to_symmetric_function = Sym_h_to_w.section()
|
|
67
|
+
|
|
68
|
+
def _repr_(self):
|
|
69
|
+
r"""
|
|
70
|
+
EXAMPLES::
|
|
71
|
+
|
|
72
|
+
sage: SymmetricFunctionsNonCommutingVariables(ZZ).dual()
|
|
73
|
+
Dual symmetric functions in non-commuting variables over the Integer Ring
|
|
74
|
+
"""
|
|
75
|
+
return "Dual symmetric functions in non-commuting variables over the %s" % self.base_ring()
|
|
76
|
+
|
|
77
|
+
def a_realization(self):
|
|
78
|
+
r"""
|
|
79
|
+
Return the realization of the `\mathbf{w}` basis of ``self``.
|
|
80
|
+
|
|
81
|
+
EXAMPLES::
|
|
82
|
+
|
|
83
|
+
sage: SymmetricFunctionsNonCommutingVariables(QQ).dual().a_realization()
|
|
84
|
+
Dual symmetric functions in non-commuting variables over the Rational Field in the w basis
|
|
85
|
+
"""
|
|
86
|
+
return self.w()
|
|
87
|
+
|
|
88
|
+
_shorthands = ('w',)
|
|
89
|
+
|
|
90
|
+
def dual(self):
|
|
91
|
+
r"""
|
|
92
|
+
Return the dual Hopf algebra of the dual symmetric functions in
|
|
93
|
+
non-commuting variables.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: NCSymD = SymmetricFunctionsNonCommutingVariables(QQ).dual()
|
|
98
|
+
sage: NCSymD.dual()
|
|
99
|
+
Symmetric functions in non-commuting variables over the Rational Field
|
|
100
|
+
"""
|
|
101
|
+
from sage.combinat.ncsym.ncsym import SymmetricFunctionsNonCommutingVariables
|
|
102
|
+
return SymmetricFunctionsNonCommutingVariables(self.base_ring())
|
|
103
|
+
|
|
104
|
+
class w(NCSymBasis_abstract):
|
|
105
|
+
r"""
|
|
106
|
+
The dual Hopf algebra of symmetric functions in non-commuting variables
|
|
107
|
+
in the `\mathbf{w}` basis.
|
|
108
|
+
|
|
109
|
+
EXAMPLES::
|
|
110
|
+
|
|
111
|
+
sage: NCSymD = SymmetricFunctionsNonCommutingVariables(QQ).dual()
|
|
112
|
+
sage: w = NCSymD.w()
|
|
113
|
+
|
|
114
|
+
We have the embedding `\chi^*` of `Sym` into `NCSym^*` available as
|
|
115
|
+
a coercion::
|
|
116
|
+
|
|
117
|
+
sage: h = SymmetricFunctions(QQ).h()
|
|
118
|
+
sage: w(h[2,1])
|
|
119
|
+
w{{1}, {2, 3}} + w{{1, 2}, {3}} + w{{1, 3}, {2}}
|
|
120
|
+
|
|
121
|
+
Similarly we can pull back when we are in the image of `\chi^*`::
|
|
122
|
+
|
|
123
|
+
sage: elt = 3*(w[[1],[2,3]] + w[[1,2],[3]] + w[[1,3],[2]])
|
|
124
|
+
sage: h(elt)
|
|
125
|
+
3*h[2, 1]
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
def __init__(self, NCSymD):
|
|
129
|
+
"""
|
|
130
|
+
EXAMPLES::
|
|
131
|
+
|
|
132
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
133
|
+
sage: TestSuite(w).run()
|
|
134
|
+
"""
|
|
135
|
+
def key_func_set_part(A):
|
|
136
|
+
return sorted(map(sorted, A))
|
|
137
|
+
|
|
138
|
+
R = NCSymD.base_ring()
|
|
139
|
+
category = GradedHopfAlgebras(R).Commutative()
|
|
140
|
+
category &= NCSymDualBases(NCSymD)
|
|
141
|
+
CombinatorialFreeModule.__init__(self, R, SetPartitions(),
|
|
142
|
+
prefix='w', bracket=False,
|
|
143
|
+
sorting_key=key_func_set_part,
|
|
144
|
+
category=category)
|
|
145
|
+
|
|
146
|
+
@lazy_attribute
|
|
147
|
+
def to_symmetric_function(self):
|
|
148
|
+
r"""
|
|
149
|
+
The preimage of `\chi^*` in the `\mathbf{w}` basis.
|
|
150
|
+
|
|
151
|
+
EXAMPLES::
|
|
152
|
+
|
|
153
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
154
|
+
sage: w.to_symmetric_function
|
|
155
|
+
Generic morphism:
|
|
156
|
+
From: Dual symmetric functions in non-commuting variables over the Rational Field in the w basis
|
|
157
|
+
To: Symmetric Functions over Rational Field in the homogeneous basis
|
|
158
|
+
"""
|
|
159
|
+
return self.realization_of().to_symmetric_function
|
|
160
|
+
|
|
161
|
+
def dual_basis(self):
|
|
162
|
+
r"""
|
|
163
|
+
Return the dual basis to the `\mathbf{w}` basis.
|
|
164
|
+
|
|
165
|
+
The dual basis to the `\mathbf{w}` basis is the monomial basis
|
|
166
|
+
of the symmetric functions in non-commuting variables.
|
|
167
|
+
|
|
168
|
+
OUTPUT: the monomial basis of the symmetric functions in
|
|
169
|
+
non-commuting variables
|
|
170
|
+
|
|
171
|
+
EXAMPLES::
|
|
172
|
+
|
|
173
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
174
|
+
sage: w.dual_basis()
|
|
175
|
+
Symmetric functions in non-commuting variables over the Rational Field in the monomial basis
|
|
176
|
+
"""
|
|
177
|
+
return self.realization_of().dual().m()
|
|
178
|
+
|
|
179
|
+
def product_on_basis(self, A, B):
|
|
180
|
+
r"""
|
|
181
|
+
The product on `\mathbf{w}` basis elements.
|
|
182
|
+
|
|
183
|
+
The product on the `\mathbf{w}` is the dual to the coproduct on the
|
|
184
|
+
`\mathbf{m}` basis. On the basis `\mathbf{w}` it is defined as
|
|
185
|
+
|
|
186
|
+
.. MATH::
|
|
187
|
+
|
|
188
|
+
\mathbf{w}_A \mathbf{w}_B = \sum_{S \subseteq [n]}
|
|
189
|
+
\mathbf{w}_{A\uparrow_S \cup B\uparrow_{S^c}}
|
|
190
|
+
|
|
191
|
+
where the sum is over all possible subsets `S` of `[n]` such that
|
|
192
|
+
`|S| = |A|` with a term indexed the union of `A \uparrow_S` and
|
|
193
|
+
`B \uparrow_{S^c}`. The notation `A \uparrow_S` represents the
|
|
194
|
+
unique set partition of the set `S` such that the standardization
|
|
195
|
+
is `A`. This product is commutative.
|
|
196
|
+
|
|
197
|
+
INPUT:
|
|
198
|
+
|
|
199
|
+
- ``A``, ``B`` -- set partitions
|
|
200
|
+
|
|
201
|
+
OUTPUT: an element of the `\mathbf{w}` basis
|
|
202
|
+
|
|
203
|
+
EXAMPLES::
|
|
204
|
+
|
|
205
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
206
|
+
sage: A = SetPartition([[1], [2,3]])
|
|
207
|
+
sage: B = SetPartition([[1, 2, 3]])
|
|
208
|
+
sage: w.product_on_basis(A, B)
|
|
209
|
+
w{{1}, {2, 3}, {4, 5, 6}} + w{{1}, {2, 3, 4}, {5, 6}}
|
|
210
|
+
+ w{{1}, {2, 3, 5}, {4, 6}} + w{{1}, {2, 3, 6}, {4, 5}}
|
|
211
|
+
+ w{{1}, {2, 4}, {3, 5, 6}} + w{{1}, {2, 4, 5}, {3, 6}}
|
|
212
|
+
+ w{{1}, {2, 4, 6}, {3, 5}} + w{{1}, {2, 5}, {3, 4, 6}}
|
|
213
|
+
+ w{{1}, {2, 5, 6}, {3, 4}} + w{{1}, {2, 6}, {3, 4, 5}}
|
|
214
|
+
+ w{{1, 2, 3}, {4}, {5, 6}} + w{{1, 2, 4}, {3}, {5, 6}}
|
|
215
|
+
+ w{{1, 2, 5}, {3}, {4, 6}} + w{{1, 2, 6}, {3}, {4, 5}}
|
|
216
|
+
+ w{{1, 3, 4}, {2}, {5, 6}} + w{{1, 3, 5}, {2}, {4, 6}}
|
|
217
|
+
+ w{{1, 3, 6}, {2}, {4, 5}} + w{{1, 4, 5}, {2}, {3, 6}}
|
|
218
|
+
+ w{{1, 4, 6}, {2}, {3, 5}} + w{{1, 5, 6}, {2}, {3, 4}}
|
|
219
|
+
sage: B = SetPartition([[1], [2]])
|
|
220
|
+
sage: w.product_on_basis(A, B)
|
|
221
|
+
3*w{{1}, {2}, {3}, {4, 5}} + 2*w{{1}, {2}, {3, 4}, {5}}
|
|
222
|
+
+ 2*w{{1}, {2}, {3, 5}, {4}} + w{{1}, {2, 3}, {4}, {5}}
|
|
223
|
+
+ w{{1}, {2, 4}, {3}, {5}} + w{{1}, {2, 5}, {3}, {4}}
|
|
224
|
+
sage: w.product_on_basis(A, SetPartition([]))
|
|
225
|
+
w{{1}, {2, 3}}
|
|
226
|
+
"""
|
|
227
|
+
if not A:
|
|
228
|
+
return self.monomial(B)
|
|
229
|
+
if not B:
|
|
230
|
+
return self.monomial(A)
|
|
231
|
+
|
|
232
|
+
P = SetPartitions()
|
|
233
|
+
n = A.size()
|
|
234
|
+
m = n + B.size()
|
|
235
|
+
|
|
236
|
+
def unions(s):
|
|
237
|
+
a = sorted(s)
|
|
238
|
+
b = [j for j in range(1, m + 1) if j not in s]
|
|
239
|
+
# -1 for indexing
|
|
240
|
+
ret = [[a[i - 1] for i in sorted(part)] for part in A]
|
|
241
|
+
ret.extend([b[i - 1] for i in sorted(part)] for part in B)
|
|
242
|
+
return P(ret)
|
|
243
|
+
|
|
244
|
+
return self.sum_of_terms([(unions(s), 1)
|
|
245
|
+
for s in Subsets(m, n)])
|
|
246
|
+
|
|
247
|
+
def coproduct_on_basis(self, A):
|
|
248
|
+
r"""
|
|
249
|
+
Return the coproduct of a `\mathbf{w}` basis element.
|
|
250
|
+
|
|
251
|
+
The coproduct on the basis element `\mathbf{w}_A` is the sum over
|
|
252
|
+
tensor product terms `\mathbf{w}_B \otimes \mathbf{w}_C` where
|
|
253
|
+
`B` is the restriction of `A` to `\{1,2,\ldots,k\}` and `C` is
|
|
254
|
+
the restriction of `A` to `\{k+1, k+2, \ldots, n\}`.
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
|
|
258
|
+
- ``A`` -- set partition
|
|
259
|
+
|
|
260
|
+
OUTPUT:
|
|
261
|
+
|
|
262
|
+
- The coproduct applied to the `\mathbf{w}` dual symmetric function
|
|
263
|
+
in non-commuting variables indexed by ``A`` expressed in the
|
|
264
|
+
`\mathbf{w}` basis.
|
|
265
|
+
|
|
266
|
+
EXAMPLES::
|
|
267
|
+
|
|
268
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
269
|
+
sage: w[[1], [2,3]].coproduct()
|
|
270
|
+
w{} # w{{1}, {2, 3}} + w{{1}} # w{{1, 2}}
|
|
271
|
+
+ w{{1}, {2}} # w{{1}} + w{{1}, {2, 3}} # w{}
|
|
272
|
+
sage: w.coproduct_on_basis(SetPartition([]))
|
|
273
|
+
w{} # w{}
|
|
274
|
+
"""
|
|
275
|
+
n = A.size()
|
|
276
|
+
return self.tensor_square().sum_of_terms([
|
|
277
|
+
((A.restriction(range(1, i + 1)).standardization(),
|
|
278
|
+
A.restriction(range(i + 1, n + 1)).standardization()), 1)
|
|
279
|
+
for i in range(n + 1)], distinct=True)
|
|
280
|
+
|
|
281
|
+
def antipode_on_basis(self, A):
|
|
282
|
+
r"""
|
|
283
|
+
Return the antipode applied to the basis element indexed by ``A``.
|
|
284
|
+
|
|
285
|
+
INPUT:
|
|
286
|
+
|
|
287
|
+
- ``A`` -- set partition
|
|
288
|
+
|
|
289
|
+
OUTPUT: an element in the basis ``self``
|
|
290
|
+
|
|
291
|
+
EXAMPLES::
|
|
292
|
+
|
|
293
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
294
|
+
sage: w.antipode_on_basis(SetPartition([[1],[2,3]]))
|
|
295
|
+
-3*w{{1}, {2}, {3}} + w{{1, 2}, {3}} + w{{1, 3}, {2}}
|
|
296
|
+
sage: F = w[[1,3],[5],[2,4]].coproduct()
|
|
297
|
+
sage: F.apply_multilinear_morphism(lambda x,y: x.antipode()*y)
|
|
298
|
+
0
|
|
299
|
+
"""
|
|
300
|
+
if A.size() == 0:
|
|
301
|
+
return self.one()
|
|
302
|
+
if A.size() == 1:
|
|
303
|
+
return -self(A)
|
|
304
|
+
cpr = self.coproduct_on_basis(A)
|
|
305
|
+
return -sum(c * self.monomial(B1) * self.antipode_on_basis(B2)
|
|
306
|
+
for (B1, B2), c in cpr if B2 != A)
|
|
307
|
+
|
|
308
|
+
def duality_pairing(self, x, y):
|
|
309
|
+
r"""
|
|
310
|
+
Compute the pairing between an element of ``self`` and an
|
|
311
|
+
element of the dual.
|
|
312
|
+
|
|
313
|
+
INPUT:
|
|
314
|
+
|
|
315
|
+
- ``x`` -- an element of the dual of symmetric functions in
|
|
316
|
+
non-commuting variables
|
|
317
|
+
- ``y`` -- an element of the symmetric functions in non-commuting
|
|
318
|
+
variables
|
|
319
|
+
|
|
320
|
+
OUTPUT: an element of the base ring of ``self``
|
|
321
|
+
|
|
322
|
+
EXAMPLES::
|
|
323
|
+
|
|
324
|
+
sage: DNCSym = SymmetricFunctionsNonCommutingVariablesDual(QQ)
|
|
325
|
+
sage: w = DNCSym.w()
|
|
326
|
+
sage: m = w.dual_basis()
|
|
327
|
+
sage: matrix([[w(A).duality_pairing(m(B)) for A in SetPartitions(3)] for B in SetPartitions(3)])
|
|
328
|
+
[1 0 0 0 0]
|
|
329
|
+
[0 1 0 0 0]
|
|
330
|
+
[0 0 1 0 0]
|
|
331
|
+
[0 0 0 1 0]
|
|
332
|
+
[0 0 0 0 1]
|
|
333
|
+
sage: (w[[1,2],[3]] + 3*w[[1,3],[2]]).duality_pairing(2*m[[1,3],[2]] + m[[1,2,3]] + 2*m[[1,2],[3]])
|
|
334
|
+
8
|
|
335
|
+
sage: h = SymmetricFunctionsNonCommutingVariables(QQ).h()
|
|
336
|
+
sage: matrix([[w(A).duality_pairing(h(B)) for A in SetPartitions(3)] for B in SetPartitions(3)])
|
|
337
|
+
[6 2 2 2 1]
|
|
338
|
+
[2 2 1 1 1]
|
|
339
|
+
[2 1 2 1 1]
|
|
340
|
+
[2 1 1 2 1]
|
|
341
|
+
[1 1 1 1 1]
|
|
342
|
+
sage: (2*w[[1,3],[2]] + w[[1,2,3]] + 2*w[[1,2],[3]]).duality_pairing(h[[1,2],[3]] + 3*h[[1,3],[2]])
|
|
343
|
+
32
|
|
344
|
+
"""
|
|
345
|
+
x = self(x)
|
|
346
|
+
y = self.dual_basis()(y)
|
|
347
|
+
return sum(coeff * y[I] for I, coeff in x)
|
|
348
|
+
|
|
349
|
+
def sum_of_partitions(self, la):
|
|
350
|
+
r"""
|
|
351
|
+
Return the sum over all sets partitions whose shape is ``la``,
|
|
352
|
+
scaled by `\prod_i m_i!` where `m_i` is the multiplicity
|
|
353
|
+
of `i` in ``la``.
|
|
354
|
+
|
|
355
|
+
INPUT:
|
|
356
|
+
|
|
357
|
+
- ``la`` -- integer partition
|
|
358
|
+
|
|
359
|
+
OUTPUT: an element of ``self``
|
|
360
|
+
|
|
361
|
+
EXAMPLES::
|
|
362
|
+
|
|
363
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
364
|
+
sage: w.sum_of_partitions([2,1,1])
|
|
365
|
+
2*w{{1}, {2}, {3, 4}} + 2*w{{1}, {2, 3}, {4}} + 2*w{{1}, {2, 4}, {3}}
|
|
366
|
+
+ 2*w{{1, 2}, {3}, {4}} + 2*w{{1, 3}, {2}, {4}} + 2*w{{1, 4}, {2}, {3}}
|
|
367
|
+
"""
|
|
368
|
+
la = Partition(la)
|
|
369
|
+
c = prod([factorial(i) for i in la.to_exp()])
|
|
370
|
+
P = SetPartitions()
|
|
371
|
+
return self.sum_of_terms([(P(m), c) for m in SetPartitions(sum(la), la)], distinct=True)
|
|
372
|
+
|
|
373
|
+
def _set_par_to_par(self, A):
|
|
374
|
+
r"""
|
|
375
|
+
Return the shape of ``A`` if ``A`` is the canonical standard
|
|
376
|
+
set partition `A_1 | A_2 | \cdots | A_k` where `|` is the pipe
|
|
377
|
+
operation (see
|
|
378
|
+
:meth:`~sage.combinat.set_partition.SetPartition.pipe()` )
|
|
379
|
+
and `A_i = [\lambda_i]` where `\lambda_1 \leq \lambda_2 \leq
|
|
380
|
+
\cdots \leq \lambda_k`. Otherwise, return ``None``.
|
|
381
|
+
|
|
382
|
+
This is the trailing term of `h_{\lambda}` mapped by `\chi` to
|
|
383
|
+
the `\mathbf{w}` basis and is used by the coercion framework to
|
|
384
|
+
construct the preimage `\chi^{-1}`.
|
|
385
|
+
|
|
386
|
+
INPUT:
|
|
387
|
+
|
|
388
|
+
- ``A`` -- set partition
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
393
|
+
sage: w._set_par_to_par(SetPartition([[1], [2], [3,4,5]]))
|
|
394
|
+
[3, 1, 1]
|
|
395
|
+
sage: w._set_par_to_par(SetPartition([[1,2,3],[4],[5]]))
|
|
396
|
+
sage: w._set_par_to_par(SetPartition([[1],[2,3,4],[5]]))
|
|
397
|
+
sage: w._set_par_to_par(SetPartition([[1],[2,3,5],[4]]))
|
|
398
|
+
|
|
399
|
+
TESTS:
|
|
400
|
+
|
|
401
|
+
This is used in the coercion between `\mathbf{w}` and the
|
|
402
|
+
homogeneous symmetric functions. ::
|
|
403
|
+
|
|
404
|
+
sage: w = SymmetricFunctionsNonCommutingVariablesDual(QQ).w()
|
|
405
|
+
sage: h = SymmetricFunctions(QQ).h()
|
|
406
|
+
sage: h(w[[1,3],[2]])
|
|
407
|
+
Traceback (most recent call last):
|
|
408
|
+
...
|
|
409
|
+
ValueError: w{{1, 3}, {2}} is not in the image
|
|
410
|
+
sage: h(w(h[2,1])) == w(h[2,1]).to_symmetric_function()
|
|
411
|
+
True
|
|
412
|
+
"""
|
|
413
|
+
cur = 1
|
|
414
|
+
prev_len = 0
|
|
415
|
+
for p in A:
|
|
416
|
+
if prev_len > len(p) or list(p) != list(range(cur, cur + len(p))):
|
|
417
|
+
return None
|
|
418
|
+
prev_len = len(p)
|
|
419
|
+
cur += len(p)
|
|
420
|
+
return A.shape()
|
|
421
|
+
|
|
422
|
+
class Element(CombinatorialFreeModule.Element):
|
|
423
|
+
r"""
|
|
424
|
+
An element in the `\mathbf{w}` basis.
|
|
425
|
+
"""
|
|
426
|
+
|
|
427
|
+
def expand(self, n, letter='x'):
|
|
428
|
+
r"""
|
|
429
|
+
Expand ``self`` written in the `\mathbf{w}` basis in `n^2`
|
|
430
|
+
commuting variables which satisfy the relation
|
|
431
|
+
`x_{ij} x_{ik} = 0` for all `i`, `j`, and `k`.
|
|
432
|
+
|
|
433
|
+
The expansion of an element of the `\mathbf{w}` basis is
|
|
434
|
+
given by equations (26) and (55) in [HNT06]_.
|
|
435
|
+
|
|
436
|
+
INPUT:
|
|
437
|
+
|
|
438
|
+
- ``n`` -- integer
|
|
439
|
+
- ``letter`` -- string (default: ``'x'``)
|
|
440
|
+
|
|
441
|
+
OUTPUT:
|
|
442
|
+
|
|
443
|
+
- The symmetric function of ``self`` expressed in the ``n*n``
|
|
444
|
+
non-commuting variables described by ``letter``.
|
|
445
|
+
|
|
446
|
+
REFERENCES:
|
|
447
|
+
|
|
448
|
+
.. [HNT06] \F. Hivert, J.-C. Novelli, J.-Y. Thibon.
|
|
449
|
+
*Commutative combinatorial Hopf algebras*. (2006).
|
|
450
|
+
:arxiv:`0605262v1`.
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
455
|
+
sage: w[[1,3],[2]].expand(4)
|
|
456
|
+
x02*x11*x20 + x03*x11*x30 + x03*x22*x30 + x13*x22*x31
|
|
457
|
+
|
|
458
|
+
One can use a different set of variable by using the
|
|
459
|
+
optional argument ``letter``::
|
|
460
|
+
|
|
461
|
+
sage: w[[1,3],[2]].expand(3, letter='y')
|
|
462
|
+
y02*y11*y20
|
|
463
|
+
"""
|
|
464
|
+
from sage.combinat.permutation import Permutations
|
|
465
|
+
from sage.rings.polynomial.polynomial_ring_constructor import (
|
|
466
|
+
PolynomialRing,
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
m = self.parent()
|
|
470
|
+
names = [f'{letter}{i}{j}' for i in range(n) for j in range(n)]
|
|
471
|
+
R = PolynomialRing(m.base_ring(), n * n, names)
|
|
472
|
+
x = [[R.gens()[i * n + j]
|
|
473
|
+
for j in range(n)] for i in range(n)]
|
|
474
|
+
I = R.ideal([x[i][j] * x[i][k]
|
|
475
|
+
for j in range(n) for k in range(n) for i in range(n)])
|
|
476
|
+
Q = R.quotient(I, names)
|
|
477
|
+
x = [[Q.gens()[i * n + j]
|
|
478
|
+
for j in range(n)] for i in range(n)]
|
|
479
|
+
P = SetPartitions()
|
|
480
|
+
|
|
481
|
+
def on_basis(A):
|
|
482
|
+
k = A.size()
|
|
483
|
+
ret = R.zero()
|
|
484
|
+
if n < k:
|
|
485
|
+
return ret
|
|
486
|
+
|
|
487
|
+
for p in Permutations(k):
|
|
488
|
+
if P(p.to_cycles()) == A:
|
|
489
|
+
# -1 for indexing
|
|
490
|
+
ret += R.sum(prod(x[I[i]][I[p[i] - 1]]
|
|
491
|
+
for i in range(k))
|
|
492
|
+
for I in Subsets(range(n), k))
|
|
493
|
+
return ret
|
|
494
|
+
|
|
495
|
+
return m._apply_module_morphism(self, on_basis, codomain=R)
|
|
496
|
+
|
|
497
|
+
def is_symmetric(self):
|
|
498
|
+
r"""
|
|
499
|
+
Determine if a `NCSym^*` function, expressed in the
|
|
500
|
+
`\mathbf{w}` basis, is symmetric.
|
|
501
|
+
|
|
502
|
+
A function `f` in the `\mathbf{w}` basis is a symmetric
|
|
503
|
+
function if it is in the image of `\chi^*`. That is to say we
|
|
504
|
+
have
|
|
505
|
+
|
|
506
|
+
.. MATH::
|
|
507
|
+
|
|
508
|
+
f = \sum_{\lambda} c_{\lambda} \prod_i m_i(\lambda)!
|
|
509
|
+
\sum_{\lambda(A) = \lambda} \mathbf{w}_A
|
|
510
|
+
|
|
511
|
+
where the second sum is over all set partitions `A` whose
|
|
512
|
+
shape `\lambda(A)` is equal to `\lambda` and `m_i(\mu)` is
|
|
513
|
+
the multiplicity of `i` in the partition `\mu`.
|
|
514
|
+
|
|
515
|
+
OUTPUT:
|
|
516
|
+
|
|
517
|
+
- ``True`` if `\lambda(A)=\lambda(B)` implies the coefficients of
|
|
518
|
+
`\mathbf{w}_A` and `\mathbf{w}_B` are equal, ``False`` otherwise
|
|
519
|
+
|
|
520
|
+
EXAMPLES::
|
|
521
|
+
|
|
522
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
523
|
+
sage: elt = w.sum_of_partitions([2,1,1])
|
|
524
|
+
sage: elt.is_symmetric()
|
|
525
|
+
True
|
|
526
|
+
sage: elt -= 3*w.sum_of_partitions([1,1])
|
|
527
|
+
sage: elt.is_symmetric()
|
|
528
|
+
True
|
|
529
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(ZZ).dual().w()
|
|
530
|
+
sage: elt = w.sum_of_partitions([2,1,1]) / 2
|
|
531
|
+
sage: elt.is_symmetric()
|
|
532
|
+
False
|
|
533
|
+
sage: elt = w[[1,3],[2]]
|
|
534
|
+
sage: elt.is_symmetric()
|
|
535
|
+
False
|
|
536
|
+
sage: elt = w[[1],[2,3]] + w[[1,2],[3]] + 2*w[[1,3],[2]]
|
|
537
|
+
sage: elt.is_symmetric()
|
|
538
|
+
False
|
|
539
|
+
"""
|
|
540
|
+
d = {}
|
|
541
|
+
R = self.base_ring()
|
|
542
|
+
for A, coeff in self:
|
|
543
|
+
la = A.shape()
|
|
544
|
+
exp = prod([factorial(i) for i in la.to_exp()])
|
|
545
|
+
if la not in d:
|
|
546
|
+
if coeff / exp not in R:
|
|
547
|
+
return False
|
|
548
|
+
d[la] = [coeff, 1]
|
|
549
|
+
else:
|
|
550
|
+
if d[la][0] != coeff:
|
|
551
|
+
return False
|
|
552
|
+
d[la][1] += 1
|
|
553
|
+
# Make sure we've seen each set partition of the shape
|
|
554
|
+
return all(d[la][1] == SetPartitions(la.size(), la).cardinality() for la in d)
|
|
555
|
+
|
|
556
|
+
def to_symmetric_function(self):
|
|
557
|
+
r"""
|
|
558
|
+
Take a function in the `\mathbf{w}` basis, and return its
|
|
559
|
+
symmetric realization, when possible, expressed in the
|
|
560
|
+
homogeneous basis of symmetric functions.
|
|
561
|
+
|
|
562
|
+
OUTPUT:
|
|
563
|
+
|
|
564
|
+
- If ``self`` is a symmetric function, then the expansion
|
|
565
|
+
in the homogeneous basis of the symmetric functions is returned.
|
|
566
|
+
Otherwise an error is raised.
|
|
567
|
+
|
|
568
|
+
EXAMPLES::
|
|
569
|
+
|
|
570
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
571
|
+
sage: elt = w[[1],[2,3]] + w[[1,2],[3]] + w[[1,3],[2]]
|
|
572
|
+
sage: elt.to_symmetric_function()
|
|
573
|
+
h[2, 1]
|
|
574
|
+
sage: elt = w.sum_of_partitions([2,1,1]) / 2
|
|
575
|
+
sage: elt.to_symmetric_function()
|
|
576
|
+
1/2*h[2, 1, 1]
|
|
577
|
+
|
|
578
|
+
TESTS::
|
|
579
|
+
|
|
580
|
+
sage: w = SymmetricFunctionsNonCommutingVariables(QQ).dual().w()
|
|
581
|
+
sage: w(0).to_symmetric_function()
|
|
582
|
+
0
|
|
583
|
+
sage: w([]).to_symmetric_function()
|
|
584
|
+
h[]
|
|
585
|
+
sage: (2*w([])).to_symmetric_function()
|
|
586
|
+
2*h[]
|
|
587
|
+
"""
|
|
588
|
+
if not self.is_symmetric():
|
|
589
|
+
raise ValueError("not a symmetric function")
|
|
590
|
+
h = SymmetricFunctions(self.parent().base_ring()).homogeneous()
|
|
591
|
+
d = {A.shape(): c for A, c in self}
|
|
592
|
+
return h.sum_of_terms([(AA, cc / prod(factorial(i) for i in AA.to_exp()))
|
|
593
|
+
for AA, cc in d.items()], distinct=True)
|