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,508 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Schubert polynomials
|
|
5
|
+
|
|
6
|
+
See :wikipedia:`Schubert_polynomial` and
|
|
7
|
+
`SymmetricFunctions.com <https://www.symmetricfunctions.com/schubert.htm#schubert>`_.
|
|
8
|
+
Schubert polynomials are representatives of cohomology classes in flag varieties.
|
|
9
|
+
In `n` variables, they are indexed by permutations `w \in S_n`. They also form
|
|
10
|
+
a basis for the coinvariant ring of the `S_n` action on
|
|
11
|
+
`\ZZ[x_1, x_2, \ldots, x_n]`.
|
|
12
|
+
|
|
13
|
+
EXAMPLES::
|
|
14
|
+
|
|
15
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
16
|
+
sage: w = [1,2,5,4,3]; # a list representing an element of `S_5`
|
|
17
|
+
sage: X(w)
|
|
18
|
+
X[1, 2, 5, 4, 3]
|
|
19
|
+
|
|
20
|
+
This can be expanded in terms of polynomial variables::
|
|
21
|
+
|
|
22
|
+
sage: X(w).expand()
|
|
23
|
+
x0^2*x1 + x0*x1^2 + x0^2*x2 + 2*x0*x1*x2 + x1^2*x2
|
|
24
|
+
+ x0*x2^2 + x1*x2^2 + x0^2*x3 + x0*x1*x3 + x1^2*x3
|
|
25
|
+
+ x0*x2*x3 + x1*x2*x3 + x2^2*x3
|
|
26
|
+
|
|
27
|
+
We can also convert back from polynomial variables. For example,
|
|
28
|
+
the longest permutation is a single term. In `S_5`, this is the
|
|
29
|
+
element (in one line notation) `w_0 = 54321`::
|
|
30
|
+
|
|
31
|
+
sage: w0 = [5,4,3,2,1]
|
|
32
|
+
sage: R.<x0, x1, x2, x3, x4> = PolynomialRing(ZZ)
|
|
33
|
+
sage: Sw0 = X(x0^4*x1^3*x2^2*x3); Sw0
|
|
34
|
+
X[5, 4, 3, 2, 1]
|
|
35
|
+
|
|
36
|
+
The polynomials also have the property that if the indexing permutation `w` is
|
|
37
|
+
multiplied by a simple transposition `s_i = (i, i+1)` such that the length of
|
|
38
|
+
`w` is more than the length of `ws_i`, then the Schubert
|
|
39
|
+
polynomial of the permutation `ws_i` is computed by applying the divided
|
|
40
|
+
difference operator :meth:`~SchubertPolynomial_class.divided_difference` to
|
|
41
|
+
the polynomial indexed by `w`. For example, applying the divided difference
|
|
42
|
+
operator `\partial_2` to the Schubert polynomial `\mathfrak{S}_{w_0}`::
|
|
43
|
+
|
|
44
|
+
sage: Sw0.divided_difference(2)
|
|
45
|
+
X[5, 3, 4, 2, 1]
|
|
46
|
+
|
|
47
|
+
We can also check the properties listed in :wikipedia:`Schubert_polynomial`::
|
|
48
|
+
|
|
49
|
+
sage: X([1,2,3,4,5]) # the identity in one-line notation
|
|
50
|
+
X[1]
|
|
51
|
+
sage: X([1,3,2,4,5]).expand() # the transposition swapping 2 and 3
|
|
52
|
+
x0 + x1
|
|
53
|
+
sage: X([2,4,5,3,1]).expand()
|
|
54
|
+
x0^2*x1^2*x2*x3 + x0^2*x1*x2^2*x3 + x0*x1^2*x2^2*x3
|
|
55
|
+
|
|
56
|
+
sage: w = [4,5,1,2,3]
|
|
57
|
+
sage: s = SymmetricFunctions(QQ).schur()
|
|
58
|
+
sage: s[3,3].expand(2)
|
|
59
|
+
x0^3*x1^3
|
|
60
|
+
sage: X(w).expand()
|
|
61
|
+
x0^3*x1^3
|
|
62
|
+
"""
|
|
63
|
+
# ****************************************************************************
|
|
64
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
65
|
+
#
|
|
66
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
67
|
+
#
|
|
68
|
+
# This code is distributed in the hope that it will be useful,
|
|
69
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
70
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
71
|
+
# General Public License for more details.
|
|
72
|
+
#
|
|
73
|
+
# The full text of the GPL is available at:
|
|
74
|
+
#
|
|
75
|
+
# https://www.gnu.org/licenses/
|
|
76
|
+
# ****************************************************************************
|
|
77
|
+
|
|
78
|
+
from sage.categories.graded_algebras_with_basis import GradedAlgebrasWithBasis
|
|
79
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
80
|
+
from sage.combinat.key_polynomial import KeyPolynomial
|
|
81
|
+
from sage.combinat.permutation import Permutations, Permutation
|
|
82
|
+
from sage.misc.cachefunc import cached_method
|
|
83
|
+
from sage.misc.lazy_import import lazy_import
|
|
84
|
+
from sage.rings.integer import Integer
|
|
85
|
+
from sage.rings.integer_ring import ZZ
|
|
86
|
+
from sage.rings.polynomial.infinite_polynomial_element import InfinitePolynomial
|
|
87
|
+
from sage.rings.polynomial.multi_polynomial import MPolynomial
|
|
88
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
89
|
+
|
|
90
|
+
lazy_import('sage.libs.symmetrica', 'all', as_='symmetrica')
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def SchubertPolynomialRing(R):
|
|
94
|
+
"""
|
|
95
|
+
Return the Schubert polynomial ring over ``R`` on the X basis.
|
|
96
|
+
|
|
97
|
+
This is the basis made of the Schubert polynomials.
|
|
98
|
+
|
|
99
|
+
EXAMPLES::
|
|
100
|
+
|
|
101
|
+
sage: X = SchubertPolynomialRing(ZZ); X
|
|
102
|
+
Schubert polynomial ring with X basis over Integer Ring
|
|
103
|
+
sage: TestSuite(X).run()
|
|
104
|
+
sage: X(1)
|
|
105
|
+
X[1]
|
|
106
|
+
sage: X([1,2,3])*X([2,1,3])
|
|
107
|
+
X[2, 1]
|
|
108
|
+
sage: X([2,1,3])*X([2,1,3])
|
|
109
|
+
X[3, 1, 2]
|
|
110
|
+
sage: X([2,1,3])+X([3,1,2,4])
|
|
111
|
+
X[2, 1] + X[3, 1, 2]
|
|
112
|
+
sage: a = X([2,1,3])+X([3,1,2,4])
|
|
113
|
+
sage: a^2
|
|
114
|
+
X[3, 1, 2] + 2*X[4, 1, 2, 3] + X[5, 1, 2, 3, 4]
|
|
115
|
+
"""
|
|
116
|
+
return SchubertPolynomialRing_xbasis(R)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class SchubertPolynomial_class(CombinatorialFreeModule.Element):
|
|
120
|
+
def expand(self):
|
|
121
|
+
"""
|
|
122
|
+
EXAMPLES::
|
|
123
|
+
|
|
124
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
125
|
+
sage: X([2,1,3]).expand()
|
|
126
|
+
x0
|
|
127
|
+
sage: [X(p).expand() for p in Permutations(3)]
|
|
128
|
+
[1, x0 + x1, x0, x0*x1, x0^2, x0^2*x1]
|
|
129
|
+
|
|
130
|
+
TESTS:
|
|
131
|
+
|
|
132
|
+
Calling .expand() should always return an element of an
|
|
133
|
+
MPolynomialRing::
|
|
134
|
+
|
|
135
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
136
|
+
sage: f = X([1]); f
|
|
137
|
+
X[1]
|
|
138
|
+
sage: type(f.expand())
|
|
139
|
+
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
|
|
140
|
+
sage: f.expand()
|
|
141
|
+
1
|
|
142
|
+
sage: f = X([1,2])
|
|
143
|
+
sage: type(f.expand())
|
|
144
|
+
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
|
|
145
|
+
sage: f = X([1,3,2,4])
|
|
146
|
+
sage: type(f.expand())
|
|
147
|
+
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
|
|
148
|
+
|
|
149
|
+
Now we check for correct handling of the empty
|
|
150
|
+
permutation (:issue:`23443`)::
|
|
151
|
+
|
|
152
|
+
sage: X([1]).expand() * X([2,1]).expand()
|
|
153
|
+
x0
|
|
154
|
+
"""
|
|
155
|
+
p = symmetrica.t_SCHUBERT_POLYNOM(self)
|
|
156
|
+
if not isinstance(p, MPolynomial):
|
|
157
|
+
R = PolynomialRing(self.parent().base_ring(), 1, 'x0')
|
|
158
|
+
p = R(p)
|
|
159
|
+
return p
|
|
160
|
+
|
|
161
|
+
def divided_difference(self, i, algorithm='sage'):
|
|
162
|
+
r"""
|
|
163
|
+
Return the ``i``-th divided difference operator, applied to ``self``.
|
|
164
|
+
|
|
165
|
+
Here, ``i`` can be either a permutation or a positive integer.
|
|
166
|
+
|
|
167
|
+
INPUT:
|
|
168
|
+
|
|
169
|
+
- ``i`` -- permutation or positive integer
|
|
170
|
+
|
|
171
|
+
- ``algorithm`` -- (default: ``'sage'``) either ``'sage'``
|
|
172
|
+
or ``'symmetrica'``; this determines which software is
|
|
173
|
+
called for the computation
|
|
174
|
+
|
|
175
|
+
OUTPUT:
|
|
176
|
+
|
|
177
|
+
The result of applying the ``i``-th divided difference
|
|
178
|
+
operator to ``self``.
|
|
179
|
+
|
|
180
|
+
If `i` is a positive integer, then the `i`-th divided
|
|
181
|
+
difference operator `\delta_i` is the linear operator sending
|
|
182
|
+
each polynomial `f = f(x_1, x_2, \ldots, x_n)` (in
|
|
183
|
+
`n \geq i+1` variables) to the polynomial
|
|
184
|
+
|
|
185
|
+
.. MATH::
|
|
186
|
+
|
|
187
|
+
\frac{f - f_i}{x_i - x_{i+1}}, \qquad \text{ where }
|
|
188
|
+
f_i = f(x_1, x_2, ..., x_{i-1}, x_{i+1}, x_i,
|
|
189
|
+
x_{i+1}, ..., x_n) .
|
|
190
|
+
|
|
191
|
+
If `\sigma` is a permutation in the `n`-th symmetric group,
|
|
192
|
+
then the `\sigma`-th divided difference operator `\delta_\sigma`
|
|
193
|
+
is the composition
|
|
194
|
+
`\delta_{i_1} \delta_{i_2} \cdots \delta_{i_k}`, where
|
|
195
|
+
`\sigma = s_{i_1} \circ s_{i_2} \circ \cdots \circ s_{i_k}` is
|
|
196
|
+
any reduced expression for `\sigma` (the precise choice of
|
|
197
|
+
reduced expression is immaterial).
|
|
198
|
+
|
|
199
|
+
.. NOTE::
|
|
200
|
+
|
|
201
|
+
The :meth:`expand` method results in a polynomial
|
|
202
|
+
in `n` variables named ``x0, x1, ..., x(n-1)`` rather than
|
|
203
|
+
`x_1, x_2, \ldots, x_n`.
|
|
204
|
+
The variable named ``xi`` corresponds to `x_{i+1}`.
|
|
205
|
+
Thus, ``self.divided_difference(i)`` involves the variables
|
|
206
|
+
``x(i-1)`` and ``xi`` getting switched (in the numerator).
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
211
|
+
sage: a = X([3,2,1])
|
|
212
|
+
sage: a.divided_difference(1)
|
|
213
|
+
X[2, 3, 1]
|
|
214
|
+
sage: a.divided_difference([3,2,1])
|
|
215
|
+
X[1]
|
|
216
|
+
sage: a.divided_difference(5)
|
|
217
|
+
0
|
|
218
|
+
|
|
219
|
+
Any divided difference of `0` is `0`::
|
|
220
|
+
|
|
221
|
+
sage: X.zero().divided_difference(2)
|
|
222
|
+
0
|
|
223
|
+
|
|
224
|
+
This is compatible when a permutation is given as input::
|
|
225
|
+
|
|
226
|
+
sage: a = X([3,2,4,1])
|
|
227
|
+
sage: a.divided_difference([2,3,1])
|
|
228
|
+
0
|
|
229
|
+
sage: a.divided_difference(1).divided_difference(2)
|
|
230
|
+
0
|
|
231
|
+
|
|
232
|
+
::
|
|
233
|
+
|
|
234
|
+
sage: a = X([4,3,2,1])
|
|
235
|
+
sage: a.divided_difference([2,3,1])
|
|
236
|
+
X[3, 2, 4, 1]
|
|
237
|
+
sage: a.divided_difference(1).divided_difference(2)
|
|
238
|
+
X[3, 2, 4, 1]
|
|
239
|
+
sage: a.divided_difference([4,1,3,2])
|
|
240
|
+
X[1, 4, 2, 3]
|
|
241
|
+
sage: b = X([4, 1, 3, 2])
|
|
242
|
+
sage: b.divided_difference(1).divided_difference(2)
|
|
243
|
+
X[1, 3, 4, 2]
|
|
244
|
+
sage: b.divided_difference(1).divided_difference(2).divided_difference(3)
|
|
245
|
+
X[1, 3, 2]
|
|
246
|
+
sage: b.divided_difference(1).divided_difference(2).divided_difference(3).divided_difference(2)
|
|
247
|
+
X[1]
|
|
248
|
+
sage: b.divided_difference(1).divided_difference(2).divided_difference(3).divided_difference(3)
|
|
249
|
+
0
|
|
250
|
+
sage: b.divided_difference(1).divided_difference(2).divided_difference(1)
|
|
251
|
+
0
|
|
252
|
+
|
|
253
|
+
TESTS:
|
|
254
|
+
|
|
255
|
+
Check that :issue:`23403` is fixed::
|
|
256
|
+
|
|
257
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
258
|
+
sage: a = X([3,2,4,1])
|
|
259
|
+
sage: a.divided_difference(2)
|
|
260
|
+
0
|
|
261
|
+
sage: a.divided_difference([3,2,1])
|
|
262
|
+
0
|
|
263
|
+
sage: a.divided_difference(0)
|
|
264
|
+
Traceback (most recent call last):
|
|
265
|
+
...
|
|
266
|
+
ValueError: cannot apply \delta_{0} to a (= X[3, 2, 4, 1])
|
|
267
|
+
"""
|
|
268
|
+
if not self: # if self is 0
|
|
269
|
+
return self
|
|
270
|
+
Perms = Permutations()
|
|
271
|
+
if i in ZZ:
|
|
272
|
+
if algorithm == "sage":
|
|
273
|
+
if i <= 0:
|
|
274
|
+
raise ValueError(r"cannot apply \delta_{%s} to a (= %s)" % (i, self))
|
|
275
|
+
# The operator `\delta_i` sends the Schubert
|
|
276
|
+
# polynomial `X_\pi` (where `\pi` is a finitely supported
|
|
277
|
+
# permutation of `\{1, 2, 3, \ldots\}`) to:
|
|
278
|
+
# - the Schubert polynomial X_\sigma`, where `\sigma` is
|
|
279
|
+
# obtained from `\pi` by switching the values at `i` and `i+1`,
|
|
280
|
+
# if `i` is a descent of `\pi` (that is, `\pi(i) > \pi(i+1)`);
|
|
281
|
+
# - `0` otherwise.
|
|
282
|
+
# Notice that distinct `\pi`s lead to distinct `\sigma`s,
|
|
283
|
+
# so we can use `_from_dict` here.
|
|
284
|
+
res_dict = {}
|
|
285
|
+
for pi, coeff in self:
|
|
286
|
+
pi = pi[:]
|
|
287
|
+
n = len(pi)
|
|
288
|
+
if n <= i:
|
|
289
|
+
continue
|
|
290
|
+
if pi[i - 1] < pi[i]:
|
|
291
|
+
continue
|
|
292
|
+
pi[i - 1], pi[i] = pi[i], pi[i - 1]
|
|
293
|
+
pi = Perms(pi).remove_extra_fixed_points()
|
|
294
|
+
res_dict[pi] = coeff
|
|
295
|
+
return self.parent()._from_dict(res_dict)
|
|
296
|
+
else: # if algorithm == "symmetrica":
|
|
297
|
+
return symmetrica.divdiff_schubert(i, self)
|
|
298
|
+
elif i in Perms:
|
|
299
|
+
if algorithm == "sage":
|
|
300
|
+
i = Permutation(i)
|
|
301
|
+
redw = i.reduced_word()
|
|
302
|
+
res_dict = {}
|
|
303
|
+
for pi, coeff in self:
|
|
304
|
+
next_pi = False
|
|
305
|
+
pi = pi[:]
|
|
306
|
+
n = len(pi)
|
|
307
|
+
for j in redw:
|
|
308
|
+
if n <= j:
|
|
309
|
+
next_pi = True
|
|
310
|
+
break
|
|
311
|
+
if pi[j - 1] < pi[j]:
|
|
312
|
+
next_pi = True
|
|
313
|
+
break
|
|
314
|
+
pi[j - 1], pi[j] = pi[j], pi[j - 1]
|
|
315
|
+
if next_pi:
|
|
316
|
+
continue
|
|
317
|
+
pi = Perms(pi).remove_extra_fixed_points()
|
|
318
|
+
res_dict[pi] = coeff
|
|
319
|
+
return self.parent()._from_dict(res_dict)
|
|
320
|
+
else: # if algorithm == "symmetrica":
|
|
321
|
+
return symmetrica.divdiff_perm_schubert(i, self)
|
|
322
|
+
else:
|
|
323
|
+
raise TypeError("i must either be an integer or permutation")
|
|
324
|
+
|
|
325
|
+
def scalar_product(self, x):
|
|
326
|
+
"""
|
|
327
|
+
Return the standard scalar product of ``self`` and ``x``.
|
|
328
|
+
|
|
329
|
+
EXAMPLES::
|
|
330
|
+
|
|
331
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
332
|
+
sage: a = X([3,2,4,1])
|
|
333
|
+
sage: a.scalar_product(a)
|
|
334
|
+
0
|
|
335
|
+
sage: b = X([4,3,2,1])
|
|
336
|
+
sage: b.scalar_product(a)
|
|
337
|
+
X[1, 3, 4, 6, 2, 5]
|
|
338
|
+
sage: Permutation([1, 3, 4, 6, 2, 5, 7]).to_lehmer_code()
|
|
339
|
+
[0, 1, 1, 2, 0, 0, 0]
|
|
340
|
+
sage: s = SymmetricFunctions(ZZ).schur()
|
|
341
|
+
sage: c = s([2,1,1])
|
|
342
|
+
sage: b.scalar_product(a).expand()
|
|
343
|
+
x0^2*x1*x2 + x0*x1^2*x2 + x0*x1*x2^2 + x0^2*x1*x3 + x0*x1^2*x3
|
|
344
|
+
+ x0^2*x2*x3 + 3*x0*x1*x2*x3 + x1^2*x2*x3 + x0*x2^2*x3 + x1*x2^2*x3
|
|
345
|
+
+ x0*x1*x3^2 + x0*x2*x3^2 + x1*x2*x3^2
|
|
346
|
+
sage: c.expand(4)
|
|
347
|
+
x0^2*x1*x2 + x0*x1^2*x2 + x0*x1*x2^2 + x0^2*x1*x3 + x0*x1^2*x3
|
|
348
|
+
+ x0^2*x2*x3 + 3*x0*x1*x2*x3 + x1^2*x2*x3 + x0*x2^2*x3 + x1*x2^2*x3
|
|
349
|
+
+ x0*x1*x3^2 + x0*x2*x3^2 + x1*x2*x3^2
|
|
350
|
+
"""
|
|
351
|
+
if isinstance(x, SchubertPolynomial_class):
|
|
352
|
+
return symmetrica.scalarproduct_schubert(self, x)
|
|
353
|
+
else:
|
|
354
|
+
raise TypeError("x must be a Schubert polynomial")
|
|
355
|
+
|
|
356
|
+
def multiply_variable(self, i):
|
|
357
|
+
"""
|
|
358
|
+
Return the Schubert polynomial obtained by multiplying ``self``
|
|
359
|
+
by the variable `x_i`.
|
|
360
|
+
|
|
361
|
+
EXAMPLES::
|
|
362
|
+
|
|
363
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
364
|
+
sage: a = X([3,2,4,1])
|
|
365
|
+
sage: a.multiply_variable(0)
|
|
366
|
+
X[4, 2, 3, 1]
|
|
367
|
+
sage: a.multiply_variable(1)
|
|
368
|
+
X[3, 4, 2, 1]
|
|
369
|
+
sage: a.multiply_variable(2)
|
|
370
|
+
X[3, 2, 5, 1, 4] - X[3, 4, 2, 1] - X[4, 2, 3, 1]
|
|
371
|
+
sage: a.multiply_variable(3)
|
|
372
|
+
X[3, 2, 4, 5, 1]
|
|
373
|
+
"""
|
|
374
|
+
if isinstance(i, Integer):
|
|
375
|
+
return symmetrica.mult_schubert_variable(self, i)
|
|
376
|
+
else:
|
|
377
|
+
raise TypeError("i must be an integer")
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
class SchubertPolynomialRing_xbasis(CombinatorialFreeModule):
|
|
381
|
+
|
|
382
|
+
Element = SchubertPolynomial_class
|
|
383
|
+
|
|
384
|
+
def __init__(self, R):
|
|
385
|
+
"""
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
389
|
+
sage: X == loads(dumps(X))
|
|
390
|
+
True
|
|
391
|
+
"""
|
|
392
|
+
self._name = "Schubert polynomial ring with X basis"
|
|
393
|
+
self._repr_option_bracket = False
|
|
394
|
+
CombinatorialFreeModule.__init__(self, R, Permutations(),
|
|
395
|
+
category=GradedAlgebrasWithBasis(R),
|
|
396
|
+
prefix='X')
|
|
397
|
+
|
|
398
|
+
@cached_method
|
|
399
|
+
def one_basis(self):
|
|
400
|
+
"""
|
|
401
|
+
Return the index of the unit of this algebra.
|
|
402
|
+
|
|
403
|
+
EXAMPLES::
|
|
404
|
+
|
|
405
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
406
|
+
sage: X.one() # indirect doctest
|
|
407
|
+
X[1]
|
|
408
|
+
"""
|
|
409
|
+
return self._indices([1])
|
|
410
|
+
|
|
411
|
+
def _element_constructor_(self, x):
|
|
412
|
+
"""
|
|
413
|
+
Coerce x into ``self``.
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
418
|
+
sage: X._element_constructor_([2,1,3])
|
|
419
|
+
X[2, 1]
|
|
420
|
+
sage: X._element_constructor_(Permutation([2,1,3]))
|
|
421
|
+
X[2, 1]
|
|
422
|
+
|
|
423
|
+
sage: R.<x1, x2, x3> = QQ[]
|
|
424
|
+
sage: X(x1^2*x2)
|
|
425
|
+
X[3, 2, 1]
|
|
426
|
+
|
|
427
|
+
sage: S.<x> = InfinitePolynomialRing(QQ)
|
|
428
|
+
sage: X(x[0]^2*x[1])
|
|
429
|
+
X[3, 2, 1]
|
|
430
|
+
sage: X(x[0]*x[1]^2*x[2]^2*x[3] + x[0]^2*x[1]^2*x[2]*x[3] + x[0]^2*x[1]*x[2]^2*x[3])
|
|
431
|
+
X[2, 4, 5, 3, 1]
|
|
432
|
+
|
|
433
|
+
sage: from sage.combinat.key_polynomial import KeyPolynomialBasis
|
|
434
|
+
sage: k = KeyPolynomialBasis(QQ)
|
|
435
|
+
sage: X(k([3,2,1]))
|
|
436
|
+
X[4, 3, 2, 1]
|
|
437
|
+
|
|
438
|
+
TESTS:
|
|
439
|
+
|
|
440
|
+
We check that :issue:`12924` is fixed::
|
|
441
|
+
|
|
442
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
443
|
+
sage: X._element_constructor_([1,2,1])
|
|
444
|
+
Traceback (most recent call last):
|
|
445
|
+
...
|
|
446
|
+
ValueError: the input [1, 2, 1] is not a valid permutation
|
|
447
|
+
|
|
448
|
+
Now we check for correct handling of the empty
|
|
449
|
+
permutation (:issue:`23443`)::
|
|
450
|
+
|
|
451
|
+
sage: X([])
|
|
452
|
+
X[1]
|
|
453
|
+
|
|
454
|
+
Check the round trip from key polynomials::
|
|
455
|
+
|
|
456
|
+
sage: k = KeyPolynomials(ZZ)
|
|
457
|
+
sage: X = SchubertPolynomialRing(ZZ)
|
|
458
|
+
sage: it = iter(Permutations())
|
|
459
|
+
sage: for _ in range(50):
|
|
460
|
+
....: P = next(it)
|
|
461
|
+
....: assert X(k(X(P))) == X(P), P
|
|
462
|
+
"""
|
|
463
|
+
if isinstance(x, list):
|
|
464
|
+
# checking the input to avoid symmetrica crashing Sage, see trac 12924
|
|
465
|
+
if x not in Permutations():
|
|
466
|
+
raise ValueError(f"the input {x} is not a valid permutation")
|
|
467
|
+
perm = Permutation(x).remove_extra_fixed_points()
|
|
468
|
+
return self._from_dict({perm: self.base_ring().one()})
|
|
469
|
+
elif isinstance(x, Permutation):
|
|
470
|
+
perm = x.remove_extra_fixed_points()
|
|
471
|
+
return self._from_dict({perm: self.base_ring().one()})
|
|
472
|
+
elif isinstance(x, MPolynomial):
|
|
473
|
+
return symmetrica.t_POLYNOM_SCHUBERT(x)
|
|
474
|
+
elif isinstance(x, InfinitePolynomial):
|
|
475
|
+
R = x.polynomial().parent()
|
|
476
|
+
# massage the term order to be what symmetrica expects
|
|
477
|
+
S = PolynomialRing(R.base_ring(),
|
|
478
|
+
names=list(map(repr, reversed(R.gens()))))
|
|
479
|
+
return symmetrica.t_POLYNOM_SCHUBERT(S(x.polynomial()))
|
|
480
|
+
elif isinstance(x, KeyPolynomial):
|
|
481
|
+
return self(x.expand())
|
|
482
|
+
else:
|
|
483
|
+
raise TypeError
|
|
484
|
+
|
|
485
|
+
def some_elements(self):
|
|
486
|
+
"""
|
|
487
|
+
Return some elements.
|
|
488
|
+
|
|
489
|
+
EXAMPLES::
|
|
490
|
+
|
|
491
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
492
|
+
sage: X.some_elements()
|
|
493
|
+
[X[1], X[1] + 2*X[2, 1], -X[3, 2, 1] + X[4, 2, 1, 3]]
|
|
494
|
+
"""
|
|
495
|
+
return [self.one(), self([1]) + 2 * self([2, 1]),
|
|
496
|
+
self([4, 2, 1, 3]) - self([3, 2, 1])]
|
|
497
|
+
|
|
498
|
+
def product_on_basis(self, left, right):
|
|
499
|
+
"""
|
|
500
|
+
EXAMPLES::
|
|
501
|
+
|
|
502
|
+
sage: p1 = Permutation([3,2,1])
|
|
503
|
+
sage: p2 = Permutation([2,1,3])
|
|
504
|
+
sage: X = SchubertPolynomialRing(QQ)
|
|
505
|
+
sage: X.product_on_basis(p1,p2)
|
|
506
|
+
X[4, 2, 1, 3]
|
|
507
|
+
"""
|
|
508
|
+
return symmetrica.mult_schubert_schubert(left, right)
|