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,487 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
PBW data
|
|
5
|
+
|
|
6
|
+
This contains helper classes and functions which encode PBW data
|
|
7
|
+
in finite type.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Dinakar Muthiah (2015-05): initial version
|
|
12
|
+
- Travis Scrimshaw (2016-06): simplified code and converted to Cython
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# ****************************************************************************
|
|
16
|
+
# Copyright (C) 2015 Dinakar Muthiah <muthiah at ualberta.ca>
|
|
17
|
+
# Travis Scrimshaw <tscrimsh at umn.edu>
|
|
18
|
+
#
|
|
19
|
+
# This program is free software: you can redistribute it and/or modify
|
|
20
|
+
# it under the terms of the GNU General Public License as published by
|
|
21
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
22
|
+
# (at your option) any later version.
|
|
23
|
+
# https://www.gnu.org/licenses/
|
|
24
|
+
# ****************************************************************************
|
|
25
|
+
|
|
26
|
+
# from sage.misc.lazy_attribute import lazy_attribute
|
|
27
|
+
from sage.misc.cachefunc import cached_method
|
|
28
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
29
|
+
from sage.combinat.root_system.root_system import RootSystem
|
|
30
|
+
from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
|
|
31
|
+
|
|
32
|
+
cimport cython
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class PBWDatum():
|
|
36
|
+
"""
|
|
37
|
+
Helper class which represents a PBW datum.
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self, parent, long_word, lusztig_datum):
|
|
40
|
+
"""
|
|
41
|
+
Initialize ``self``.
|
|
42
|
+
|
|
43
|
+
EXAMPLES::
|
|
44
|
+
|
|
45
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
46
|
+
sage: P = PBWData("A2")
|
|
47
|
+
sage: L = PBWDatum(P, (1,2,1), (1,4,7))
|
|
48
|
+
sage: TestSuite(L).run(skip='_test_pickling')
|
|
49
|
+
"""
|
|
50
|
+
self.parent = parent
|
|
51
|
+
self.long_word = tuple(long_word)
|
|
52
|
+
self.lusztig_datum = tuple(lusztig_datum)
|
|
53
|
+
|
|
54
|
+
def __repr__(self):
|
|
55
|
+
"""
|
|
56
|
+
Return a string representation of ``self``.
|
|
57
|
+
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
61
|
+
sage: P = PBWData("A2")
|
|
62
|
+
sage: PBWDatum(P, (1,2,1), (1,4,7))
|
|
63
|
+
PBW Datum element of type ['A', 2] with long word (1, 2, 1)
|
|
64
|
+
and Lusztig datum (1, 4, 7)
|
|
65
|
+
"""
|
|
66
|
+
return_str = "PBW Datum element of type {cartan_type} with ".format(
|
|
67
|
+
cartan_type=self.parent.cartan_type)
|
|
68
|
+
return_str += "long word {long_word} and Lusztig datum {lusztig_datum}".format(
|
|
69
|
+
long_word=self.long_word,
|
|
70
|
+
lusztig_datum=self.lusztig_datum)
|
|
71
|
+
return return_str
|
|
72
|
+
|
|
73
|
+
def __eq__(self, other_PBWDatum):
|
|
74
|
+
"""
|
|
75
|
+
Check equality.
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
80
|
+
sage: P = PBWData("A2")
|
|
81
|
+
sage: L1 = PBWDatum(P, (1,2,1), (1,4,7))
|
|
82
|
+
sage: L2 = PBWDatum(P, (1,2,1), (1,4,7))
|
|
83
|
+
sage: L1 == L2
|
|
84
|
+
True
|
|
85
|
+
"""
|
|
86
|
+
return (self.parent == other_PBWDatum.parent and
|
|
87
|
+
self.long_word == other_PBWDatum.long_word and
|
|
88
|
+
self.lusztig_datum == other_PBWDatum.lusztig_datum)
|
|
89
|
+
|
|
90
|
+
def is_equivalent_to(self, other_pbw_datum):
|
|
91
|
+
r"""
|
|
92
|
+
Return whether ``self`` is equivalent to ``other_pbw_datum``.
|
|
93
|
+
modulo the tropical Plücker relations.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
98
|
+
sage: P = PBWData("A2")
|
|
99
|
+
sage: L1 = PBWDatum(P, (1,2,1), (1,0,1))
|
|
100
|
+
sage: L2 = PBWDatum(P, (2,1,2), (0,1,0))
|
|
101
|
+
sage: L1.is_equivalent_to(L2)
|
|
102
|
+
True
|
|
103
|
+
sage: L1 == L2
|
|
104
|
+
False
|
|
105
|
+
"""
|
|
106
|
+
other_long_word = other_pbw_datum.long_word
|
|
107
|
+
other_lusztig_datum = other_pbw_datum.lusztig_datum
|
|
108
|
+
equiv_pbw_datum = self.convert_to_new_long_word(other_long_word)
|
|
109
|
+
return equiv_pbw_datum.lusztig_datum == other_lusztig_datum
|
|
110
|
+
|
|
111
|
+
def convert_to_long_word_with_first_letter(self, i):
|
|
112
|
+
r"""
|
|
113
|
+
Return a new PBWDatum equivalent to ``self``
|
|
114
|
+
whose long word begins with ``i``.
|
|
115
|
+
|
|
116
|
+
EXAMPLES::
|
|
117
|
+
|
|
118
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
119
|
+
sage: P = PBWData("A3")
|
|
120
|
+
sage: datum = PBWDatum(P, (1,2,1,3,2,1), (1,0,1,4,2,3))
|
|
121
|
+
sage: datum.convert_to_long_word_with_first_letter(1)
|
|
122
|
+
PBW Datum element of type ['A', 3] with long word (1, 2, 3, 1, 2, 1)
|
|
123
|
+
and Lusztig datum (1, 0, 4, 1, 2, 3)
|
|
124
|
+
sage: datum.convert_to_long_word_with_first_letter(2)
|
|
125
|
+
PBW Datum element of type ['A', 3] with long word (2, 1, 2, 3, 2, 1)
|
|
126
|
+
and Lusztig datum (0, 1, 0, 4, 2, 3)
|
|
127
|
+
sage: datum.convert_to_long_word_with_first_letter(3)
|
|
128
|
+
PBW Datum element of type ['A', 3] with long word (3, 1, 2, 3, 1, 2)
|
|
129
|
+
and Lusztig datum (8, 1, 0, 4, 1, 2)
|
|
130
|
+
"""
|
|
131
|
+
return self.convert_to_new_long_word(self.parent._long_word_begin_with(i))
|
|
132
|
+
|
|
133
|
+
def convert_to_new_long_word(self, new_long_word):
|
|
134
|
+
r"""
|
|
135
|
+
Return a new PBWDatum equivalent to ``self``
|
|
136
|
+
whose long word is ``new_long_word``.
|
|
137
|
+
|
|
138
|
+
EXAMPLES::
|
|
139
|
+
|
|
140
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
141
|
+
sage: P = PBWData("A2")
|
|
142
|
+
sage: datum = PBWDatum(P, (1,2,1), (1,0,1))
|
|
143
|
+
sage: new_datum = datum.convert_to_new_long_word((2,1,2))
|
|
144
|
+
sage: new_datum.long_word
|
|
145
|
+
(2, 1, 2)
|
|
146
|
+
sage: new_datum.lusztig_datum
|
|
147
|
+
(0, 1, 0)
|
|
148
|
+
"""
|
|
149
|
+
return self.parent.convert_to_new_long_word(self, new_long_word)
|
|
150
|
+
|
|
151
|
+
def weight(self):
|
|
152
|
+
"""
|
|
153
|
+
Return the weight of ``self``.
|
|
154
|
+
|
|
155
|
+
EXAMPLES::
|
|
156
|
+
|
|
157
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
158
|
+
sage: P = PBWData("A2")
|
|
159
|
+
sage: L = PBWDatum(P, (1,2,1), (1,1,1))
|
|
160
|
+
sage: L.weight()
|
|
161
|
+
-2*alpha[1] - 2*alpha[2]
|
|
162
|
+
"""
|
|
163
|
+
root_list = self.parent._root_list_from(tuple(self.long_word))
|
|
164
|
+
R = self.parent.root_lattice
|
|
165
|
+
return R.linear_combination((root_list[i], -coeff)
|
|
166
|
+
for i, coeff in enumerate(self.lusztig_datum))
|
|
167
|
+
|
|
168
|
+
def star(self):
|
|
169
|
+
"""
|
|
170
|
+
Return the starred version of ``self``, i.e.,
|
|
171
|
+
with reversed ``long_word`` and ``lusztig_datum``
|
|
172
|
+
|
|
173
|
+
EXAMPLES::
|
|
174
|
+
|
|
175
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
176
|
+
sage: P = PBWData("A2")
|
|
177
|
+
sage: L1 = PBWDatum(P, (1,2,1), (1,2,3))
|
|
178
|
+
sage: L1.star() == PBWDatum(P, (2,1,2), (3,2,1))
|
|
179
|
+
True
|
|
180
|
+
"""
|
|
181
|
+
aut = self.parent.cartan_type.opposition_automorphism()
|
|
182
|
+
reversed_long_word = [aut[i] for i in reversed(self.long_word)]
|
|
183
|
+
reversed_lusztig_datum = reversed(self.lusztig_datum)
|
|
184
|
+
return PBWDatum(self.parent, reversed_long_word, reversed_lusztig_datum)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class PBWData(): # UniqueRepresentation?
|
|
188
|
+
"""
|
|
189
|
+
Helper class for the set of PBW data.
|
|
190
|
+
"""
|
|
191
|
+
def __init__(self, cartan_type):
|
|
192
|
+
"""
|
|
193
|
+
Initialize ``self``.
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData
|
|
198
|
+
sage: P = PBWData(["A",2])
|
|
199
|
+
sage: TestSuite(P).run(skip='_test_pickling')
|
|
200
|
+
"""
|
|
201
|
+
self.cartan_type = CartanType(cartan_type)
|
|
202
|
+
self.root_system = RootSystem(self.cartan_type)
|
|
203
|
+
self.root_lattice = self.root_system.root_lattice()
|
|
204
|
+
self.weyl_group = self.root_lattice.weyl_group()
|
|
205
|
+
self._braid_move_calc = BraidMoveCalculator(self.weyl_group)
|
|
206
|
+
|
|
207
|
+
def convert_to_new_long_word(self, pbw_datum, new_long_word):
|
|
208
|
+
"""
|
|
209
|
+
Convert the PBW datum ``pbw_datum`` from its long word to
|
|
210
|
+
``new_long_word``.
|
|
211
|
+
|
|
212
|
+
EXAMPLES::
|
|
213
|
+
|
|
214
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData, PBWDatum
|
|
215
|
+
sage: P = PBWData("A2")
|
|
216
|
+
sage: datum = PBWDatum(P, (1,2,1), (1,0,1))
|
|
217
|
+
sage: new_datum = P.convert_to_new_long_word(datum,(2,1,2))
|
|
218
|
+
sage: new_datum
|
|
219
|
+
PBW Datum element of type ['A', 2] with long word (2, 1, 2)
|
|
220
|
+
and Lusztig datum (0, 1, 0)
|
|
221
|
+
sage: new_datum.long_word
|
|
222
|
+
(2, 1, 2)
|
|
223
|
+
sage: new_datum.lusztig_datum
|
|
224
|
+
(0, 1, 0)
|
|
225
|
+
"""
|
|
226
|
+
assert pbw_datum.parent is self
|
|
227
|
+
chain = self._braid_move_calc.chain_of_reduced_words(pbw_datum.long_word,
|
|
228
|
+
new_long_word)
|
|
229
|
+
cdef list enhanced_braid_chain = enhance_braid_move_chain(chain, self.cartan_type)
|
|
230
|
+
new_lusztig_datum = compute_new_lusztig_datum(enhanced_braid_chain,
|
|
231
|
+
pbw_datum.lusztig_datum)
|
|
232
|
+
return PBWDatum(self, new_long_word, new_lusztig_datum)
|
|
233
|
+
|
|
234
|
+
@cached_method
|
|
235
|
+
def _root_list_from(self, reduced_word):
|
|
236
|
+
"""
|
|
237
|
+
Return the list of positive roots in the order determined by
|
|
238
|
+
``reduced_word``.
|
|
239
|
+
|
|
240
|
+
.. WARNING::
|
|
241
|
+
|
|
242
|
+
No error checking is done to verify that ``reduced_word``
|
|
243
|
+
is reduced.
|
|
244
|
+
|
|
245
|
+
INPUT:
|
|
246
|
+
|
|
247
|
+
- ``reduced_word`` -- tuple corresponding to a reduced word
|
|
248
|
+
|
|
249
|
+
EXAMPLES::
|
|
250
|
+
|
|
251
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData
|
|
252
|
+
sage: P = PBWData(["A",2])
|
|
253
|
+
sage: P._root_list_from((1,2,1))
|
|
254
|
+
[alpha[1], alpha[1] + alpha[2], alpha[2]]
|
|
255
|
+
"""
|
|
256
|
+
al = self.root_lattice.simple_roots()
|
|
257
|
+
cur = []
|
|
258
|
+
for i in reversed(reduced_word):
|
|
259
|
+
cur = [al[i]] + [x.simple_reflection(i) for x in cur]
|
|
260
|
+
return cur
|
|
261
|
+
|
|
262
|
+
@cached_method
|
|
263
|
+
def _long_word_begin_with(self, i):
|
|
264
|
+
"""
|
|
265
|
+
Return a reduced expression of the long word which begins with ``i``.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: from sage.combinat.crystals.pbw_datum import PBWData
|
|
270
|
+
sage: P = PBWData(["C",3])
|
|
271
|
+
sage: P._long_word_begin_with(1)
|
|
272
|
+
(1, 3, 2, 3, 1, 2, 3, 1, 2)
|
|
273
|
+
sage: P._long_word_begin_with(2)
|
|
274
|
+
(2, 3, 2, 3, 1, 2, 3, 2, 1)
|
|
275
|
+
sage: P._long_word_begin_with(3)
|
|
276
|
+
(3, 2, 3, 1, 2, 3, 1, 2, 1)
|
|
277
|
+
"""
|
|
278
|
+
si = self.weyl_group.simple_reflection(i)
|
|
279
|
+
w0 = self.weyl_group.long_element()
|
|
280
|
+
return tuple([i] + (si * w0).reduced_word())
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
# enhanced_braid_chain is an ugly data structure.
|
|
284
|
+
@cython.boundscheck(False)
|
|
285
|
+
@cython.wraparound(False)
|
|
286
|
+
cpdef tuple compute_new_lusztig_datum(list enhanced_braid_chain, initial_lusztig_datum):
|
|
287
|
+
"""
|
|
288
|
+
Return the Lusztig datum obtained by applying tropical Plücker
|
|
289
|
+
relations along ``enhanced_braid_chain`` starting with
|
|
290
|
+
``initial_lusztig_datum``.
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
|
|
295
|
+
sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
|
|
296
|
+
sage: from sage.combinat.crystals.pbw_datum import compute_new_lusztig_datum
|
|
297
|
+
sage: ct = CartanType(['A', 2])
|
|
298
|
+
sage: W = CoxeterGroup(ct)
|
|
299
|
+
sage: B = BraidMoveCalculator(W)
|
|
300
|
+
sage: chain = B.chain_of_reduced_words((1,2,1),(2,1,2))
|
|
301
|
+
sage: enhanced_braid_chain = enhance_braid_move_chain(chain, ct)
|
|
302
|
+
sage: compute_new_lusztig_datum(enhanced_braid_chain,(1,0,1))
|
|
303
|
+
(0, 1, 0)
|
|
304
|
+
|
|
305
|
+
TESTS::
|
|
306
|
+
|
|
307
|
+
sage: from sage.combinat.root_system.braid_move_calculator import BraidMoveCalculator
|
|
308
|
+
sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
|
|
309
|
+
sage: from sage.combinat.crystals.pbw_datum import compute_new_lusztig_datum
|
|
310
|
+
sage: ct = CartanType(['A', 2])
|
|
311
|
+
sage: W = CoxeterGroup(ct)
|
|
312
|
+
sage: B = BraidMoveCalculator(W)
|
|
313
|
+
sage: chain = B.chain_of_reduced_words((1,2,1), (2,1,2))
|
|
314
|
+
sage: enhanced_braid_chain = enhance_braid_move_chain(chain, ct)
|
|
315
|
+
sage: compute_new_lusztig_datum(enhanced_braid_chain,(1,0,1)) == (0,1,0)
|
|
316
|
+
True
|
|
317
|
+
"""
|
|
318
|
+
cdef tuple interval_of_change
|
|
319
|
+
# Does not currently check that len(initial_lusztig_datum) is appropriate
|
|
320
|
+
cdef list new_lusztig_datum = list(initial_lusztig_datum) # shallow copy
|
|
321
|
+
cdef int i
|
|
322
|
+
for i in range(1, len(enhanced_braid_chain)):
|
|
323
|
+
interval_of_change, type_data = enhanced_braid_chain[i]
|
|
324
|
+
a, b = interval_of_change
|
|
325
|
+
old_interval_datum = new_lusztig_datum[a:b]
|
|
326
|
+
new_interval_datum = tropical_plucker_relation(type_data, old_interval_datum)
|
|
327
|
+
new_lusztig_datum[a:b] = new_interval_datum
|
|
328
|
+
return tuple(new_lusztig_datum)
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
# The tropical Plücker relations
|
|
332
|
+
@cython.boundscheck(False)
|
|
333
|
+
@cython.wraparound(False)
|
|
334
|
+
cpdef tuple tropical_plucker_relation(tuple a, lusztig_datum):
|
|
335
|
+
r"""
|
|
336
|
+
Apply the tropical Plücker relation of type ``a`` to ``lusztig_datum``.
|
|
337
|
+
|
|
338
|
+
The relations are obtained by tropicalizing the relations in
|
|
339
|
+
Proposition 7.1 of [BZ01]_.
|
|
340
|
+
|
|
341
|
+
INPUT:
|
|
342
|
+
|
|
343
|
+
- ``a`` -- a pair ``(x, y)`` of the off-diagonal entries of a
|
|
344
|
+
`2 \times 2` Cartan matrix
|
|
345
|
+
|
|
346
|
+
EXAMPLES::
|
|
347
|
+
|
|
348
|
+
sage: from sage.combinat.crystals.pbw_datum import tropical_plucker_relation
|
|
349
|
+
sage: tropical_plucker_relation((0,0), (2,3))
|
|
350
|
+
(3, 2)
|
|
351
|
+
sage: tropical_plucker_relation((-1,-1), (1,2,3))
|
|
352
|
+
(4, 1, 2)
|
|
353
|
+
sage: tropical_plucker_relation((-1,-2), (1,2,3,4))
|
|
354
|
+
(8, 1, 2, 3)
|
|
355
|
+
sage: tropical_plucker_relation((-2,-1), (1,2,3,4))
|
|
356
|
+
(6, 1, 2, 3)
|
|
357
|
+
"""
|
|
358
|
+
if a == (0, 0): # A1xA1
|
|
359
|
+
t1, t2 = lusztig_datum
|
|
360
|
+
return (t2, t1)
|
|
361
|
+
elif a == (-1, -1): # A2
|
|
362
|
+
t1,t2,t3 = lusztig_datum
|
|
363
|
+
return (t2+t3-min(t1,t3),
|
|
364
|
+
min(t1,t3),
|
|
365
|
+
t1+t2-min(t1,t3))
|
|
366
|
+
elif a == (-1, -2): # B2
|
|
367
|
+
t1,t2,t3,t4 = lusztig_datum
|
|
368
|
+
pi1 = min(t1+t2,min(t1,t3)+t4)
|
|
369
|
+
pi2 = min(2*t1+t2,2*min(t1,t3)+t4)
|
|
370
|
+
return (t2+2*t3+t4-pi2,
|
|
371
|
+
pi2-pi1,
|
|
372
|
+
2*pi1-pi2,
|
|
373
|
+
t1+t2+t3-pi1)
|
|
374
|
+
elif a == (-1, -3): # G2
|
|
375
|
+
t1,t2,t3,t4,t5,t6 = lusztig_datum
|
|
376
|
+
pi1 = min(t1+t2+2*t3+t4,
|
|
377
|
+
t1+t2+2*min(t3,t5)+t6,
|
|
378
|
+
min(t1,t3)+t4+2*t5+t6)
|
|
379
|
+
pi2 = min(2*t1+2*t2+3*t3+t4,
|
|
380
|
+
2*t1+2*t2+3*min(t3,t5)+t6,
|
|
381
|
+
2*min(t1,t3)+2*t4+3*t5+t6,
|
|
382
|
+
t1+t2+t4+2*t5+t6+min(t1+t3,2*t3,t3+t5,t1+t5))
|
|
383
|
+
pi3 = min(3*t1+2*t2+3*t3+t4,
|
|
384
|
+
3*t1+2*t2+3*min(t3,t5)+t6,
|
|
385
|
+
3*min(t1,t3)+2*t4+3*t5+t6,
|
|
386
|
+
2*t1+t2+t4+2*t5+t6+min(t1+t3,2*t3,t3+t5,t1+t5))
|
|
387
|
+
pi4 = min(2*t1+2*t2+3*t3+t4+min(t1+t2+3*t3+t4,
|
|
388
|
+
t1+t2+3*min(t3,t5)+t6,
|
|
389
|
+
min(t1+t3,2*t3,t3+t5,t1+t5)+t4+2*t5+t6),
|
|
390
|
+
2*t6+3*min(t1+t2+2*min(t3,t5),min(t1,t3)+t4+2*t5))
|
|
391
|
+
return (t2+3*t3+2*t4+3*t5+t6-pi3,
|
|
392
|
+
pi3-pi2,
|
|
393
|
+
3*pi2-pi3-pi4,
|
|
394
|
+
pi4-pi1-pi2,
|
|
395
|
+
3*pi1-pi4,
|
|
396
|
+
t1+t2+2*t3+t4+t5-pi1)
|
|
397
|
+
else: # (-1,-2) and (-1,-3)
|
|
398
|
+
reversed_lusztig_datum = tuple(reversed(lusztig_datum))
|
|
399
|
+
return tuple(reversed(tropical_plucker_relation((a[1], a[0]),
|
|
400
|
+
reversed_lusztig_datum)))
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
# Maybe we need to be more specific, and pass not the Cartan type, but the root lattice?
|
|
404
|
+
# TODO: Move to PBW_data?
|
|
405
|
+
@cython.boundscheck(False)
|
|
406
|
+
@cython.wraparound(False)
|
|
407
|
+
cpdef list enhance_braid_move_chain(braid_move_chain, cartan_type):
|
|
408
|
+
r"""
|
|
409
|
+
Return a list of tuples that records the data of the long words in
|
|
410
|
+
``braid_move_chain`` plus the data of the intervals where the braid moves
|
|
411
|
+
occur and the data of the off-diagonal entries of the `2 \times 2` Cartan
|
|
412
|
+
submatrices of each braid move.
|
|
413
|
+
|
|
414
|
+
INPUT:
|
|
415
|
+
|
|
416
|
+
- ``braid_move_chain`` -- a chain of reduced words in the Weyl group
|
|
417
|
+
of ``cartan_type``
|
|
418
|
+
- ``cartan_type`` -- a finite Cartan type
|
|
419
|
+
|
|
420
|
+
OUTPUT:
|
|
421
|
+
|
|
422
|
+
A list of 2-tuples
|
|
423
|
+
``(interval_of_change, cartan_sub_matrix)`` where
|
|
424
|
+
|
|
425
|
+
- ``interval_of_change`` is the (half-open) interval of indices where
|
|
426
|
+
the braid move occurs; this is ``None`` for the first tuple
|
|
427
|
+
- ``cartan_sub_matrix`` is the off-diagonal entries of the `2 \times 2`
|
|
428
|
+
submatrix of the Cartan matrix corresponding to the braid move;
|
|
429
|
+
this is ``None`` for the first tuple
|
|
430
|
+
|
|
431
|
+
For a matrix::
|
|
432
|
+
|
|
433
|
+
[2 a]
|
|
434
|
+
[b 2]
|
|
435
|
+
|
|
436
|
+
the ``cartan_sub_matrix`` is the pair ``(a, b)``.
|
|
437
|
+
|
|
438
|
+
TESTS::
|
|
439
|
+
|
|
440
|
+
sage: from sage.combinat.crystals.pbw_datum import enhance_braid_move_chain
|
|
441
|
+
sage: braid_chain = [(1, 2, 1, 3, 2, 1),
|
|
442
|
+
....: (1, 2, 3, 1, 2, 1),
|
|
443
|
+
....: (1, 2, 3, 2, 1, 2),
|
|
444
|
+
....: (1, 3, 2, 3, 1, 2),
|
|
445
|
+
....: (3, 1, 2, 3, 1, 2),
|
|
446
|
+
....: (3, 1, 2, 1, 3, 2),
|
|
447
|
+
....: (3, 2, 1, 2, 3, 2),
|
|
448
|
+
....: (3, 2, 1, 3, 2, 3)]
|
|
449
|
+
sage: enhanced_chain = enhance_braid_move_chain(braid_chain, CartanType(["A",5]))
|
|
450
|
+
sage: enhanced_chain[0]
|
|
451
|
+
(None, None)
|
|
452
|
+
sage: enhanced_chain[7]
|
|
453
|
+
((3, 6), (-1, -1))
|
|
454
|
+
"""
|
|
455
|
+
cdef int i, j
|
|
456
|
+
cdef int k, pos, first, last
|
|
457
|
+
cdef tuple cartan_sub_matrix
|
|
458
|
+
cdef list output_list = []
|
|
459
|
+
output_list.append( (None, None) )
|
|
460
|
+
cdef tuple previous_word = <tuple> (braid_move_chain[0])
|
|
461
|
+
cdef tuple current_word
|
|
462
|
+
cartan_matrix = cartan_type.cartan_matrix()
|
|
463
|
+
cdef int ell = len(previous_word)
|
|
464
|
+
# TODO - Optimize this by avoiding calls to here?
|
|
465
|
+
# This likely could be done when performing chain_of_reduced_words
|
|
466
|
+
# Things in here get called the most (about 50x more than enhance_braid_move_chain)
|
|
467
|
+
for pos in range(1, len(braid_move_chain)):
|
|
468
|
+
# This gets the smallest contiguous half-open interval [a, b)
|
|
469
|
+
# that contains the indices where current_word and previous_word differ.
|
|
470
|
+
current_word = <tuple> (braid_move_chain[pos])
|
|
471
|
+
for k in range(ell):
|
|
472
|
+
i = previous_word[k]
|
|
473
|
+
j = current_word[k]
|
|
474
|
+
if i != j:
|
|
475
|
+
i -= 1 # -1 for indexing
|
|
476
|
+
j -= 1 # -1 for indexing
|
|
477
|
+
first = k
|
|
478
|
+
break
|
|
479
|
+
for k in range(ell-1, k-1, -1):
|
|
480
|
+
if previous_word[k] != current_word[k]:
|
|
481
|
+
last = k + 1
|
|
482
|
+
break
|
|
483
|
+
|
|
484
|
+
cartan_sub_matrix = (cartan_matrix[i, j], cartan_matrix[j, i])
|
|
485
|
+
output_list.append(((first, last), cartan_sub_matrix))
|
|
486
|
+
previous_word = current_word
|
|
487
|
+
return output_list
|