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,777 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
"""
|
|
3
|
+
Combinatorial triangles for posets and fans
|
|
4
|
+
|
|
5
|
+
This provides several classes and methods to convert between them.
|
|
6
|
+
Elements of the classes are polynomials in two variables `x` and `y`,
|
|
7
|
+
possibly with other parameters. The conversion methods amount to specific
|
|
8
|
+
invertible rational change-of-variables involving `x` and `y`.
|
|
9
|
+
|
|
10
|
+
These polynomial are called triangles because their supports, the sets
|
|
11
|
+
of exponents where their coefficients can be nonzero, have a triangular shape.
|
|
12
|
+
|
|
13
|
+
The M-triangle class is motivated by the generating series of Möbius numbers
|
|
14
|
+
for graded posets. A typical example is::
|
|
15
|
+
|
|
16
|
+
sage: W = SymmetricGroup(4) # needs sage.groups
|
|
17
|
+
sage: posets.NoncrossingPartitions(W).M_triangle() # needs sage.graphs sage.groups
|
|
18
|
+
M: x^3*y^3 - 6*x^2*y^3 + 6*x^2*y^2 + 10*x*y^3 - 16*x*y^2
|
|
19
|
+
- 5*y^3 + 6*x*y + 10*y^2 - 6*y + 1
|
|
20
|
+
sage: unicode_art(_) # needs sage.graphs sage.groups sage.modules
|
|
21
|
+
⎛ -5 10 -6 1⎞
|
|
22
|
+
⎜ 10 -16 6 0⎟
|
|
23
|
+
⎜ -6 6 0 0⎟
|
|
24
|
+
⎝ 1 0 0 0⎠
|
|
25
|
+
|
|
26
|
+
The F-triangle class is motivated by the generating series of pure
|
|
27
|
+
simplicial complexes endowed with a distinguished facet. One can also
|
|
28
|
+
think about complete fans endowed with a distinguished maximal
|
|
29
|
+
cone. A typical example is::
|
|
30
|
+
|
|
31
|
+
sage: # needs sage.graphs sage.modules
|
|
32
|
+
sage: C = ClusterComplex(['A',3])
|
|
33
|
+
sage: f = C.greedy_facet()
|
|
34
|
+
sage: C.F_triangle(f)
|
|
35
|
+
F: 5*x^3 + 5*x^2*y + 3*x*y^2 + y^3 + 10*x^2 + 8*x*y + 3*y^2 + 6*x + 3*y + 1
|
|
36
|
+
sage: unicode_art(_)
|
|
37
|
+
⎛ 1 0 0 0⎞
|
|
38
|
+
⎜ 3 3 0 0⎟
|
|
39
|
+
⎜ 3 8 5 0⎟
|
|
40
|
+
⎝ 1 6 10 5⎠
|
|
41
|
+
|
|
42
|
+
The H-triangles are related to the F-triangles by a relationship
|
|
43
|
+
similar to the classical link between the f-vector and the h-vector of a
|
|
44
|
+
simplicial complex.
|
|
45
|
+
|
|
46
|
+
The Gamma-triangles are related to the H-triangles by an
|
|
47
|
+
analog of the relationship between gamma-vectors and h-vectors of flag
|
|
48
|
+
simplicial complexes.
|
|
49
|
+
"""
|
|
50
|
+
from sage.misc.lazy_import import lazy_import
|
|
51
|
+
from sage.rings.integer_ring import ZZ
|
|
52
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
53
|
+
from sage.structure.sage_object import SageObject
|
|
54
|
+
|
|
55
|
+
lazy_import('sage.matrix.constructor', 'matrix')
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _matrix_display(self, variables=None):
|
|
59
|
+
"""
|
|
60
|
+
Return the 2-variable polynomial ``self`` as a matrix for display.
|
|
61
|
+
|
|
62
|
+
INPUT:
|
|
63
|
+
|
|
64
|
+
- ``variables`` -- (optional) choice of 2 variables
|
|
65
|
+
|
|
66
|
+
OUTPUT:
|
|
67
|
+
|
|
68
|
+
matrix
|
|
69
|
+
|
|
70
|
+
EXAMPLES::
|
|
71
|
+
|
|
72
|
+
sage: from sage.combinat.triangles_FHM import _matrix_display
|
|
73
|
+
sage: x, y = PolynomialRing(QQ,['x', 'y']).gens()
|
|
74
|
+
sage: _matrix_display(x**2+x*y+y**3) # needs sage.modules
|
|
75
|
+
[1 0 0]
|
|
76
|
+
[0 0 0]
|
|
77
|
+
[0 1 0]
|
|
78
|
+
[0 0 1]
|
|
79
|
+
|
|
80
|
+
With a specific choice of variables::
|
|
81
|
+
|
|
82
|
+
sage: x, y, z = PolynomialRing(QQ,['x','y','z']).gens()
|
|
83
|
+
sage: _matrix_display(x**2+z*x*y+z*y**3+z*x,[y,z]) # needs sage.modules
|
|
84
|
+
[ x x 0 1]
|
|
85
|
+
[x^2 0 0 0]
|
|
86
|
+
sage: _matrix_display(x**2+z*x*y+z*y**3+z*x,[x,z]) # needs sage.modules
|
|
87
|
+
[ y^3 y + 1 0]
|
|
88
|
+
[ 0 0 1]
|
|
89
|
+
"""
|
|
90
|
+
support = self.exponents()
|
|
91
|
+
if variables is None:
|
|
92
|
+
ring = self.parent().base_ring()
|
|
93
|
+
x, y = self.parent().gens()
|
|
94
|
+
ix = 0
|
|
95
|
+
iy = 1
|
|
96
|
+
else:
|
|
97
|
+
x, y = variables
|
|
98
|
+
ring = self.parent()
|
|
99
|
+
all_vars = x.parent().gens()
|
|
100
|
+
ix = all_vars.index(x)
|
|
101
|
+
iy = all_vars.index(y)
|
|
102
|
+
minx = min(u[ix] for u in support)
|
|
103
|
+
maxy = max(u[iy] for u in support)
|
|
104
|
+
deltax = max(u[ix] for u in support) - minx + 1
|
|
105
|
+
deltay = maxy - min(u[iy] for u in support) + 1
|
|
106
|
+
mat = matrix(ring, deltay, deltax)
|
|
107
|
+
for u in support:
|
|
108
|
+
ex = u[ix]
|
|
109
|
+
ey = u[iy]
|
|
110
|
+
mat[maxy - ey, ex - minx] = self.coefficient({x: ex, y: ey})
|
|
111
|
+
return mat
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class Triangle(SageObject):
|
|
115
|
+
"""
|
|
116
|
+
Common class for different kinds of triangles.
|
|
117
|
+
|
|
118
|
+
This serves as a base class for F-triangles, H-triangles, M-triangles
|
|
119
|
+
and Gamma-triangles.
|
|
120
|
+
|
|
121
|
+
The user should use these subclasses directly.
|
|
122
|
+
|
|
123
|
+
The input is a polynomial in two variables. One can also give a
|
|
124
|
+
polynomial with more variables and specify two chosen variables.
|
|
125
|
+
|
|
126
|
+
EXAMPLES::
|
|
127
|
+
|
|
128
|
+
sage: from sage.combinat.triangles_FHM import Triangle
|
|
129
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
130
|
+
sage: ht = Triangle(1+4*x+2*x*y)
|
|
131
|
+
sage: unicode_art(ht) # needs sage.modules
|
|
132
|
+
⎛0 2⎞
|
|
133
|
+
⎝1 4⎠
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
def __init__(self, poly, variables=None):
|
|
137
|
+
"""
|
|
138
|
+
EXAMPLES::
|
|
139
|
+
|
|
140
|
+
sage: from sage.combinat.triangles_FHM import Triangle
|
|
141
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
142
|
+
sage: ht = Triangle(1+2*x*y)
|
|
143
|
+
sage: unicode_art(ht) # needs sage.modules
|
|
144
|
+
⎛0 2⎞
|
|
145
|
+
⎝1 0⎠
|
|
146
|
+
"""
|
|
147
|
+
if variables is None:
|
|
148
|
+
self._vars = poly.parent().gens()
|
|
149
|
+
else:
|
|
150
|
+
self._vars = variables
|
|
151
|
+
self._poly = poly
|
|
152
|
+
self._n = max(self._poly.degree(v) for v in self._vars)
|
|
153
|
+
|
|
154
|
+
def _ascii_art_(self):
|
|
155
|
+
"""
|
|
156
|
+
Return the ascii-art representation (as a matrix).
|
|
157
|
+
|
|
158
|
+
EXAMPLES::
|
|
159
|
+
|
|
160
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
161
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
162
|
+
sage: ht = H_triangle(1+2*x*y)
|
|
163
|
+
sage: ascii_art(ht) # needs sage.modules
|
|
164
|
+
[0 2]
|
|
165
|
+
[1 0]
|
|
166
|
+
"""
|
|
167
|
+
return self.matrix()._ascii_art_()
|
|
168
|
+
|
|
169
|
+
def _unicode_art_(self):
|
|
170
|
+
"""
|
|
171
|
+
Return the unicode representation (as a matrix).
|
|
172
|
+
|
|
173
|
+
EXAMPLES::
|
|
174
|
+
|
|
175
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
176
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
177
|
+
sage: ht = H_triangle(1+2*x*y)
|
|
178
|
+
sage: unicode_art(ht) # needs sage.modules
|
|
179
|
+
⎛0 2⎞
|
|
180
|
+
⎝1 0⎠
|
|
181
|
+
"""
|
|
182
|
+
return self.matrix()._unicode_art_()
|
|
183
|
+
|
|
184
|
+
def _repr_(self) -> str:
|
|
185
|
+
"""
|
|
186
|
+
Return the string representation (as a polynomial).
|
|
187
|
+
|
|
188
|
+
EXAMPLES::
|
|
189
|
+
|
|
190
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
191
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
192
|
+
sage: ht = H_triangle(1+2*x*y)
|
|
193
|
+
sage: ht
|
|
194
|
+
H: 2*x*y + 1
|
|
195
|
+
"""
|
|
196
|
+
return self._prefix + ": " + repr(self._poly)
|
|
197
|
+
|
|
198
|
+
def _latex_(self):
|
|
199
|
+
r"""
|
|
200
|
+
Return the LaTeX representation (as a matrix).
|
|
201
|
+
|
|
202
|
+
EXAMPLES::
|
|
203
|
+
|
|
204
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
205
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
206
|
+
sage: ht = H_triangle(1+2*x*y)
|
|
207
|
+
sage: latex(ht) # needs sage.modules
|
|
208
|
+
\left(\begin{array}{rr}
|
|
209
|
+
0 & 2 \\
|
|
210
|
+
1 & 0
|
|
211
|
+
\end{array}\right)
|
|
212
|
+
"""
|
|
213
|
+
return self.matrix()._latex_()
|
|
214
|
+
|
|
215
|
+
def __eq__(self, other) -> bool:
|
|
216
|
+
"""
|
|
217
|
+
Test for equality.
|
|
218
|
+
|
|
219
|
+
EXAMPLES::
|
|
220
|
+
|
|
221
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
222
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
223
|
+
sage: h1 = H_triangle(1+2*x*y)
|
|
224
|
+
sage: h2 = H_triangle(1+3*x*y)
|
|
225
|
+
sage: h1 == h1
|
|
226
|
+
True
|
|
227
|
+
sage: h1 == h2
|
|
228
|
+
False
|
|
229
|
+
"""
|
|
230
|
+
if isinstance(other, Triangle):
|
|
231
|
+
return self._poly == other._poly
|
|
232
|
+
return self._poly == other
|
|
233
|
+
|
|
234
|
+
def __ne__(self, other) -> bool:
|
|
235
|
+
"""
|
|
236
|
+
Test for unequality.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
241
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
242
|
+
sage: h1 = H_triangle(1+2*x*y)
|
|
243
|
+
sage: h2 = H_triangle(1+3*x*y)
|
|
244
|
+
sage: h1 != h1
|
|
245
|
+
False
|
|
246
|
+
sage: h1 != h2
|
|
247
|
+
True
|
|
248
|
+
"""
|
|
249
|
+
return not self == other
|
|
250
|
+
|
|
251
|
+
def __call__(self, *args):
|
|
252
|
+
"""
|
|
253
|
+
Return the evaluation (as a polynomial).
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
258
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
259
|
+
sage: h = H_triangle(1+3*x*y)
|
|
260
|
+
sage: h(4,5)
|
|
261
|
+
61
|
|
262
|
+
"""
|
|
263
|
+
return self._poly(*args)
|
|
264
|
+
|
|
265
|
+
def __getitem__(self, *args):
|
|
266
|
+
"""
|
|
267
|
+
Return some coefficient.
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
272
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
273
|
+
sage: h = H_triangle(1+2*x+3*x*y)
|
|
274
|
+
sage: h[1,1]
|
|
275
|
+
3
|
|
276
|
+
"""
|
|
277
|
+
return self._poly.__getitem__(*args)
|
|
278
|
+
|
|
279
|
+
def __hash__(self):
|
|
280
|
+
"""
|
|
281
|
+
Return the hash value.
|
|
282
|
+
|
|
283
|
+
EXAMPLES::
|
|
284
|
+
|
|
285
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
286
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
287
|
+
sage: h = H_triangle(1+2*x*y)
|
|
288
|
+
sage: g = H_triangle(1+2*x*y)
|
|
289
|
+
sage: hash(h) == hash(g)
|
|
290
|
+
True
|
|
291
|
+
"""
|
|
292
|
+
return hash(self._poly)
|
|
293
|
+
|
|
294
|
+
def matrix(self):
|
|
295
|
+
"""
|
|
296
|
+
Return the associated matrix for display.
|
|
297
|
+
|
|
298
|
+
EXAMPLES::
|
|
299
|
+
|
|
300
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
301
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
302
|
+
sage: h = H_triangle(1+2*x*y)
|
|
303
|
+
sage: h.matrix() # needs sage.modules
|
|
304
|
+
[0 2]
|
|
305
|
+
[1 0]
|
|
306
|
+
"""
|
|
307
|
+
return _matrix_display(self._poly, variables=self._vars)
|
|
308
|
+
|
|
309
|
+
def polynomial(self):
|
|
310
|
+
"""
|
|
311
|
+
Return the triangle as a bare polynomial.
|
|
312
|
+
|
|
313
|
+
EXAMPLES::
|
|
314
|
+
|
|
315
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
316
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
317
|
+
sage: h = H_triangle(1+2*x*y)
|
|
318
|
+
sage: h.polynomial()
|
|
319
|
+
2*x*y + 1
|
|
320
|
+
"""
|
|
321
|
+
return self._poly
|
|
322
|
+
|
|
323
|
+
def truncate(self, d):
|
|
324
|
+
"""
|
|
325
|
+
Return the truncated triangle.
|
|
326
|
+
|
|
327
|
+
INPUT:
|
|
328
|
+
|
|
329
|
+
- ``d`` -- integer
|
|
330
|
+
|
|
331
|
+
As a polynomial, this means that all monomials with a power
|
|
332
|
+
of either `x` or `y` greater than or equal to ``d`` are dismissed.
|
|
333
|
+
|
|
334
|
+
EXAMPLES::
|
|
335
|
+
|
|
336
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
337
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
338
|
+
sage: h = H_triangle(1+2*x*y)
|
|
339
|
+
sage: h.truncate(2)
|
|
340
|
+
H: 2*x*y + 1
|
|
341
|
+
"""
|
|
342
|
+
p = self._poly
|
|
343
|
+
for v in self._vars:
|
|
344
|
+
p = p.truncate(v, d)
|
|
345
|
+
return self.__class__(p, self._vars)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class M_triangle(Triangle):
|
|
349
|
+
"""
|
|
350
|
+
Class for the M-triangles.
|
|
351
|
+
|
|
352
|
+
This is motivated by generating series of Möbius numbers of graded posets.
|
|
353
|
+
|
|
354
|
+
EXAMPLES::
|
|
355
|
+
|
|
356
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
357
|
+
sage: P = Poset({2: [1]}) # needs sage.graphs
|
|
358
|
+
sage: P.M_triangle() # needs sage.graphs
|
|
359
|
+
M: x*y - y + 1
|
|
360
|
+
"""
|
|
361
|
+
_prefix = 'M'
|
|
362
|
+
|
|
363
|
+
def dual(self):
|
|
364
|
+
"""
|
|
365
|
+
Return the dual M-triangle.
|
|
366
|
+
|
|
367
|
+
This is the M-triangle of the dual poset, hence an involution.
|
|
368
|
+
|
|
369
|
+
When seen as a matrix, this performs a symmetry with respect to the
|
|
370
|
+
northwest-southeast diagonal.
|
|
371
|
+
|
|
372
|
+
EXAMPLES::
|
|
373
|
+
|
|
374
|
+
sage: from sage.combinat.triangles_FHM import M_triangle
|
|
375
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
376
|
+
sage: mt = M_triangle(x*y - y + 1)
|
|
377
|
+
sage: mt.dual() == mt
|
|
378
|
+
True
|
|
379
|
+
"""
|
|
380
|
+
x, y = self._vars
|
|
381
|
+
n = self._n
|
|
382
|
+
A = self._poly.parent()
|
|
383
|
+
|
|
384
|
+
dict_dual = {(n - dy, n - dx): coeff
|
|
385
|
+
for (dx, dy), coeff in self._poly.monomial_coefficients().items()}
|
|
386
|
+
return M_triangle(A(dict_dual), variables=(x, y))
|
|
387
|
+
|
|
388
|
+
def transmute(self):
|
|
389
|
+
"""
|
|
390
|
+
Return the image of ``self`` by an involution.
|
|
391
|
+
|
|
392
|
+
OUTPUT: another M-triangle
|
|
393
|
+
|
|
394
|
+
The involution is defined by converting to an H-triangle,
|
|
395
|
+
transposing the matrix, and then converting back to an M-triangle.
|
|
396
|
+
|
|
397
|
+
EXAMPLES::
|
|
398
|
+
|
|
399
|
+
sage: from sage.combinat.triangles_FHM import M_triangle
|
|
400
|
+
sage: x, y = polygens(ZZ, 'x,y')
|
|
401
|
+
sage: nc3 = x^2*y^2 - 3*x*y^2 + 3*x*y + 2*y^2 - 3*y + 1
|
|
402
|
+
sage: m = M_triangle(nc3)
|
|
403
|
+
sage: m2 = m.transmute(); m2 # needs sage.libs.flint
|
|
404
|
+
M: 2*x^2*y^2 - 3*x*y^2 + 2*x*y + y^2 - 2*y + 1
|
|
405
|
+
sage: m2.transmute() == m # needs sage.libs.flint
|
|
406
|
+
True
|
|
407
|
+
"""
|
|
408
|
+
return self.h().transpose().m()
|
|
409
|
+
|
|
410
|
+
def h(self):
|
|
411
|
+
"""
|
|
412
|
+
Return the associated H-triangle.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: from sage.combinat.triangles_FHM import M_triangle
|
|
417
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
418
|
+
sage: M_triangle(1-y+x*y).h()
|
|
419
|
+
H: x*y + 1
|
|
420
|
+
|
|
421
|
+
TESTS::
|
|
422
|
+
|
|
423
|
+
sage: h = polygen(ZZ, 'h')
|
|
424
|
+
sage: x, y = polygens(h.parent(),'x,y')
|
|
425
|
+
sage: mt = x**2*y**2+(-2*h+2)*x*y**2+(2*h-2)*x*y+(2*h-3)*y**2+(-2*h+2)*y+1
|
|
426
|
+
sage: M_triangle(mt, [x,y]).h()
|
|
427
|
+
H: x^2*y^2 + 2*x*y + (2*h - 4)*x + 1
|
|
428
|
+
"""
|
|
429
|
+
x, y = self._vars
|
|
430
|
+
n = self._n
|
|
431
|
+
step = self._poly.subs({x: y / (y - 1),
|
|
432
|
+
y: (y - 1) * x / (1 + (y - 1) * x)})
|
|
433
|
+
step *= (1 + (y - 1) * x)**n
|
|
434
|
+
polyh = step.numerator()
|
|
435
|
+
return H_triangle(polyh, variables=(x, y))
|
|
436
|
+
|
|
437
|
+
def f(self):
|
|
438
|
+
"""
|
|
439
|
+
Return the associated F-triangle.
|
|
440
|
+
|
|
441
|
+
EXAMPLES::
|
|
442
|
+
|
|
443
|
+
sage: from sage.combinat.triangles_FHM import M_triangle
|
|
444
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
445
|
+
sage: M_triangle(1-y+x*y).f()
|
|
446
|
+
F: x + y + 1
|
|
447
|
+
|
|
448
|
+
TESTS::
|
|
449
|
+
|
|
450
|
+
sage: h = polygen(ZZ, 'h')
|
|
451
|
+
sage: x, y = polygens(h.parent(),'x,y')
|
|
452
|
+
sage: mt = x**2*y**2+(-2*h+2)*x*y**2+(2*h-2)*x*y+(2*h-3)*y**2+(-2*h+2)*y+1
|
|
453
|
+
sage: M_triangle(mt, [x,y]).f()
|
|
454
|
+
F: (2*h - 3)*x^2 + 2*x*y + y^2 + (2*h - 2)*x + 2*y + 1
|
|
455
|
+
"""
|
|
456
|
+
return self.h().f()
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class H_triangle(Triangle):
|
|
460
|
+
"""
|
|
461
|
+
Class for the H-triangles.
|
|
462
|
+
"""
|
|
463
|
+
_prefix = 'H'
|
|
464
|
+
|
|
465
|
+
def transpose(self):
|
|
466
|
+
"""
|
|
467
|
+
Return the transposed H-triangle.
|
|
468
|
+
|
|
469
|
+
OUTPUT: another H-triangle
|
|
470
|
+
|
|
471
|
+
This operation is an involution. When seen as a matrix, it
|
|
472
|
+
performs a symmetry with respect to the northwest-southeast
|
|
473
|
+
diagonal.
|
|
474
|
+
|
|
475
|
+
EXAMPLES::
|
|
476
|
+
|
|
477
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
478
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
479
|
+
sage: H_triangle(1+x*y).transpose()
|
|
480
|
+
H: x*y + 1
|
|
481
|
+
sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).transpose()
|
|
482
|
+
H: x^2*y^2 + x^2*y + 2*x*y + 1
|
|
483
|
+
"""
|
|
484
|
+
x, y = self._vars
|
|
485
|
+
n = self._n
|
|
486
|
+
A = self._poly.parent()
|
|
487
|
+
|
|
488
|
+
dict_dual = {(n - dy, n - dx): coeff
|
|
489
|
+
for (dx, dy), coeff in self._poly.monomial_coefficients().items()}
|
|
490
|
+
return H_triangle(A(dict_dual), variables=(x, y))
|
|
491
|
+
|
|
492
|
+
def m(self):
|
|
493
|
+
"""
|
|
494
|
+
Return the associated M-triangle.
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
499
|
+
sage: h = polygen(ZZ, 'h')
|
|
500
|
+
sage: x, y = polygens(h.parent(),'x,y')
|
|
501
|
+
sage: ht = H_triangle(x^2*y^2 + 2*x*y + 2*x*h - 4*x + 1, variables=[x,y])
|
|
502
|
+
sage: ht.m()
|
|
503
|
+
M: x^2*y^2 + (-2*h + 2)*x*y^2 + (2*h - 2)*x*y
|
|
504
|
+
+ (2*h - 3)*y^2 + (-2*h + 2)*y + 1
|
|
505
|
+
"""
|
|
506
|
+
x, y = self._vars
|
|
507
|
+
n = self._n
|
|
508
|
+
step = self._poly.subs({x: (x - 1) * y / (1 - y),
|
|
509
|
+
y: x / (x - 1)}) * (1 - y)**n
|
|
510
|
+
polym = step.numerator()
|
|
511
|
+
return M_triangle(polym, variables=(x, y))
|
|
512
|
+
|
|
513
|
+
def f(self):
|
|
514
|
+
"""
|
|
515
|
+
Return the associated F-triangle.
|
|
516
|
+
|
|
517
|
+
EXAMPLES::
|
|
518
|
+
|
|
519
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
520
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
521
|
+
sage: H_triangle(1+x*y).f()
|
|
522
|
+
F: x + y + 1
|
|
523
|
+
sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).f()
|
|
524
|
+
F: 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
|
|
525
|
+
sage: flo = H_triangle(1+4*x+2*x**2+x*y*(4+8*x)+
|
|
526
|
+
....: x**2*y**2*(6+4*x)+4*(x*y)**3+(x*y)**4).f(); flo
|
|
527
|
+
F: 7*x^4 + 12*x^3*y + 10*x^2*y^2 + 4*x*y^3 + y^4 + 20*x^3
|
|
528
|
+
+ 28*x^2*y + 16*x*y^2 + 4*y^3 + 20*x^2 + 20*x*y
|
|
529
|
+
+ 6*y^2 + 8*x + 4*y + 1
|
|
530
|
+
sage: flo(-1-x,-1-y) == flo
|
|
531
|
+
True
|
|
532
|
+
|
|
533
|
+
TESTS::
|
|
534
|
+
|
|
535
|
+
sage: x,y,h = polygens(ZZ,'x,y,h')
|
|
536
|
+
sage: ht = x^2*y^2 + 2*x*y + 2*x*h - 4*x + 1
|
|
537
|
+
sage: H_triangle(ht,[x,y]).f()
|
|
538
|
+
F: 2*x^2*h - 3*x^2 + 2*x*y + y^2 + 2*x*h - 2*x + 2*y + 1
|
|
539
|
+
"""
|
|
540
|
+
x, y = self._vars
|
|
541
|
+
n = self._n
|
|
542
|
+
step1 = self._poly.subs({x: x / (1 + x), y: y}) * (x + 1)**n
|
|
543
|
+
step2 = step1.subs({x: x, y: y / x})
|
|
544
|
+
polyf = step2.numerator()
|
|
545
|
+
return F_triangle(polyf, variables=(x, y))
|
|
546
|
+
|
|
547
|
+
def gamma(self):
|
|
548
|
+
"""
|
|
549
|
+
Return the associated Gamma-triangle.
|
|
550
|
+
|
|
551
|
+
In some cases, this is a more condensed way to encode
|
|
552
|
+
the same amount of information.
|
|
553
|
+
|
|
554
|
+
EXAMPLES::
|
|
555
|
+
|
|
556
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
557
|
+
sage: x, y = polygen(ZZ,'x,y')
|
|
558
|
+
sage: ht = x**2*y**2 + 2*x*y + x + 1
|
|
559
|
+
sage: H_triangle(ht).gamma()
|
|
560
|
+
Γ: y^2 + x
|
|
561
|
+
|
|
562
|
+
sage: W = SymmetricGroup(5) # needs sage.groups
|
|
563
|
+
sage: P = posets.NoncrossingPartitions(W) # needs sage.graphs sage.groups
|
|
564
|
+
sage: P.M_triangle().h().gamma() # needs sage.graphs sage.groups
|
|
565
|
+
Γ: y^4 + 3*x*y^2 + 2*x^2 + 2*x*y + x
|
|
566
|
+
"""
|
|
567
|
+
x, y = self._vars
|
|
568
|
+
n = self._n
|
|
569
|
+
remain = self._poly
|
|
570
|
+
gamma = x.parent().zero()
|
|
571
|
+
for k in range(n, -1, -1):
|
|
572
|
+
step = remain.coefficient({x: k})
|
|
573
|
+
gamma += x**(n - k) * step
|
|
574
|
+
remain -= x**(n - k) * step.homogenize(x)(x=1 + x, y=1 + x * y)
|
|
575
|
+
return Gamma_triangle(gamma, variables=(x, y))
|
|
576
|
+
|
|
577
|
+
def vector(self):
|
|
578
|
+
"""
|
|
579
|
+
Return the h-vector as a polynomial in one variable.
|
|
580
|
+
|
|
581
|
+
This is obtained by letting `y=1`.
|
|
582
|
+
|
|
583
|
+
EXAMPLES::
|
|
584
|
+
|
|
585
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
586
|
+
sage: x, y = polygen(ZZ,'x,y')
|
|
587
|
+
sage: ht = x**2*y**2 + 2*x*y + x + 1
|
|
588
|
+
sage: H_triangle(ht).vector()
|
|
589
|
+
x^2 + 3*x + 1
|
|
590
|
+
"""
|
|
591
|
+
x, y = self._vars
|
|
592
|
+
anneau = PolynomialRing(ZZ, "x")
|
|
593
|
+
return anneau(self._poly.subs({y: 1}))
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
class F_triangle(Triangle):
|
|
597
|
+
"""
|
|
598
|
+
Class for the F-triangles.
|
|
599
|
+
"""
|
|
600
|
+
_prefix = 'F'
|
|
601
|
+
|
|
602
|
+
def h(self):
|
|
603
|
+
"""
|
|
604
|
+
Return the associated H-triangle.
|
|
605
|
+
|
|
606
|
+
EXAMPLES::
|
|
607
|
+
|
|
608
|
+
sage: from sage.combinat.triangles_FHM import F_triangle
|
|
609
|
+
sage: x,y = polygens(ZZ,'x,y')
|
|
610
|
+
sage: ft = F_triangle(1+x+y)
|
|
611
|
+
sage: ft.h()
|
|
612
|
+
H: x*y + 1
|
|
613
|
+
|
|
614
|
+
TESTS::
|
|
615
|
+
|
|
616
|
+
sage: h = polygen(ZZ, 'h')
|
|
617
|
+
sage: x, y = polygens(h.parent(),'x,y')
|
|
618
|
+
sage: ft = 1+2*y+(2*h-2)*x+y**2+2*x*y+(2*h-3)*x**2
|
|
619
|
+
sage: F_triangle(ft, [x,y]).h()
|
|
620
|
+
H: x^2*y^2 + 2*x*y + (2*h - 4)*x + 1
|
|
621
|
+
"""
|
|
622
|
+
x, y = self._vars
|
|
623
|
+
n = self._n
|
|
624
|
+
step = (1 - x)**n * self._poly.subs({x: x / (1 - x),
|
|
625
|
+
y: x * y / (1 - x)})
|
|
626
|
+
polyh = step.numerator()
|
|
627
|
+
return H_triangle(polyh, variables=(x, y))
|
|
628
|
+
|
|
629
|
+
def m(self):
|
|
630
|
+
"""
|
|
631
|
+
Return the associated M-triangle.
|
|
632
|
+
|
|
633
|
+
EXAMPLES::
|
|
634
|
+
|
|
635
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
636
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
637
|
+
sage: H_triangle(1+x*y).f()
|
|
638
|
+
F: x + y + 1
|
|
639
|
+
sage: _.m()
|
|
640
|
+
M: x*y - y + 1
|
|
641
|
+
|
|
642
|
+
sage: H_triangle(x^2*y^2 + 2*x*y + x + 1).f()
|
|
643
|
+
F: 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
|
|
644
|
+
sage: _.m()
|
|
645
|
+
M: x^2*y^2 - 3*x*y^2 + 3*x*y + 2*y^2 - 3*y + 1
|
|
646
|
+
|
|
647
|
+
TESTS::
|
|
648
|
+
|
|
649
|
+
sage: p = 1+4*x+2*x**2+x*y*(4+8*x)
|
|
650
|
+
sage: p += x**2*y**2*(6+4*x)+4*(x*y)**3+(x*y)**4
|
|
651
|
+
sage: flo = H_triangle(p).f(); flo
|
|
652
|
+
F: 7*x^4 + 12*x^3*y + 10*x^2*y^2 + 4*x*y^3 + y^4 + 20*x^3
|
|
653
|
+
+ 28*x^2*y + 16*x*y^2 + 4*y^3 + 20*x^2 + 20*x*y
|
|
654
|
+
+ 6*y^2 + 8*x + 4*y + 1
|
|
655
|
+
sage: flo.m()
|
|
656
|
+
M: x^4*y^4 - 8*x^3*y^4 + 8*x^3*y^3 + 20*x^2*y^4 - 36*x^2*y^3
|
|
657
|
+
- 20*x*y^4 + 16*x^2*y^2 + 48*x*y^3 + 7*y^4 - 36*x*y^2 - 20*y^3
|
|
658
|
+
+ 8*x*y + 20*y^2 - 8*y + 1
|
|
659
|
+
|
|
660
|
+
sage: from sage.combinat.triangles_FHM import F_triangle
|
|
661
|
+
sage: h = polygen(ZZ, 'h')
|
|
662
|
+
sage: x, y = polygens(h.parent(),'x,y')
|
|
663
|
+
sage: ft = F_triangle(1+2*y+(2*h-2)*x+y**2+2*x*y+(2*h-3)*x**2,(x,y))
|
|
664
|
+
sage: ft.m()
|
|
665
|
+
M: x^2*y^2 + (-2*h + 2)*x*y^2 + (2*h - 2)*x*y
|
|
666
|
+
+ (2*h - 3)*y^2 + (-2*h + 2)*y + 1
|
|
667
|
+
"""
|
|
668
|
+
x, y = self._vars
|
|
669
|
+
n = self._n
|
|
670
|
+
step = self._poly.subs({x: y * (x - 1) / (1 - x * y),
|
|
671
|
+
y: x * y / (1 - x * y)})
|
|
672
|
+
step *= (1 - x * y)**n
|
|
673
|
+
polym = step.numerator()
|
|
674
|
+
return M_triangle(polym, variables=(x, y))
|
|
675
|
+
|
|
676
|
+
def parabolic(self):
|
|
677
|
+
"""
|
|
678
|
+
Return a parabolic version of the F-triangle.
|
|
679
|
+
|
|
680
|
+
This is obtained by replacing the variable `y` by `y-1`.
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: from sage.combinat.triangles_FHM import H_triangle
|
|
685
|
+
sage: x, y = polygens(ZZ,'x,y')
|
|
686
|
+
sage: H_triangle(1+x*y).f()
|
|
687
|
+
F: x + y + 1
|
|
688
|
+
sage: _.parabolic()
|
|
689
|
+
F: x + y
|
|
690
|
+
|
|
691
|
+
TESTS::
|
|
692
|
+
|
|
693
|
+
sage: a, b = polygens(ZZ,'a,b')
|
|
694
|
+
sage: H_triangle(1+a*b).f()
|
|
695
|
+
F: a + b + 1
|
|
696
|
+
sage: _.parabolic()
|
|
697
|
+
F: a + b
|
|
698
|
+
"""
|
|
699
|
+
x, y = self._vars
|
|
700
|
+
polyf = self._poly.subs({y: y - 1})
|
|
701
|
+
return F_triangle(polyf, variables=(x, y))
|
|
702
|
+
|
|
703
|
+
def vector(self):
|
|
704
|
+
"""
|
|
705
|
+
Return the f-vector as a polynomial in one variable.
|
|
706
|
+
|
|
707
|
+
This is obtained by letting `y=x`.
|
|
708
|
+
|
|
709
|
+
EXAMPLES::
|
|
710
|
+
|
|
711
|
+
sage: from sage.combinat.triangles_FHM import F_triangle
|
|
712
|
+
sage: x, y = polygen(ZZ,'x,y')
|
|
713
|
+
sage: ft = 2*x^2 + 2*x*y + y^2 + 3*x + 2*y + 1
|
|
714
|
+
sage: F_triangle(ft).vector()
|
|
715
|
+
5*x^2 + 5*x + 1
|
|
716
|
+
"""
|
|
717
|
+
x, y = self._vars
|
|
718
|
+
anneau = PolynomialRing(ZZ, "x")
|
|
719
|
+
nx = anneau.gen()
|
|
720
|
+
return anneau(self._poly.subs({x: nx, y: nx}))
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
class Gamma_triangle(Triangle):
|
|
724
|
+
"""
|
|
725
|
+
Class for the Gamma-triangles.
|
|
726
|
+
"""
|
|
727
|
+
_prefix = 'Γ'
|
|
728
|
+
|
|
729
|
+
def h(self):
|
|
730
|
+
r"""
|
|
731
|
+
Return the associated H-triangle.
|
|
732
|
+
|
|
733
|
+
The transition between Gamma-triangles and H-triangles is defined by
|
|
734
|
+
|
|
735
|
+
.. MATH::
|
|
736
|
+
|
|
737
|
+
H(x,y) = (1+x)^d \sum_{0\leq i; 0\leq j \leq d-2i} \gamma_{i,j}
|
|
738
|
+
\left(\frac{x}{(1+x)^2}\right)^i \left(\frac{1+xy}{1+x}\right)^j
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: from sage.combinat.triangles_FHM import Gamma_triangle
|
|
743
|
+
sage: x, y = polygen(ZZ,'x,y')
|
|
744
|
+
sage: g = y**2 + x
|
|
745
|
+
sage: Gamma_triangle(g).h()
|
|
746
|
+
H: x^2*y^2 + 2*x*y + x + 1
|
|
747
|
+
|
|
748
|
+
sage: a, b = polygen(ZZ, 'a, b')
|
|
749
|
+
sage: x, y = polygens(a.parent(),'x,y')
|
|
750
|
+
sage: g = Gamma_triangle(y**3+a*x*y+b*x,(x,y))
|
|
751
|
+
sage: hh = g.h()
|
|
752
|
+
sage: hh.gamma() == g
|
|
753
|
+
True
|
|
754
|
+
"""
|
|
755
|
+
x, y = self._vars
|
|
756
|
+
n = self._n
|
|
757
|
+
resu = (1 + x)**n * self._poly(x=x / (1 + x)**2,
|
|
758
|
+
y=(1 + x * y) / (1 + x))
|
|
759
|
+
polyh = resu.numerator()
|
|
760
|
+
return H_triangle(polyh, variables=(x, y))
|
|
761
|
+
|
|
762
|
+
def vector(self):
|
|
763
|
+
"""
|
|
764
|
+
Return the gamma-vector as a polynomial in one variable.
|
|
765
|
+
|
|
766
|
+
This is obtained by letting `y=1`.
|
|
767
|
+
|
|
768
|
+
EXAMPLES::
|
|
769
|
+
|
|
770
|
+
sage: from sage.combinat.triangles_FHM import Gamma_triangle
|
|
771
|
+
sage: x, y = polygen(ZZ,'x,y')
|
|
772
|
+
sage: gt = y**2 + x
|
|
773
|
+
sage: Gamma_triangle(gt).vector()
|
|
774
|
+
x + 1
|
|
775
|
+
"""
|
|
776
|
+
anneau = PolynomialRing(ZZ, 'x')
|
|
777
|
+
return anneau(self._poly(y=1))
|