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,964 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
"""
|
|
4
|
+
Non-symmetric Macdonald polynomials
|
|
5
|
+
"""
|
|
6
|
+
import copy
|
|
7
|
+
|
|
8
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
9
|
+
from sage.combinat.backtrack import GenericBacktracker
|
|
10
|
+
from sage.combinat.combinat import CombinatorialObject
|
|
11
|
+
from sage.combinat.combination import Combinations
|
|
12
|
+
from sage.combinat.permutation import Permutation
|
|
13
|
+
from sage.combinat.words.word import Word
|
|
14
|
+
from sage.misc.misc_c import prod
|
|
15
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
16
|
+
from sage.rings.rational_field import QQ
|
|
17
|
+
from sage.structure.parent import Parent
|
|
18
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LatticeDiagram(CombinatorialObject):
|
|
22
|
+
def boxes(self):
|
|
23
|
+
"""
|
|
24
|
+
EXAMPLES::
|
|
25
|
+
|
|
26
|
+
sage: a = LatticeDiagram([3,0,2])
|
|
27
|
+
sage: a.boxes()
|
|
28
|
+
[(1, 1), (1, 2), (1, 3), (3, 1), (3, 2)]
|
|
29
|
+
sage: a = LatticeDiagram([2, 1, 3, 0, 0, 2])
|
|
30
|
+
sage: a.boxes()
|
|
31
|
+
[(1, 1), (1, 2), (2, 1), (3, 1), (3, 2), (3, 3), (6, 1), (6, 2)]
|
|
32
|
+
"""
|
|
33
|
+
res = []
|
|
34
|
+
for i in range(1, len(self) + 1):
|
|
35
|
+
res += [(i, j + 1) for j in range(self[i])]
|
|
36
|
+
return res
|
|
37
|
+
|
|
38
|
+
def __getitem__(self, i):
|
|
39
|
+
"""
|
|
40
|
+
Return the `i`-th entry of ``self``.
|
|
41
|
+
|
|
42
|
+
Note that the indexing for lattice diagrams starts at `1`.
|
|
43
|
+
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: a = LatticeDiagram([3,0,2])
|
|
47
|
+
sage: a[1]
|
|
48
|
+
3
|
|
49
|
+
sage: a[0]
|
|
50
|
+
Traceback (most recent call last):
|
|
51
|
+
...
|
|
52
|
+
ValueError: indexing starts at 1
|
|
53
|
+
sage: a[-1]
|
|
54
|
+
2
|
|
55
|
+
"""
|
|
56
|
+
if i == 0:
|
|
57
|
+
raise ValueError("indexing starts at 1")
|
|
58
|
+
elif i < 0:
|
|
59
|
+
i += 1
|
|
60
|
+
return self._list[i - 1]
|
|
61
|
+
|
|
62
|
+
def leg(self, i, j):
|
|
63
|
+
"""
|
|
64
|
+
Return the leg of the box ``(i,j)`` in ``self``.
|
|
65
|
+
|
|
66
|
+
EXAMPLES::
|
|
67
|
+
|
|
68
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
69
|
+
sage: a.leg(5,2)
|
|
70
|
+
[(5, 3)]
|
|
71
|
+
"""
|
|
72
|
+
return [(i, k) for k in range(j + 1, self[i] + 1)]
|
|
73
|
+
|
|
74
|
+
def arm_left(self, i, j):
|
|
75
|
+
"""
|
|
76
|
+
Return the left arm of the box ``(i,j)`` in ``self``.
|
|
77
|
+
|
|
78
|
+
EXAMPLES::
|
|
79
|
+
|
|
80
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
81
|
+
sage: a.arm_left(5,2)
|
|
82
|
+
[(1, 2), (3, 2)]
|
|
83
|
+
"""
|
|
84
|
+
return [(ip, j) for ip in range(1, i) if j <= self[ip] <= self[i]]
|
|
85
|
+
|
|
86
|
+
def arm_right(self, i, j):
|
|
87
|
+
"""
|
|
88
|
+
Return the right arm of the box ``(i,j)`` in ``self``.
|
|
89
|
+
|
|
90
|
+
EXAMPLES::
|
|
91
|
+
|
|
92
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
93
|
+
sage: a.arm_right(5,2)
|
|
94
|
+
[(8, 1)]
|
|
95
|
+
"""
|
|
96
|
+
return [(ip, j - 1) for ip in range(i + 1, len(self) + 1)
|
|
97
|
+
if j - 1 <= self[ip] < self[i]]
|
|
98
|
+
|
|
99
|
+
def arm(self, i, j):
|
|
100
|
+
"""
|
|
101
|
+
Return the arm of the box ``(i,j)`` in ``self``.
|
|
102
|
+
|
|
103
|
+
EXAMPLES::
|
|
104
|
+
|
|
105
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
106
|
+
sage: a.arm(5,2)
|
|
107
|
+
[(1, 2), (3, 2), (8, 1)]
|
|
108
|
+
"""
|
|
109
|
+
return self.arm_left(i, j) + self.arm_right(i, j)
|
|
110
|
+
|
|
111
|
+
def l(self, i, j):
|
|
112
|
+
"""
|
|
113
|
+
Return ``self[i] - j``.
|
|
114
|
+
|
|
115
|
+
EXAMPLES::
|
|
116
|
+
|
|
117
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
118
|
+
sage: a.l(5,2)
|
|
119
|
+
1
|
|
120
|
+
"""
|
|
121
|
+
return self[i] - j
|
|
122
|
+
|
|
123
|
+
def a(self, i, j):
|
|
124
|
+
"""
|
|
125
|
+
Return the length of the arm of the box ``(i,j)`` in ``self``.
|
|
126
|
+
|
|
127
|
+
EXAMPLES::
|
|
128
|
+
|
|
129
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
130
|
+
sage: a.a(5,2)
|
|
131
|
+
3
|
|
132
|
+
"""
|
|
133
|
+
return len(self.arm(i, j))
|
|
134
|
+
|
|
135
|
+
def size(self):
|
|
136
|
+
"""
|
|
137
|
+
Return the number of boxes in ``self``.
|
|
138
|
+
|
|
139
|
+
EXAMPLES::
|
|
140
|
+
|
|
141
|
+
sage: a = LatticeDiagram([3,1,2,4,3,0,4,2,3])
|
|
142
|
+
sage: a.size()
|
|
143
|
+
22
|
|
144
|
+
"""
|
|
145
|
+
return sum(self._list)
|
|
146
|
+
|
|
147
|
+
def flip(self):
|
|
148
|
+
"""
|
|
149
|
+
Return the flip of ``self``, where flip is defined as follows. Let
|
|
150
|
+
``r = max(self)``. Then ``self.flip()[i] = r - self[i]``.
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: a = LatticeDiagram([3,0,2])
|
|
155
|
+
sage: a.flip()
|
|
156
|
+
[0, 3, 1]
|
|
157
|
+
"""
|
|
158
|
+
r = max(self)
|
|
159
|
+
return LatticeDiagram([r - i for i in self])
|
|
160
|
+
|
|
161
|
+
def boxes_same_and_lower_right(self, ii, jj):
|
|
162
|
+
"""
|
|
163
|
+
Return an iterator of the boxes of ``self`` that are in row ``jj``
|
|
164
|
+
but not identical with ``(ii, jj)``, or lie in the row
|
|
165
|
+
``jj - 1`` (the row directly below ``jj``; this might be the
|
|
166
|
+
basement) and strictly to the right of ``(ii, jj)``.
|
|
167
|
+
|
|
168
|
+
EXAMPLES::
|
|
169
|
+
|
|
170
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
171
|
+
sage: a = a.shape()
|
|
172
|
+
sage: list(a.boxes_same_and_lower_right(1,1))
|
|
173
|
+
[(2, 1), (3, 1), (6, 1), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0)]
|
|
174
|
+
sage: list(a.boxes_same_and_lower_right(1,2))
|
|
175
|
+
[(3, 2), (6, 2), (2, 1), (3, 1), (6, 1)]
|
|
176
|
+
sage: list(a.boxes_same_and_lower_right(3,3))
|
|
177
|
+
[(6, 2)]
|
|
178
|
+
sage: list(a.boxes_same_and_lower_right(2,3))
|
|
179
|
+
[(3, 3), (3, 2), (6, 2)]
|
|
180
|
+
"""
|
|
181
|
+
# Add all of the boxes in the same row
|
|
182
|
+
for i in range(1, len(self) + 1):
|
|
183
|
+
if self[i] >= jj and i != ii:
|
|
184
|
+
yield (i, jj)
|
|
185
|
+
|
|
186
|
+
for i in range(ii + 1, len(self) + 1):
|
|
187
|
+
if self[i] >= jj - 1:
|
|
188
|
+
yield (i, jj - 1)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class AugmentedLatticeDiagramFilling(CombinatorialObject):
|
|
192
|
+
def __init__(self, l, pi=None):
|
|
193
|
+
"""
|
|
194
|
+
EXAMPLES::
|
|
195
|
+
|
|
196
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
197
|
+
sage: a == loads(dumps(a))
|
|
198
|
+
True
|
|
199
|
+
sage: pi = Permutation([2,3,1]).to_permutation_group_element()
|
|
200
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]],pi)
|
|
201
|
+
sage: a == loads(dumps(a))
|
|
202
|
+
True
|
|
203
|
+
"""
|
|
204
|
+
if pi is None:
|
|
205
|
+
pi = Permutation([1]).to_permutation_group_element()
|
|
206
|
+
self._list = [[pi(i + 1)] + li for i, li in enumerate(l)]
|
|
207
|
+
|
|
208
|
+
def __getitem__(self, i):
|
|
209
|
+
"""
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
213
|
+
sage: a[0]
|
|
214
|
+
Traceback (most recent call last):
|
|
215
|
+
...
|
|
216
|
+
ValueError: indexing starts at 1
|
|
217
|
+
sage: a[1,0]
|
|
218
|
+
1
|
|
219
|
+
sage: a[2,0]
|
|
220
|
+
2
|
|
221
|
+
sage: a[3,2]
|
|
222
|
+
4
|
|
223
|
+
sage: a[3][2]
|
|
224
|
+
4
|
|
225
|
+
"""
|
|
226
|
+
if isinstance(i, tuple):
|
|
227
|
+
i, j = i
|
|
228
|
+
return self._list[i - 1][j]
|
|
229
|
+
if i < 1:
|
|
230
|
+
raise ValueError("indexing starts at 1")
|
|
231
|
+
return self._list[i - 1]
|
|
232
|
+
|
|
233
|
+
def shape(self):
|
|
234
|
+
"""
|
|
235
|
+
Return the shape of ``self``.
|
|
236
|
+
|
|
237
|
+
EXAMPLES::
|
|
238
|
+
|
|
239
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
240
|
+
sage: a.shape()
|
|
241
|
+
[2, 1, 3, 0, 0, 2]
|
|
242
|
+
"""
|
|
243
|
+
return LatticeDiagram([max(0, len(self[i]) - 1)
|
|
244
|
+
for i in range(1, len(self) + 1)])
|
|
245
|
+
|
|
246
|
+
def __contains__(self, ij):
|
|
247
|
+
"""
|
|
248
|
+
Return ``True`` if the box ``(i,j) (= ij)`` is in ``self``. Note that this
|
|
249
|
+
does not include the basement row.
|
|
250
|
+
|
|
251
|
+
EXAMPLES::
|
|
252
|
+
|
|
253
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
254
|
+
sage: (1,1) in a
|
|
255
|
+
True
|
|
256
|
+
sage: (1,0) in a
|
|
257
|
+
False
|
|
258
|
+
"""
|
|
259
|
+
i, j = ij
|
|
260
|
+
return 0 < i <= len(self) and 0 < j <= len(self[i])
|
|
261
|
+
|
|
262
|
+
def are_attacking(self, i, j, ii, jj):
|
|
263
|
+
"""
|
|
264
|
+
Return ``True`` if the boxes ``(i,j)`` and ``(ii,jj)`` in ``self`` are attacking.
|
|
265
|
+
|
|
266
|
+
EXAMPLES::
|
|
267
|
+
|
|
268
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
269
|
+
sage: all( a.are_attacking(i,j,ii,jj) for (i,j),(ii,jj) in a.attacking_boxes())
|
|
270
|
+
True
|
|
271
|
+
sage: a.are_attacking(1,1,3,2)
|
|
272
|
+
False
|
|
273
|
+
"""
|
|
274
|
+
# If the two boxes are at the same height,
|
|
275
|
+
# then they are attacking
|
|
276
|
+
if j == jj:
|
|
277
|
+
return True
|
|
278
|
+
|
|
279
|
+
# Make it so that the lower box is in position i,j
|
|
280
|
+
if jj < j:
|
|
281
|
+
i, j, ii, jj = ii, jj, i, j
|
|
282
|
+
|
|
283
|
+
# If the lower box is one row below and
|
|
284
|
+
# strictly to the right, then they are
|
|
285
|
+
# attacking.
|
|
286
|
+
return j == jj - 1 and i > ii
|
|
287
|
+
|
|
288
|
+
def boxes(self):
|
|
289
|
+
"""
|
|
290
|
+
Return a list of the coordinates of the boxes of ``self``, including
|
|
291
|
+
the 'basement row'.
|
|
292
|
+
|
|
293
|
+
EXAMPLES::
|
|
294
|
+
|
|
295
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
296
|
+
sage: a.boxes()
|
|
297
|
+
[(1, 1),
|
|
298
|
+
(1, 2),
|
|
299
|
+
(2, 1),
|
|
300
|
+
(3, 1),
|
|
301
|
+
(3, 2),
|
|
302
|
+
(3, 3),
|
|
303
|
+
(6, 1),
|
|
304
|
+
(6, 2),
|
|
305
|
+
(1, 0),
|
|
306
|
+
(2, 0),
|
|
307
|
+
(3, 0),
|
|
308
|
+
(4, 0),
|
|
309
|
+
(5, 0),
|
|
310
|
+
(6, 0)]
|
|
311
|
+
"""
|
|
312
|
+
return self.shape().boxes() + [(i, 0)
|
|
313
|
+
for i in range(1, len(self.shape()) + 1)]
|
|
314
|
+
|
|
315
|
+
def attacking_boxes(self):
|
|
316
|
+
"""
|
|
317
|
+
Return a list of pairs of boxes in ``self`` that are attacking.
|
|
318
|
+
|
|
319
|
+
EXAMPLES::
|
|
320
|
+
|
|
321
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
322
|
+
sage: a.attacking_boxes()[:5]
|
|
323
|
+
[((1, 1), (2, 1)),
|
|
324
|
+
((1, 1), (3, 1)),
|
|
325
|
+
((1, 1), (6, 1)),
|
|
326
|
+
((1, 1), (2, 0)),
|
|
327
|
+
((1, 1), (3, 0))]
|
|
328
|
+
"""
|
|
329
|
+
boxes = self.boxes()
|
|
330
|
+
res = []
|
|
331
|
+
for (i, j), (ii, jj) in Combinations(boxes, 2):
|
|
332
|
+
if self.are_attacking(i, j, ii, jj):
|
|
333
|
+
res.append(((i, j), (ii, jj)))
|
|
334
|
+
return res
|
|
335
|
+
|
|
336
|
+
def is_non_attacking(self):
|
|
337
|
+
"""
|
|
338
|
+
Return ``True`` if ``self`` is non-attacking.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
343
|
+
sage: a.is_non_attacking()
|
|
344
|
+
True
|
|
345
|
+
sage: a = AugmentedLatticeDiagramFilling([[1, 1, 1], [2, 3], [3]])
|
|
346
|
+
sage: a.is_non_attacking()
|
|
347
|
+
False
|
|
348
|
+
sage: a = AugmentedLatticeDiagramFilling([[2,2],[1]])
|
|
349
|
+
sage: a.is_non_attacking()
|
|
350
|
+
False
|
|
351
|
+
sage: pi = Permutation([2,1]).to_permutation_group_element()
|
|
352
|
+
sage: a = AugmentedLatticeDiagramFilling([[2,2],[1]],pi)
|
|
353
|
+
sage: a.is_non_attacking()
|
|
354
|
+
True
|
|
355
|
+
"""
|
|
356
|
+
for a, b in self.attacking_boxes():
|
|
357
|
+
if self[a] == self[b]:
|
|
358
|
+
return False
|
|
359
|
+
return True
|
|
360
|
+
|
|
361
|
+
def weight(self):
|
|
362
|
+
"""
|
|
363
|
+
Return the weight of ``self``.
|
|
364
|
+
|
|
365
|
+
EXAMPLES::
|
|
366
|
+
|
|
367
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
368
|
+
sage: a.weight()
|
|
369
|
+
[1, 2, 1, 1, 2, 1]
|
|
370
|
+
"""
|
|
371
|
+
ed = self.reading_word().evaluation_dict()
|
|
372
|
+
entries = list(ed)
|
|
373
|
+
m = max(entries) + 1 if entries else -1
|
|
374
|
+
return [ed.get(k, 0) for k in range(1, m)]
|
|
375
|
+
|
|
376
|
+
def descents(self):
|
|
377
|
+
"""
|
|
378
|
+
Return a list of the descents of ``self``.
|
|
379
|
+
|
|
380
|
+
EXAMPLES::
|
|
381
|
+
|
|
382
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
383
|
+
sage: a.descents()
|
|
384
|
+
[(1, 2), (3, 2)]
|
|
385
|
+
"""
|
|
386
|
+
res = []
|
|
387
|
+
for i, j in self.shape().boxes():
|
|
388
|
+
if self[i, j] > self[i, j - 1]:
|
|
389
|
+
res.append((i, j))
|
|
390
|
+
return res
|
|
391
|
+
|
|
392
|
+
def maj(self):
|
|
393
|
+
"""
|
|
394
|
+
Return the major index of ``self``.
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
399
|
+
sage: a.maj()
|
|
400
|
+
3
|
|
401
|
+
"""
|
|
402
|
+
res = 0
|
|
403
|
+
shape = self.shape()
|
|
404
|
+
for i, j in self.descents():
|
|
405
|
+
res += shape.l(i, j) + 1
|
|
406
|
+
return res
|
|
407
|
+
|
|
408
|
+
def reading_order(self):
|
|
409
|
+
"""
|
|
410
|
+
Return a list of coordinates of the boxes in ``self``, starting from
|
|
411
|
+
the top right, and reading from right to left.
|
|
412
|
+
|
|
413
|
+
Note that this includes the 'basement row' of ``self``.
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
418
|
+
sage: a.reading_order()
|
|
419
|
+
[(3, 3),
|
|
420
|
+
(6, 2),
|
|
421
|
+
(3, 2),
|
|
422
|
+
(1, 2),
|
|
423
|
+
(6, 1),
|
|
424
|
+
(3, 1),
|
|
425
|
+
(2, 1),
|
|
426
|
+
(1, 1),
|
|
427
|
+
(6, 0),
|
|
428
|
+
(5, 0),
|
|
429
|
+
(4, 0),
|
|
430
|
+
(3, 0),
|
|
431
|
+
(2, 0),
|
|
432
|
+
(1, 0)]
|
|
433
|
+
"""
|
|
434
|
+
boxes = self.boxes()
|
|
435
|
+
|
|
436
|
+
def fn(ij):
|
|
437
|
+
return (-ij[1], -ij[0])
|
|
438
|
+
boxes.sort(key=fn)
|
|
439
|
+
return boxes
|
|
440
|
+
|
|
441
|
+
def reading_word(self):
|
|
442
|
+
"""
|
|
443
|
+
Return the reading word of ``self``, obtained by reading the boxes
|
|
444
|
+
entries of ``self`` from right to left, starting in the upper right.
|
|
445
|
+
|
|
446
|
+
EXAMPLES::
|
|
447
|
+
|
|
448
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
449
|
+
sage: a.reading_word()
|
|
450
|
+
word: 25465321
|
|
451
|
+
"""
|
|
452
|
+
w = [self[i, j] for i, j in self.reading_order() if j > 0]
|
|
453
|
+
return Word(w)
|
|
454
|
+
|
|
455
|
+
def inversions(self):
|
|
456
|
+
"""
|
|
457
|
+
Return a list of the inversions of ``self``.
|
|
458
|
+
|
|
459
|
+
EXAMPLES::
|
|
460
|
+
|
|
461
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
462
|
+
sage: a.inversions()[:5]
|
|
463
|
+
[((6, 2), (3, 2)),
|
|
464
|
+
((1, 2), (6, 1)),
|
|
465
|
+
((1, 2), (3, 1)),
|
|
466
|
+
((1, 2), (2, 1)),
|
|
467
|
+
((6, 1), (3, 1))]
|
|
468
|
+
sage: len(a.inversions())
|
|
469
|
+
25
|
|
470
|
+
"""
|
|
471
|
+
atboxes = [set(x) for x in self.attacking_boxes()]
|
|
472
|
+
res = []
|
|
473
|
+
order = self.reading_order()
|
|
474
|
+
for a in range(len(order)):
|
|
475
|
+
i, j = order[a]
|
|
476
|
+
for b in range(a + 1, len(order)):
|
|
477
|
+
ii, jj = order[b]
|
|
478
|
+
if self[i, j] > self[ii, jj] and set(((i, j), (ii, jj))) in atboxes:
|
|
479
|
+
res.append(((i, j), (ii, jj)))
|
|
480
|
+
return res
|
|
481
|
+
|
|
482
|
+
def _inv_aux(self):
|
|
483
|
+
"""
|
|
484
|
+
EXAMPLES::
|
|
485
|
+
|
|
486
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
487
|
+
sage: a._inv_aux()
|
|
488
|
+
7
|
|
489
|
+
"""
|
|
490
|
+
res = 0
|
|
491
|
+
shape = self.shape()
|
|
492
|
+
for i in range(1, len(self) + 1):
|
|
493
|
+
for j in range(i + 1, len(self) + 1):
|
|
494
|
+
if shape[i] <= shape[j]:
|
|
495
|
+
res += 1
|
|
496
|
+
return res
|
|
497
|
+
|
|
498
|
+
def inv(self):
|
|
499
|
+
"""
|
|
500
|
+
Return ``self``'s inversion statistic.
|
|
501
|
+
|
|
502
|
+
EXAMPLES::
|
|
503
|
+
|
|
504
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
505
|
+
sage: a.inv()
|
|
506
|
+
15
|
|
507
|
+
"""
|
|
508
|
+
res = len(self.inversions())
|
|
509
|
+
res -= sum(self.shape().a(i, j) for i, j in self.descents())
|
|
510
|
+
res -= self._inv_aux()
|
|
511
|
+
return res
|
|
512
|
+
|
|
513
|
+
def coinv(self):
|
|
514
|
+
"""
|
|
515
|
+
Return ``self``'s co-inversion statistic.
|
|
516
|
+
|
|
517
|
+
EXAMPLES::
|
|
518
|
+
|
|
519
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
520
|
+
sage: a.coinv()
|
|
521
|
+
2
|
|
522
|
+
"""
|
|
523
|
+
shape = self.shape()
|
|
524
|
+
return sum(shape.a(i, j) for i, j in shape.boxes()) - self.inv()
|
|
525
|
+
|
|
526
|
+
def coeff(self, q, t):
|
|
527
|
+
"""
|
|
528
|
+
Return the coefficient in front of ``self`` in the HHL formula for the
|
|
529
|
+
expansion of the non-symmetric Macdonald polynomial
|
|
530
|
+
E(self.shape()).
|
|
531
|
+
|
|
532
|
+
EXAMPLES::
|
|
533
|
+
|
|
534
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
535
|
+
sage: q,t = var('q,t') # needs sage.symbolic
|
|
536
|
+
sage: a.coeff(q,t) # needs sage.symbolic
|
|
537
|
+
(t - 1)^4/((q^2*t^3 - 1)^2*(q*t^2 - 1)^2)
|
|
538
|
+
"""
|
|
539
|
+
res = 1
|
|
540
|
+
shape = self.shape()
|
|
541
|
+
for i, j in shape.boxes():
|
|
542
|
+
if self[i, j] != self[i, j - 1]:
|
|
543
|
+
res *= (1 - t) / (1 - q**(shape.l(i, j) + 1)
|
|
544
|
+
* t**(shape.a(i, j) + 1))
|
|
545
|
+
return res
|
|
546
|
+
|
|
547
|
+
def coeff_integral(self, q, t):
|
|
548
|
+
"""
|
|
549
|
+
Return the coefficient in front of ``self`` in the HHL formula for the
|
|
550
|
+
expansion of the integral non-symmetric Macdonald polynomial
|
|
551
|
+
E(self.shape())
|
|
552
|
+
|
|
553
|
+
EXAMPLES::
|
|
554
|
+
|
|
555
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
556
|
+
sage: q,t = var('q,t') # needs sage.symbolic
|
|
557
|
+
sage: a.coeff_integral(q,t) # needs sage.symbolic
|
|
558
|
+
(q^2*t^3 - 1)^2*(q*t^2 - 1)^2*(t - 1)^4
|
|
559
|
+
"""
|
|
560
|
+
res = 1
|
|
561
|
+
shape = self.shape()
|
|
562
|
+
for i, j in shape.boxes():
|
|
563
|
+
if self[i, j] != self[i, j - 1]:
|
|
564
|
+
res *= (1 - q**(shape.l(i, j) + 1) * t**(shape.a(i, j) + 1))
|
|
565
|
+
for i, j in shape.boxes():
|
|
566
|
+
if self[i, j] == self[i, j - 1]:
|
|
567
|
+
res *= (1 - t)
|
|
568
|
+
return res
|
|
569
|
+
|
|
570
|
+
def permuted_filling(self, sigma):
|
|
571
|
+
"""
|
|
572
|
+
EXAMPLES::
|
|
573
|
+
|
|
574
|
+
sage: pi=Permutation([2,1,4,3]).to_permutation_group_element()
|
|
575
|
+
sage: fill=[[2],[1,2,3],[],[3,1]]
|
|
576
|
+
sage: AugmentedLatticeDiagramFilling(fill).permuted_filling(pi)
|
|
577
|
+
[[2, 1], [1, 2, 1, 4], [4], [3, 4, 2]]
|
|
578
|
+
"""
|
|
579
|
+
new_filling = []
|
|
580
|
+
for col in self:
|
|
581
|
+
nc = [sigma(x) for x in col]
|
|
582
|
+
nc.pop(0)
|
|
583
|
+
new_filling.append(nc)
|
|
584
|
+
return AugmentedLatticeDiagramFilling(new_filling, sigma)
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
def NonattackingFillings(shape, pi=None):
|
|
588
|
+
"""
|
|
589
|
+
Returning the finite set of nonattacking fillings of a
|
|
590
|
+
given shape.
|
|
591
|
+
|
|
592
|
+
EXAMPLES::
|
|
593
|
+
|
|
594
|
+
sage: NonattackingFillings([0,1,2])
|
|
595
|
+
Nonattacking fillings of [0, 1, 2]
|
|
596
|
+
sage: NonattackingFillings([0,1,2]).list()
|
|
597
|
+
[[[1], [2, 1], [3, 2, 1]],
|
|
598
|
+
[[1], [2, 1], [3, 2, 2]],
|
|
599
|
+
[[1], [2, 1], [3, 2, 3]],
|
|
600
|
+
[[1], [2, 1], [3, 3, 1]],
|
|
601
|
+
[[1], [2, 1], [3, 3, 2]],
|
|
602
|
+
[[1], [2, 1], [3, 3, 3]],
|
|
603
|
+
[[1], [2, 2], [3, 1, 1]],
|
|
604
|
+
[[1], [2, 2], [3, 1, 2]],
|
|
605
|
+
[[1], [2, 2], [3, 1, 3]],
|
|
606
|
+
[[1], [2, 2], [3, 3, 1]],
|
|
607
|
+
[[1], [2, 2], [3, 3, 2]],
|
|
608
|
+
[[1], [2, 2], [3, 3, 3]]]
|
|
609
|
+
"""
|
|
610
|
+
return NonattackingFillings_shape(tuple(shape), pi)
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
class NonattackingFillings_shape(Parent, UniqueRepresentation):
|
|
614
|
+
def __init__(self, shape, pi=None):
|
|
615
|
+
"""
|
|
616
|
+
EXAMPLES::
|
|
617
|
+
|
|
618
|
+
sage: n = NonattackingFillings([0,1,2])
|
|
619
|
+
sage: n == loads(dumps(n))
|
|
620
|
+
True
|
|
621
|
+
"""
|
|
622
|
+
self.pi = pi
|
|
623
|
+
self._shape = LatticeDiagram(shape)
|
|
624
|
+
self._name = "Nonattacking fillings of %s" % list(shape)
|
|
625
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
626
|
+
|
|
627
|
+
def __repr__(self):
|
|
628
|
+
"""
|
|
629
|
+
EXAMPLES::
|
|
630
|
+
|
|
631
|
+
sage: NonattackingFillings([0,1,2])
|
|
632
|
+
Nonattacking fillings of [0, 1, 2]
|
|
633
|
+
"""
|
|
634
|
+
return self._name
|
|
635
|
+
|
|
636
|
+
def flip(self):
|
|
637
|
+
"""
|
|
638
|
+
Return the nonattacking fillings of the flipped shape.
|
|
639
|
+
|
|
640
|
+
EXAMPLES::
|
|
641
|
+
|
|
642
|
+
sage: NonattackingFillings([0,1,2]).flip()
|
|
643
|
+
Nonattacking fillings of [2, 1, 0]
|
|
644
|
+
"""
|
|
645
|
+
return NonattackingFillings(list(self._shape.flip()), self.pi)
|
|
646
|
+
|
|
647
|
+
def __iter__(self):
|
|
648
|
+
"""
|
|
649
|
+
EXAMPLES::
|
|
650
|
+
|
|
651
|
+
sage: NonattackingFillings([0,1,2]).list() #indirect doctest
|
|
652
|
+
[[[1], [2, 1], [3, 2, 1]],
|
|
653
|
+
[[1], [2, 1], [3, 2, 2]],
|
|
654
|
+
[[1], [2, 1], [3, 2, 3]],
|
|
655
|
+
[[1], [2, 1], [3, 3, 1]],
|
|
656
|
+
[[1], [2, 1], [3, 3, 2]],
|
|
657
|
+
[[1], [2, 1], [3, 3, 3]],
|
|
658
|
+
[[1], [2, 2], [3, 1, 1]],
|
|
659
|
+
[[1], [2, 2], [3, 1, 2]],
|
|
660
|
+
[[1], [2, 2], [3, 1, 3]],
|
|
661
|
+
[[1], [2, 2], [3, 3, 1]],
|
|
662
|
+
[[1], [2, 2], [3, 3, 2]],
|
|
663
|
+
[[1], [2, 2], [3, 3, 3]]]
|
|
664
|
+
sage: len(_)
|
|
665
|
+
12
|
|
666
|
+
|
|
667
|
+
TESTS::
|
|
668
|
+
|
|
669
|
+
sage: NonattackingFillings([3,2,1,1]).cardinality()
|
|
670
|
+
3
|
|
671
|
+
sage: NonattackingFillings([3,2,1,2]).cardinality()
|
|
672
|
+
4
|
|
673
|
+
sage: NonattackingFillings([1,2,3]).cardinality()
|
|
674
|
+
12
|
|
675
|
+
sage: NonattackingFillings([2,2,2]).cardinality()
|
|
676
|
+
1
|
|
677
|
+
sage: NonattackingFillings([1,2,3,2]).cardinality()
|
|
678
|
+
24
|
|
679
|
+
"""
|
|
680
|
+
if sum(self._shape) == 0:
|
|
681
|
+
yield AugmentedLatticeDiagramFilling([[] for _ in self._shape],
|
|
682
|
+
self.pi)
|
|
683
|
+
return
|
|
684
|
+
|
|
685
|
+
for z in NonattackingBacktracker(self._shape, self.pi):
|
|
686
|
+
yield AugmentedLatticeDiagramFilling(z, self.pi)
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
class NonattackingBacktracker(GenericBacktracker):
|
|
690
|
+
def __init__(self, shape, pi=None):
|
|
691
|
+
"""
|
|
692
|
+
EXAMPLES::
|
|
693
|
+
|
|
694
|
+
sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
|
|
695
|
+
sage: n = NonattackingBacktracker(LatticeDiagram([0,1,2]))
|
|
696
|
+
sage: n._ending_position
|
|
697
|
+
(3, 2)
|
|
698
|
+
sage: n._initial_state
|
|
699
|
+
(2, 1)
|
|
700
|
+
"""
|
|
701
|
+
self._shape = shape
|
|
702
|
+
self._n = sum(shape)
|
|
703
|
+
self._initial_data = [[None] * s for s in shape]
|
|
704
|
+
if pi is None:
|
|
705
|
+
pi = Permutation([1]).to_permutation_group_element()
|
|
706
|
+
self.pi = pi
|
|
707
|
+
|
|
708
|
+
# The ending position will be at the highest box
|
|
709
|
+
# which is farthest right
|
|
710
|
+
ending_row = max(shape)
|
|
711
|
+
ending_col = len(shape) - list(reversed(list(shape))).index(ending_row)
|
|
712
|
+
self._ending_position = (ending_col, ending_row)
|
|
713
|
+
|
|
714
|
+
# Get the lowest box that is farthest left
|
|
715
|
+
starting_row = 1
|
|
716
|
+
nonzero = [i for i in shape if i != 0]
|
|
717
|
+
starting_col = list(shape).index(nonzero[0]) + 1
|
|
718
|
+
|
|
719
|
+
GenericBacktracker.__init__(self, self._initial_data, (starting_col, starting_row))
|
|
720
|
+
|
|
721
|
+
def _rec(self, obj, state):
|
|
722
|
+
"""
|
|
723
|
+
EXAMPLES::
|
|
724
|
+
|
|
725
|
+
sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
|
|
726
|
+
sage: n = NonattackingBacktracker(LatticeDiagram([0,1,2]))
|
|
727
|
+
sage: len(list(n))
|
|
728
|
+
12
|
|
729
|
+
sage: obj = [ [], [None], [None, None]]
|
|
730
|
+
sage: state = 2, 1
|
|
731
|
+
sage: list(n._rec(obj, state))
|
|
732
|
+
[([[], [1], [None, None]], (3, 1), False),
|
|
733
|
+
([[], [2], [None, None]], (3, 1), False)]
|
|
734
|
+
"""
|
|
735
|
+
# We need to set the i,j^th entry.
|
|
736
|
+
i, j = state
|
|
737
|
+
|
|
738
|
+
# Get the next state
|
|
739
|
+
new_state = self.get_next_pos(i, j)
|
|
740
|
+
yld = bool(new_state is None)
|
|
741
|
+
|
|
742
|
+
for k in range(1, len(self._shape) + 1):
|
|
743
|
+
# We check to make sure that k does not
|
|
744
|
+
# violate any of the attacking conditions
|
|
745
|
+
if j == 1 and any(self.pi(x + 1) == k
|
|
746
|
+
for x in range(i, len(self._shape))):
|
|
747
|
+
continue
|
|
748
|
+
if any(obj[ii - 1][jj - 1] == k for ii, jj in
|
|
749
|
+
self._shape.boxes_same_and_lower_right(i, j) if jj != 0):
|
|
750
|
+
continue
|
|
751
|
+
|
|
752
|
+
# Fill in the in the i,j box with k+1
|
|
753
|
+
obj[i - 1][j - 1] = k
|
|
754
|
+
|
|
755
|
+
# Yield the object
|
|
756
|
+
yield copy.deepcopy(obj), new_state, yld
|
|
757
|
+
|
|
758
|
+
def get_next_pos(self, ii, jj):
|
|
759
|
+
"""
|
|
760
|
+
EXAMPLES::
|
|
761
|
+
|
|
762
|
+
sage: from sage.combinat.sf.ns_macdonald import NonattackingBacktracker
|
|
763
|
+
sage: a = AugmentedLatticeDiagramFilling([[1,6],[2],[3,4,2],[],[],[5,5]])
|
|
764
|
+
sage: n = NonattackingBacktracker(a.shape())
|
|
765
|
+
sage: n.get_next_pos(1, 1)
|
|
766
|
+
(2, 1)
|
|
767
|
+
sage: n.get_next_pos(6, 1)
|
|
768
|
+
(1, 2)
|
|
769
|
+
sage: n = NonattackingBacktracker(LatticeDiagram([2,2,2]))
|
|
770
|
+
sage: n.get_next_pos(3, 1)
|
|
771
|
+
(1, 2)
|
|
772
|
+
"""
|
|
773
|
+
if (ii, jj) == self._ending_position:
|
|
774
|
+
return None
|
|
775
|
+
|
|
776
|
+
for i in range(ii + 1, len(self._shape) + 1):
|
|
777
|
+
if self._shape[i] >= jj:
|
|
778
|
+
return i, jj
|
|
779
|
+
|
|
780
|
+
for i in range(1, ii + 1):
|
|
781
|
+
if self._shape[i] >= jj + 1:
|
|
782
|
+
return i, jj + 1
|
|
783
|
+
|
|
784
|
+
raise ValueError("we should never be here")
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
def _check_muqt(mu, q, t, pi=None):
|
|
788
|
+
"""
|
|
789
|
+
EXAMPLES::
|
|
790
|
+
|
|
791
|
+
sage: from sage.combinat.sf.ns_macdonald import _check_muqt
|
|
792
|
+
sage: P, q, t, n, R, x = _check_muqt([0,0,1],None,None)
|
|
793
|
+
sage: P
|
|
794
|
+
Fraction Field of Multivariate Polynomial Ring in q, t over Rational Field
|
|
795
|
+
sage: q
|
|
796
|
+
q
|
|
797
|
+
sage: t
|
|
798
|
+
t
|
|
799
|
+
sage: n
|
|
800
|
+
Nonattacking fillings of [0, 0, 1]
|
|
801
|
+
sage: R
|
|
802
|
+
Multivariate Polynomial Ring in x0, x1, x2 over Fraction Field of Multivariate Polynomial Ring in q, t over Rational Field
|
|
803
|
+
sage: x
|
|
804
|
+
(x0, x1, x2)
|
|
805
|
+
|
|
806
|
+
::
|
|
807
|
+
|
|
808
|
+
sage: q,t = var('q,t') # needs sage.symbolic
|
|
809
|
+
sage: P, q, t, n, R, x = _check_muqt([0,0,1],q,None) # needs sage.symbolic
|
|
810
|
+
Traceback (most recent call last):
|
|
811
|
+
...
|
|
812
|
+
ValueError: you must specify either both q and t or neither of them
|
|
813
|
+
|
|
814
|
+
::
|
|
815
|
+
|
|
816
|
+
sage: P, q, t, n, R, x = _check_muqt([0,0,1],q,2) # needs sage.symbolic
|
|
817
|
+
Traceback (most recent call last):
|
|
818
|
+
...
|
|
819
|
+
ValueError: the parents of q and t must be the same
|
|
820
|
+
"""
|
|
821
|
+
if q is None and t is None:
|
|
822
|
+
P = PolynomialRing(QQ, 'q,t').fraction_field()
|
|
823
|
+
q, t = P.gens()
|
|
824
|
+
elif q is not None and t is not None:
|
|
825
|
+
if q.parent() != t.parent():
|
|
826
|
+
raise ValueError("the parents of q and t must be the same")
|
|
827
|
+
P = q.parent()
|
|
828
|
+
else:
|
|
829
|
+
raise ValueError("you must specify either both q and t or neither of them")
|
|
830
|
+
n = NonattackingFillings(mu, pi)
|
|
831
|
+
R = PolynomialRing(P, len(n._shape), 'x')
|
|
832
|
+
x = R.gens()
|
|
833
|
+
return P, q, t, n, R, x
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
def E(mu, q=None, t=None, pi=None):
|
|
837
|
+
"""
|
|
838
|
+
Return the non-symmetric Macdonald polynomial in type A
|
|
839
|
+
corresponding to a shape ``mu``, with basement permuted according to
|
|
840
|
+
``pi``.
|
|
841
|
+
|
|
842
|
+
Note that if both `q` and `t` are specified, then they must have
|
|
843
|
+
the same parent.
|
|
844
|
+
|
|
845
|
+
REFERENCE:
|
|
846
|
+
|
|
847
|
+
- J. Haglund, M. Haiman, N. Loehr.
|
|
848
|
+
*A combinatorial formula for non-symmetric Macdonald polynomials*.
|
|
849
|
+
:arxiv:`math/0601693v3`.
|
|
850
|
+
|
|
851
|
+
.. SEEALSO::
|
|
852
|
+
|
|
853
|
+
:class:`~sage.combinat.root_system.non_symmetric_macdonald_polynomials.NonSymmetricMacdonaldPolynomials`
|
|
854
|
+
for a type free implementation where the polynomials are
|
|
855
|
+
constructed recursively by the application of intertwining
|
|
856
|
+
operators.
|
|
857
|
+
|
|
858
|
+
EXAMPLES::
|
|
859
|
+
|
|
860
|
+
sage: from sage.combinat.sf.ns_macdonald import E
|
|
861
|
+
sage: E([0,0,0])
|
|
862
|
+
1
|
|
863
|
+
sage: E([1,0,0])
|
|
864
|
+
x0
|
|
865
|
+
sage: E([0,1,0])
|
|
866
|
+
(t - 1)/(q*t^2 - 1)*x0 + x1
|
|
867
|
+
sage: E([0,0,1])
|
|
868
|
+
(t - 1)/(q*t - 1)*x0 + (t - 1)/(q*t - 1)*x1 + x2
|
|
869
|
+
sage: E([1,1,0])
|
|
870
|
+
x0*x1
|
|
871
|
+
sage: E([1,0,1])
|
|
872
|
+
(t - 1)/(q*t^2 - 1)*x0*x1 + x0*x2
|
|
873
|
+
sage: E([0,1,1])
|
|
874
|
+
(t - 1)/(q*t - 1)*x0*x1 + (t - 1)/(q*t - 1)*x0*x2 + x1*x2
|
|
875
|
+
sage: E([2,0,0])
|
|
876
|
+
x0^2 + (q*t - q)/(q*t - 1)*x0*x1 + (q*t - q)/(q*t - 1)*x0*x2
|
|
877
|
+
sage: E([0,2,0])
|
|
878
|
+
(t - 1)/(q^2*t^2 - 1)*x0^2 + (q^2*t^3 - q^2*t^2 + q*t^2 - 2*q*t + q - t + 1)/(q^3*t^3 - q^2*t^2 - q*t + 1)*x0*x1 + x1^2 + (q*t^2 - 2*q*t + q)/(q^3*t^3 - q^2*t^2 - q*t + 1)*x0*x2 + (q*t - q)/(q*t - 1)*x1*x2
|
|
879
|
+
"""
|
|
880
|
+
P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
|
|
881
|
+
res = 0
|
|
882
|
+
for a in n:
|
|
883
|
+
weight = a.weight()
|
|
884
|
+
res += q**a.maj() * t**a.coinv() * a.coeff(q, t) * prod(x[i]**weight[i] for i in range(len(weight)))
|
|
885
|
+
return res
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def E_integral(mu, q=None, t=None, pi=None):
|
|
889
|
+
"""
|
|
890
|
+
Return the integral form for the non-symmetric Macdonald
|
|
891
|
+
polynomial in type A corresponding to a shape mu.
|
|
892
|
+
|
|
893
|
+
Note that if both q and t are specified, then they must have the
|
|
894
|
+
same parent.
|
|
895
|
+
|
|
896
|
+
REFERENCE:
|
|
897
|
+
|
|
898
|
+
- J. Haglund, M. Haiman, N. Loehr.
|
|
899
|
+
*A combinatorial formula for non-symmetric Macdonald polynomials*.
|
|
900
|
+
:arxiv:`math/0601693v3`.
|
|
901
|
+
|
|
902
|
+
EXAMPLES::
|
|
903
|
+
|
|
904
|
+
sage: from sage.combinat.sf.ns_macdonald import E_integral
|
|
905
|
+
sage: E_integral([0,0,0])
|
|
906
|
+
1
|
|
907
|
+
sage: E_integral([1,0,0])
|
|
908
|
+
(-t + 1)*x0
|
|
909
|
+
sage: E_integral([0,1,0])
|
|
910
|
+
(-q*t^2 + 1)*x0 + (-t + 1)*x1
|
|
911
|
+
sage: E_integral([0,0,1])
|
|
912
|
+
(-q*t + 1)*x0 + (-q*t + 1)*x1 + (-t + 1)*x2
|
|
913
|
+
sage: E_integral([1,1,0])
|
|
914
|
+
(t^2 - 2*t + 1)*x0*x1
|
|
915
|
+
sage: E_integral([1,0,1])
|
|
916
|
+
(q*t^3 - q*t^2 - t + 1)*x0*x1 + (t^2 - 2*t + 1)*x0*x2
|
|
917
|
+
sage: E_integral([0,1,1])
|
|
918
|
+
(q^2*t^3 + q*t^4 - q*t^3 - q*t^2 - q*t - t^2 + t + 1)*x0*x1 + (q*t^2 - q*t - t + 1)*x0*x2 + (t^2 - 2*t + 1)*x1*x2
|
|
919
|
+
sage: E_integral([2,0,0])
|
|
920
|
+
(t^2 - 2*t + 1)*x0^2 + (q^2*t^2 - q^2*t - q*t + q)*x0*x1 + (q^2*t^2 - q^2*t - q*t + q)*x0*x2
|
|
921
|
+
sage: E_integral([0,2,0])
|
|
922
|
+
(q^2*t^3 - q^2*t^2 - t + 1)*x0^2 + (q^4*t^3 - q^3*t^2 - q^2*t + q*t^2 - q*t + q - t + 1)*x0*x1 + (t^2 - 2*t + 1)*x1^2 + (q^4*t^3 - q^3*t^2 - q^2*t + q)*x0*x2 + (q^2*t^2 - q^2*t - q*t + q)*x1*x2
|
|
923
|
+
"""
|
|
924
|
+
P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
|
|
925
|
+
res = 0
|
|
926
|
+
for a in n:
|
|
927
|
+
weight = a.weight()
|
|
928
|
+
res += q**a.maj() * t**a.coinv() * a.coeff_integral(q, t) * prod(x[i]**weight[i] for i in range(len(weight)))
|
|
929
|
+
return res
|
|
930
|
+
|
|
931
|
+
|
|
932
|
+
def Ht(mu, q=None, t=None, pi=None):
|
|
933
|
+
"""
|
|
934
|
+
Return the symmetric Macdonald polynomial using the Haiman,
|
|
935
|
+
Haglund, and Loehr formula.
|
|
936
|
+
|
|
937
|
+
Note that if both `q` and `t` are specified, then they must have the
|
|
938
|
+
same parent.
|
|
939
|
+
|
|
940
|
+
REFERENCE:
|
|
941
|
+
|
|
942
|
+
- J. Haglund, M. Haiman, N. Loehr.
|
|
943
|
+
*A combinatorial formula for non-symmetric Macdonald polynomials*.
|
|
944
|
+
:arxiv:`math/0601693v3`.
|
|
945
|
+
|
|
946
|
+
EXAMPLES::
|
|
947
|
+
|
|
948
|
+
sage: from sage.combinat.sf.ns_macdonald import Ht
|
|
949
|
+
sage: HHt = SymmetricFunctions(QQ['q','t'].fraction_field()).macdonald().Ht()
|
|
950
|
+
sage: Ht([0,0,1])
|
|
951
|
+
x0 + x1 + x2
|
|
952
|
+
sage: HHt([1]).expand(3)
|
|
953
|
+
x0 + x1 + x2
|
|
954
|
+
sage: Ht([0,0,2])
|
|
955
|
+
x0^2 + (q + 1)*x0*x1 + x1^2 + (q + 1)*x0*x2 + (q + 1)*x1*x2 + x2^2
|
|
956
|
+
sage: HHt([2]).expand(3)
|
|
957
|
+
x0^2 + (q + 1)*x0*x1 + x1^2 + (q + 1)*x0*x2 + (q + 1)*x1*x2 + x2^2
|
|
958
|
+
"""
|
|
959
|
+
P, q, t, n, R, x = _check_muqt(mu, q, t, pi)
|
|
960
|
+
res = 0
|
|
961
|
+
for a in n:
|
|
962
|
+
weight = a.weight()
|
|
963
|
+
res += q**a.maj() * t**a.inv() * prod(x[i]**weight[i] for i in range(len(weight)))
|
|
964
|
+
return res
|