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,608 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Q-Systems
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2013-10-08): Initial version
|
|
9
|
+
- Travis Scrimshaw (2017-12-08): Added twisted Q-systems
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
#*****************************************************************************
|
|
13
|
+
# Copyright (C) 2013,2017 Travis Scrimshaw <tcscrims at gmail.com>
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
# http://www.gnu.org/licenses/
|
|
20
|
+
#*****************************************************************************
|
|
21
|
+
|
|
22
|
+
import itertools
|
|
23
|
+
from sage.misc.cachefunc import cached_method
|
|
24
|
+
from sage.misc.misc_c import prod
|
|
25
|
+
|
|
26
|
+
from sage.categories.algebras import Algebras
|
|
27
|
+
from sage.rings.integer_ring import ZZ
|
|
28
|
+
from sage.rings.infinity import infinity
|
|
29
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
30
|
+
from sage.sets.family import Family
|
|
31
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
32
|
+
from sage.monoids.indexed_free_monoid import IndexedFreeAbelianMonoid
|
|
33
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class QSystem(CombinatorialFreeModule):
|
|
37
|
+
r"""
|
|
38
|
+
A Q-system.
|
|
39
|
+
|
|
40
|
+
Let `\mathfrak{g}` be a tamely-laced symmetrizable Kac-Moody algebra
|
|
41
|
+
with index set `I` and Cartan matrix `(C_{ab})_{a,b \in I}` over a
|
|
42
|
+
field `k`. Follow the presentation given in [HKOTY1999]_, an
|
|
43
|
+
unrestricted Q-system is a `k`-algebra in infinitely many variables
|
|
44
|
+
`Q^{(a)}_m`, where `a \in I` and `m \in \ZZ_{>0}`, that satisfies
|
|
45
|
+
the relations
|
|
46
|
+
|
|
47
|
+
.. MATH::
|
|
48
|
+
|
|
49
|
+
\left(Q^{(a)}_m\right)^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1} +
|
|
50
|
+
\prod_{b \sim a} \prod_{k=0}^{-C_{ab} - 1}
|
|
51
|
+
Q^{(b)}_{\left\lfloor \frac{m C_{ba} - k}{C_{ab}} \right\rfloor},
|
|
52
|
+
|
|
53
|
+
with `Q^{(a)}_0 := 1`. Q-systems can be considered as T-systems where
|
|
54
|
+
we forget the spectral parameter `u` and for `\mathfrak{g}` of finite
|
|
55
|
+
type, have a solution given by the characters of Kirillov-Reshetikhin
|
|
56
|
+
modules (again without the spectral parameter) for an affine Kac-Moody
|
|
57
|
+
algebra `\widehat{\mathfrak{g}}` with `\mathfrak{g}` as its classical
|
|
58
|
+
subalgebra. See [KNS2011]_ for more information.
|
|
59
|
+
|
|
60
|
+
Q-systems have a natural bases given by polynomials of the
|
|
61
|
+
fundamental representations `Q^{(a)}_1`, for `a \in I`. As such, we
|
|
62
|
+
consider the Q-system as generated by `\{ Q^{(a)}_1 \}_{a \in I}`.
|
|
63
|
+
|
|
64
|
+
There is also a level `\ell` restricted Q-system (with unit boundary
|
|
65
|
+
condition) given by setting `Q_{d_a \ell}^{(a)} = 1`, where `d_a`
|
|
66
|
+
are the entries of the symmetrizing matrix for the dual type of
|
|
67
|
+
`\mathfrak{g}`.
|
|
68
|
+
|
|
69
|
+
Similarly, for twisted affine types (we omit type `A_{2n}^{(2)}`),
|
|
70
|
+
we can define the *twisted Q-system* by using the relation:
|
|
71
|
+
|
|
72
|
+
.. MATH::
|
|
73
|
+
|
|
74
|
+
(Q^{(a)}_{m})^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1}
|
|
75
|
+
+ \prod_{b \neq a} (Q^{(b)}_{m})^{-C_{ba}}.
|
|
76
|
+
|
|
77
|
+
See [Wil2013]_ for more information.
|
|
78
|
+
|
|
79
|
+
EXAMPLES:
|
|
80
|
+
|
|
81
|
+
We begin by constructing a Q-system and doing some basic computations
|
|
82
|
+
in type `A_4`::
|
|
83
|
+
|
|
84
|
+
sage: Q = QSystem(QQ, ['A', 4])
|
|
85
|
+
sage: Q.Q(3,1)
|
|
86
|
+
Q^(3)[1]
|
|
87
|
+
sage: Q.Q(1,2)
|
|
88
|
+
Q^(1)[1]^2 - Q^(2)[1]
|
|
89
|
+
sage: Q.Q(3,3)
|
|
90
|
+
-Q^(1)[1]*Q^(3)[1] + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2
|
|
91
|
+
- 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
|
|
92
|
+
sage: x = Q.Q(1,1) + Q.Q(2,1); x
|
|
93
|
+
Q^(1)[1] + Q^(2)[1]
|
|
94
|
+
sage: x * x
|
|
95
|
+
Q^(1)[1]^2 + 2*Q^(1)[1]*Q^(2)[1] + Q^(2)[1]^2
|
|
96
|
+
|
|
97
|
+
Next we do some basic computations in type `C_4`::
|
|
98
|
+
|
|
99
|
+
sage: Q = QSystem(QQ, ['C', 4])
|
|
100
|
+
sage: Q.Q(4,1)
|
|
101
|
+
Q^(4)[1]
|
|
102
|
+
sage: Q.Q(1,2)
|
|
103
|
+
Q^(1)[1]^2 - Q^(2)[1]
|
|
104
|
+
sage: Q.Q(2,3)
|
|
105
|
+
Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1]
|
|
106
|
+
+ Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2
|
|
107
|
+
sage: Q.Q(3,3)
|
|
108
|
+
Q^(1)[1]*Q^(4)[1]^2 - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
|
|
109
|
+
|
|
110
|
+
We compare that with the twisted Q-system of type `A_7^{(2)}`::
|
|
111
|
+
|
|
112
|
+
sage: Q = QSystem(QQ, ['A',7,2], twisted=True)
|
|
113
|
+
sage: Q.Q(4,1)
|
|
114
|
+
Q^(4)[1]
|
|
115
|
+
sage: Q.Q(1,2)
|
|
116
|
+
Q^(1)[1]^2 - Q^(2)[1]
|
|
117
|
+
sage: Q.Q(2,3)
|
|
118
|
+
Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1]
|
|
119
|
+
+ Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2
|
|
120
|
+
sage: Q.Q(3,3)
|
|
121
|
+
-Q^(1)[1]*Q^(3)[1]^2 + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2*Q^(3)[1]
|
|
122
|
+
- 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
|
|
123
|
+
|
|
124
|
+
REFERENCES:
|
|
125
|
+
|
|
126
|
+
- [HKOTY1999]_
|
|
127
|
+
- [KNS2011]_
|
|
128
|
+
"""
|
|
129
|
+
@staticmethod
|
|
130
|
+
def __classcall__(cls, base_ring, cartan_type, level=None, twisted=False):
|
|
131
|
+
"""
|
|
132
|
+
Normalize arguments to ensure a unique representation.
|
|
133
|
+
|
|
134
|
+
EXAMPLES::
|
|
135
|
+
|
|
136
|
+
sage: Q1 = QSystem(QQ, ['A',4])
|
|
137
|
+
sage: Q2 = QSystem(QQ, 'A4')
|
|
138
|
+
sage: Q1 is Q2
|
|
139
|
+
True
|
|
140
|
+
|
|
141
|
+
Twisted Q-systems are different from untwisted Q-systems::
|
|
142
|
+
|
|
143
|
+
sage: Q1 = QSystem(QQ, ['E',6,2], twisted=True)
|
|
144
|
+
sage: Q2 = QSystem(QQ, ['E',6,2])
|
|
145
|
+
sage: Q1 is Q2
|
|
146
|
+
False
|
|
147
|
+
"""
|
|
148
|
+
cartan_type = CartanType(cartan_type)
|
|
149
|
+
if not is_tamely_laced(cartan_type):
|
|
150
|
+
raise ValueError("the Cartan type is not tamely-laced")
|
|
151
|
+
if twisted and not cartan_type.is_affine() and not cartan_type.is_untwisted_affine():
|
|
152
|
+
raise ValueError("the Cartan type must be of twisted type")
|
|
153
|
+
return super().__classcall__(cls, base_ring, cartan_type, level, twisted)
|
|
154
|
+
|
|
155
|
+
def __init__(self, base_ring, cartan_type, level, twisted):
|
|
156
|
+
"""
|
|
157
|
+
Initialize ``self``.
|
|
158
|
+
|
|
159
|
+
EXAMPLES::
|
|
160
|
+
|
|
161
|
+
sage: Q = QSystem(QQ, ['A',2])
|
|
162
|
+
sage: TestSuite(Q).run()
|
|
163
|
+
|
|
164
|
+
sage: Q = QSystem(QQ, ['E',6,2], twisted=True)
|
|
165
|
+
sage: TestSuite(Q).run()
|
|
166
|
+
"""
|
|
167
|
+
self._cartan_type = cartan_type
|
|
168
|
+
self._level = level
|
|
169
|
+
self._twisted = twisted
|
|
170
|
+
indices = tuple(itertools.product(cartan_type.index_set(), [1]))
|
|
171
|
+
basis = IndexedFreeAbelianMonoid(indices, prefix='Q', bracket=False)
|
|
172
|
+
# This is used to do the reductions
|
|
173
|
+
if self._twisted:
|
|
174
|
+
self._cm = cartan_type.classical().cartan_matrix()
|
|
175
|
+
else:
|
|
176
|
+
self._cm = cartan_type.cartan_matrix()
|
|
177
|
+
self._Irev = {ind: pos for pos,ind in enumerate(self._cm.index_set())}
|
|
178
|
+
self._poly = PolynomialRing(ZZ, ['q'+str(i) for i in self._cm.index_set()])
|
|
179
|
+
|
|
180
|
+
category = Algebras(base_ring).Commutative().WithBasis()
|
|
181
|
+
CombinatorialFreeModule.__init__(self, base_ring, basis,
|
|
182
|
+
prefix='Q', category=category)
|
|
183
|
+
|
|
184
|
+
def _repr_(self):
|
|
185
|
+
r"""
|
|
186
|
+
Return a string representation of ``self``.
|
|
187
|
+
|
|
188
|
+
EXAMPLES::
|
|
189
|
+
|
|
190
|
+
sage: QSystem(QQ, ['A',4])
|
|
191
|
+
Q-system of type ['A', 4] over Rational Field
|
|
192
|
+
|
|
193
|
+
sage: QSystem(QQ, ['A',7,2], twisted=True)
|
|
194
|
+
Twisted Q-system of type ['B', 4, 1]^* over Rational Field
|
|
195
|
+
"""
|
|
196
|
+
if self._level is not None:
|
|
197
|
+
res = "Restricted level {} ".format(self._level)
|
|
198
|
+
else:
|
|
199
|
+
res = ''
|
|
200
|
+
if self._twisted:
|
|
201
|
+
res += "Twisted "
|
|
202
|
+
return "{}Q-system of type {} over {}".format(res, self._cartan_type, self.base_ring())
|
|
203
|
+
|
|
204
|
+
def _repr_term(self, t):
|
|
205
|
+
"""
|
|
206
|
+
Return a string representation of the basis element indexed by ``t``.
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
211
|
+
sage: I = Q._indices
|
|
212
|
+
sage: Q._repr_term( I.gen((1,1)) * I.gen((4,1)) )
|
|
213
|
+
'Q^(1)[1]*Q^(4)[1]'
|
|
214
|
+
"""
|
|
215
|
+
if len(t) == 0:
|
|
216
|
+
return '1'
|
|
217
|
+
|
|
218
|
+
def repr_gen(x):
|
|
219
|
+
ret = 'Q^({})[{}]'.format(*(x[0]))
|
|
220
|
+
if x[1] > 1:
|
|
221
|
+
ret += '^{}'.format(x[1])
|
|
222
|
+
return ret
|
|
223
|
+
return '*'.join(repr_gen(x) for x in t._sorted_items())
|
|
224
|
+
|
|
225
|
+
def _latex_term(self, t):
|
|
226
|
+
r"""
|
|
227
|
+
Return a `\LaTeX` representation of the basis element indexed
|
|
228
|
+
by ``t``.
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
233
|
+
sage: I = Q._indices
|
|
234
|
+
sage: Q._latex_term( I.gen((3,1)) * I.gen((4,1)) )
|
|
235
|
+
'Q^{(3)}_{1} Q^{(4)}_{1}'
|
|
236
|
+
"""
|
|
237
|
+
if len(t) == 0:
|
|
238
|
+
return '1'
|
|
239
|
+
|
|
240
|
+
def repr_gen(x):
|
|
241
|
+
ret = 'Q^{{({})}}_{{{}}}'.format(*(x[0]))
|
|
242
|
+
if x[1] > 1:
|
|
243
|
+
ret = '\\bigl(' + ret + '\\bigr)^{{{}}}'.format(x[1])
|
|
244
|
+
return ret
|
|
245
|
+
return ' '.join(repr_gen(x) for x in t._sorted_items())
|
|
246
|
+
|
|
247
|
+
def _ascii_art_term(self, t):
|
|
248
|
+
"""
|
|
249
|
+
Return an ascii art representation of the term indexed by ``t``.
|
|
250
|
+
|
|
251
|
+
TESTS::
|
|
252
|
+
|
|
253
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
254
|
+
sage: ascii_art(Q.an_element())
|
|
255
|
+
2 2 3
|
|
256
|
+
(1) ( (1)) ( (2)) ( (3)) (2)
|
|
257
|
+
1 + 2*Q1 + (Q1 ) *(Q1 ) *(Q1 ) + 3*Q1
|
|
258
|
+
"""
|
|
259
|
+
from sage.typeset.ascii_art import AsciiArt
|
|
260
|
+
if t == self.one_basis():
|
|
261
|
+
return AsciiArt(["1"])
|
|
262
|
+
ret = AsciiArt("")
|
|
263
|
+
first = True
|
|
264
|
+
for k, exp in t._sorted_items():
|
|
265
|
+
if not first:
|
|
266
|
+
ret += AsciiArt(['*'], baseline=0)
|
|
267
|
+
else:
|
|
268
|
+
first = False
|
|
269
|
+
a, m = k
|
|
270
|
+
var = AsciiArt([" ({})".format(a),
|
|
271
|
+
"Q{}".format(m)],
|
|
272
|
+
baseline=0)
|
|
273
|
+
if exp > 1:
|
|
274
|
+
var = (AsciiArt(['(', '('], baseline=0) + var
|
|
275
|
+
+ AsciiArt([')', ')'], baseline=0))
|
|
276
|
+
var = AsciiArt([" " * len(var) + str(exp)], baseline=-1) * var
|
|
277
|
+
ret += var
|
|
278
|
+
return ret
|
|
279
|
+
|
|
280
|
+
def _unicode_art_term(self, t):
|
|
281
|
+
r"""
|
|
282
|
+
Return a unicode art representation of the term indexed by ``t``.
|
|
283
|
+
|
|
284
|
+
TESTS::
|
|
285
|
+
|
|
286
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
287
|
+
sage: unicode_art(Q.an_element())
|
|
288
|
+
1 + 2*Q₁⁽¹⁾ + (Q₁⁽¹⁾)²(Q₁⁽²⁾)²(Q₁⁽³⁾)³ + 3*Q₁⁽²⁾
|
|
289
|
+
"""
|
|
290
|
+
from sage.typeset.unicode_art import UnicodeArt, unicode_subscript, unicode_superscript
|
|
291
|
+
if t == self.one_basis():
|
|
292
|
+
return UnicodeArt(["1"])
|
|
293
|
+
|
|
294
|
+
ret = UnicodeArt("")
|
|
295
|
+
for k, exp in t._sorted_items():
|
|
296
|
+
a,m = k
|
|
297
|
+
var = UnicodeArt(["Q" + unicode_subscript(m) + '⁽' + unicode_superscript(a) + '⁾'], baseline=0)
|
|
298
|
+
if exp > 1:
|
|
299
|
+
var = (UnicodeArt(['('], baseline=0) + var
|
|
300
|
+
+ UnicodeArt([')' + unicode_superscript(exp)], baseline=0))
|
|
301
|
+
ret += var
|
|
302
|
+
return ret
|
|
303
|
+
|
|
304
|
+
def cartan_type(self):
|
|
305
|
+
"""
|
|
306
|
+
Return the Cartan type of ``self``.
|
|
307
|
+
|
|
308
|
+
EXAMPLES::
|
|
309
|
+
|
|
310
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
311
|
+
sage: Q.cartan_type()
|
|
312
|
+
['A', 4]
|
|
313
|
+
|
|
314
|
+
sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
|
|
315
|
+
sage: Q.cartan_type()
|
|
316
|
+
['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1}
|
|
317
|
+
"""
|
|
318
|
+
return self._cartan_type
|
|
319
|
+
|
|
320
|
+
def index_set(self):
|
|
321
|
+
"""
|
|
322
|
+
Return the index set of ``self``.
|
|
323
|
+
|
|
324
|
+
EXAMPLES::
|
|
325
|
+
|
|
326
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
327
|
+
sage: Q.index_set()
|
|
328
|
+
(1, 2, 3, 4)
|
|
329
|
+
|
|
330
|
+
sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
|
|
331
|
+
sage: Q.index_set()
|
|
332
|
+
(1, 2)
|
|
333
|
+
"""
|
|
334
|
+
return self._cm.index_set()
|
|
335
|
+
|
|
336
|
+
def level(self):
|
|
337
|
+
"""
|
|
338
|
+
Return the restriction level of ``self`` or ``None`` if
|
|
339
|
+
the system is unrestricted.
|
|
340
|
+
|
|
341
|
+
EXAMPLES::
|
|
342
|
+
|
|
343
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
344
|
+
sage: Q.level()
|
|
345
|
+
|
|
346
|
+
sage: Q = QSystem(QQ, ['A',4], 5)
|
|
347
|
+
sage: Q.level()
|
|
348
|
+
5
|
|
349
|
+
"""
|
|
350
|
+
return self._level
|
|
351
|
+
|
|
352
|
+
@cached_method
|
|
353
|
+
def one_basis(self):
|
|
354
|
+
"""
|
|
355
|
+
Return the basis element indexing `1`.
|
|
356
|
+
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
360
|
+
sage: Q.one_basis()
|
|
361
|
+
1
|
|
362
|
+
sage: Q.one_basis().parent() is Q._indices
|
|
363
|
+
True
|
|
364
|
+
"""
|
|
365
|
+
return self._indices.one()
|
|
366
|
+
|
|
367
|
+
@cached_method
|
|
368
|
+
def algebra_generators(self):
|
|
369
|
+
"""
|
|
370
|
+
Return the algebra generators of ``self``.
|
|
371
|
+
|
|
372
|
+
EXAMPLES::
|
|
373
|
+
|
|
374
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
375
|
+
sage: Q.algebra_generators()
|
|
376
|
+
Finite family {1: Q^(1)[1], 2: Q^(2)[1], 3: Q^(3)[1], 4: Q^(4)[1]}
|
|
377
|
+
|
|
378
|
+
sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
|
|
379
|
+
sage: Q.algebra_generators()
|
|
380
|
+
Finite family {1: Q^(1)[1], 2: Q^(2)[1]}
|
|
381
|
+
"""
|
|
382
|
+
I = self._cm.index_set()
|
|
383
|
+
d = {a: self.Q(a, 1) for a in I}
|
|
384
|
+
return Family(I, d.__getitem__)
|
|
385
|
+
|
|
386
|
+
def gens(self) -> tuple:
|
|
387
|
+
"""
|
|
388
|
+
Return the generators of ``self``.
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: Q = QSystem(QQ, ['A',4])
|
|
393
|
+
sage: Q.gens()
|
|
394
|
+
(Q^(1)[1], Q^(2)[1], Q^(3)[1], Q^(4)[1])
|
|
395
|
+
"""
|
|
396
|
+
return tuple(self.algebra_generators())
|
|
397
|
+
|
|
398
|
+
def dimension(self):
|
|
399
|
+
r"""
|
|
400
|
+
Return the dimension of ``self``, which is `\infty`.
|
|
401
|
+
|
|
402
|
+
EXAMPLES::
|
|
403
|
+
|
|
404
|
+
sage: F = QSystem(QQ, ['A',4])
|
|
405
|
+
sage: F.dimension()
|
|
406
|
+
+Infinity
|
|
407
|
+
"""
|
|
408
|
+
return infinity
|
|
409
|
+
|
|
410
|
+
def Q(self, a, m):
|
|
411
|
+
r"""
|
|
412
|
+
Return the generator `Q^{(a)}_m` of ``self``.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: Q = QSystem(QQ, ['A', 8])
|
|
417
|
+
sage: Q.Q(2, 1)
|
|
418
|
+
Q^(2)[1]
|
|
419
|
+
sage: Q.Q(6, 2)
|
|
420
|
+
-Q^(5)[1]*Q^(7)[1] + Q^(6)[1]^2
|
|
421
|
+
sage: Q.Q(7, 3)
|
|
422
|
+
-Q^(5)[1]*Q^(7)[1] + Q^(5)[1]*Q^(8)[1]^2 + Q^(6)[1]^2
|
|
423
|
+
- 2*Q^(6)[1]*Q^(7)[1]*Q^(8)[1] + Q^(7)[1]^3
|
|
424
|
+
sage: Q.Q(1, 0)
|
|
425
|
+
1
|
|
426
|
+
|
|
427
|
+
Twisted Q-system::
|
|
428
|
+
|
|
429
|
+
sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
|
|
430
|
+
sage: Q.Q(1,2)
|
|
431
|
+
Q^(1)[1]^2 - Q^(2)[1]
|
|
432
|
+
sage: Q.Q(2,2)
|
|
433
|
+
-Q^(1)[1]^3 + Q^(2)[1]^2
|
|
434
|
+
sage: Q.Q(2,3)
|
|
435
|
+
3*Q^(1)[1]^4 - 2*Q^(1)[1]^3*Q^(2)[1] - 3*Q^(1)[1]^2*Q^(2)[1]
|
|
436
|
+
+ Q^(2)[1]^2 + Q^(2)[1]^3
|
|
437
|
+
sage: Q.Q(1,4)
|
|
438
|
+
-2*Q^(1)[1]^2 + 2*Q^(1)[1]^3 + Q^(1)[1]^4
|
|
439
|
+
- 3*Q^(1)[1]^2*Q^(2)[1] + Q^(2)[1] + Q^(2)[1]^2
|
|
440
|
+
"""
|
|
441
|
+
if a not in self._cartan_type.index_set():
|
|
442
|
+
raise ValueError("a is not in the index set")
|
|
443
|
+
if m == 0:
|
|
444
|
+
return self.one()
|
|
445
|
+
if self._level:
|
|
446
|
+
t = self._cartan_type.dual().cartan_matrix().symmetrizer()
|
|
447
|
+
if m == t[a] * self._level:
|
|
448
|
+
return self.one()
|
|
449
|
+
if m == 1:
|
|
450
|
+
return self.monomial(self._indices.gen((a,1)))
|
|
451
|
+
#if self._cartan_type.type() == 'A' and self._level is None:
|
|
452
|
+
# return self._jacobi_trudy(a, m)
|
|
453
|
+
I = self._cm.index_set()
|
|
454
|
+
p = self._Q_poly(a, m)
|
|
455
|
+
return p.subs({g: self.Q(I[i], 1) for i,g in enumerate(self._poly.gens())})
|
|
456
|
+
|
|
457
|
+
@cached_method
|
|
458
|
+
def _Q_poly(self, a, m):
|
|
459
|
+
r"""
|
|
460
|
+
Return the element `Q^{(a)}_m` as a polynomial.
|
|
461
|
+
|
|
462
|
+
We start with the relation
|
|
463
|
+
|
|
464
|
+
.. MATH::
|
|
465
|
+
|
|
466
|
+
(Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2} + \mathcal{Q}_{a,m-1},
|
|
467
|
+
|
|
468
|
+
which implies
|
|
469
|
+
|
|
470
|
+
.. MATH::
|
|
471
|
+
|
|
472
|
+
Q^{(a)}_m = \frac{Q^{(a)}_{m-1}^2 - \mathcal{Q}_{a,m-1}}{
|
|
473
|
+
Q^{(a)}_{m-2}}.
|
|
474
|
+
|
|
475
|
+
This becomes our relation used for reducing the Q-system to the
|
|
476
|
+
fundamental representations.
|
|
477
|
+
|
|
478
|
+
For twisted Q-systems, we use
|
|
479
|
+
|
|
480
|
+
.. MATH::
|
|
481
|
+
|
|
482
|
+
(Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2}
|
|
483
|
+
+ \prod_{b \neq a} (Q^{(b)}_{m-1})^{-A_{ba}}.
|
|
484
|
+
|
|
485
|
+
.. NOTE::
|
|
486
|
+
|
|
487
|
+
This helper method is defined in order to use the
|
|
488
|
+
division implemented in polynomial rings.
|
|
489
|
+
|
|
490
|
+
EXAMPLES::
|
|
491
|
+
|
|
492
|
+
sage: Q = QSystem(QQ, ['A',8])
|
|
493
|
+
sage: Q._Q_poly(1, 2)
|
|
494
|
+
q1^2 - q2
|
|
495
|
+
sage: Q._Q_poly(3, 2)
|
|
496
|
+
q3^2 - q2*q4
|
|
497
|
+
sage: Q._Q_poly(6, 3)
|
|
498
|
+
q6^3 - 2*q5*q6*q7 + q4*q7^2 + q5^2*q8 - q4*q6*q8
|
|
499
|
+
|
|
500
|
+
Twisted types::
|
|
501
|
+
|
|
502
|
+
sage: Q = QSystem(QQ, ['E',6,2], twisted=True)
|
|
503
|
+
sage: Q._Q_poly(1,2)
|
|
504
|
+
q1^2 - q2
|
|
505
|
+
sage: Q._Q_poly(2,2)
|
|
506
|
+
q2^2 - q1*q3
|
|
507
|
+
sage: Q._Q_poly(3,2)
|
|
508
|
+
-q2^2*q4 + q3^2
|
|
509
|
+
sage: Q._Q_poly(4,2)
|
|
510
|
+
q4^2 - q3
|
|
511
|
+
sage: Q._Q_poly(3,3)
|
|
512
|
+
2*q1*q2^2*q4^2 - q1^2*q3*q4^2 + q2^4 - 2*q1*q2^2*q3
|
|
513
|
+
+ q1^2*q3^2 - 2*q2^2*q3*q4 + q3^3
|
|
514
|
+
|
|
515
|
+
sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
|
|
516
|
+
sage: Q._Q_poly(1,2)
|
|
517
|
+
q1^2 - q2
|
|
518
|
+
sage: Q._Q_poly(2,2)
|
|
519
|
+
-q1^3 + q2^2
|
|
520
|
+
sage: Q._Q_poly(1,3)
|
|
521
|
+
q1^3 + q1^2 - 2*q1*q2
|
|
522
|
+
sage: Q._Q_poly(2,3)
|
|
523
|
+
3*q1^4 - 2*q1^3*q2 - 3*q1^2*q2 + q2^3 + q2^2
|
|
524
|
+
"""
|
|
525
|
+
if m == 0 or m == self._level:
|
|
526
|
+
return self._poly.one()
|
|
527
|
+
if m == 1:
|
|
528
|
+
return self._poly.gen(self._Irev[a])
|
|
529
|
+
|
|
530
|
+
cm = self._cm
|
|
531
|
+
m -= 1 # So we don't have to do it everywhere
|
|
532
|
+
|
|
533
|
+
cur = self._Q_poly(a, m) ** 2
|
|
534
|
+
if self._twisted:
|
|
535
|
+
ret = prod(self._Q_poly(b, m) ** -cm[self._Irev[b],self._Irev[a]]
|
|
536
|
+
for b in self._cm.dynkin_diagram().neighbors(a))
|
|
537
|
+
else:
|
|
538
|
+
ret = self._poly.one()
|
|
539
|
+
i = self._Irev[a]
|
|
540
|
+
for b in self._cm.dynkin_diagram().neighbors(a):
|
|
541
|
+
j = self._Irev[b]
|
|
542
|
+
for k in range(-cm[i,j]):
|
|
543
|
+
ret *= self._Q_poly(b, (m * cm[j,i] - k) // cm[i,j])
|
|
544
|
+
cur -= ret
|
|
545
|
+
if m > 1:
|
|
546
|
+
cur //= self._Q_poly(a, m-1)
|
|
547
|
+
return cur
|
|
548
|
+
|
|
549
|
+
class Element(CombinatorialFreeModule.Element):
|
|
550
|
+
"""
|
|
551
|
+
An element of a Q-system.
|
|
552
|
+
"""
|
|
553
|
+
def _mul_(self, x):
|
|
554
|
+
"""
|
|
555
|
+
Return the product of ``self`` and ``x``.
|
|
556
|
+
|
|
557
|
+
EXAMPLES::
|
|
558
|
+
|
|
559
|
+
sage: Q = QSystem(QQ, ['A',8])
|
|
560
|
+
sage: x = Q.Q(1, 2)
|
|
561
|
+
sage: y = Q.Q(3, 2)
|
|
562
|
+
sage: x * y
|
|
563
|
+
-Q^(1)[1]^2*Q^(2)[1]*Q^(4)[1] + Q^(1)[1]^2*Q^(3)[1]^2
|
|
564
|
+
+ Q^(2)[1]^2*Q^(4)[1] - Q^(2)[1]*Q^(3)[1]^2
|
|
565
|
+
"""
|
|
566
|
+
return self.parent().sum_of_terms((tl*tr, cl*cr)
|
|
567
|
+
for tl,cl in self for tr,cr in x)
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
def is_tamely_laced(ct):
|
|
571
|
+
r"""
|
|
572
|
+
Check if the Cartan type ``ct`` is tamely-laced.
|
|
573
|
+
|
|
574
|
+
A (symmetrizable) Cartan type with index set `I` is *tamely-laced*
|
|
575
|
+
if `A_{ij} < -1` implies `d_i = -A_{ji} = 1` for all `i,j \in I`,
|
|
576
|
+
where `(d_i)_{i \in I}` is the diagonal matrix symmetrizing the
|
|
577
|
+
Cartan matrix `(A_{ij})_{i,j \in I}`.
|
|
578
|
+
|
|
579
|
+
EXAMPLES::
|
|
580
|
+
|
|
581
|
+
sage: from sage.algebras.q_system import is_tamely_laced
|
|
582
|
+
sage: all(is_tamely_laced(ct)
|
|
583
|
+
....: for ct in CartanType.samples(crystallographic=True, finite=True))
|
|
584
|
+
True
|
|
585
|
+
sage: for ct in CartanType.samples(crystallographic=True, affine=True):
|
|
586
|
+
....: if not is_tamely_laced(ct):
|
|
587
|
+
....: print(ct)
|
|
588
|
+
['A', 1, 1]
|
|
589
|
+
['BC', 1, 2]
|
|
590
|
+
['BC', 5, 2]
|
|
591
|
+
['BC', 1, 2]^*
|
|
592
|
+
['BC', 5, 2]^*
|
|
593
|
+
sage: cm = CartanMatrix([[2,-1,0,0],[-3,2,-2,-2],[0,-1,2,-1],[0,-1,-1,2]])
|
|
594
|
+
sage: is_tamely_laced(cm)
|
|
595
|
+
True
|
|
596
|
+
"""
|
|
597
|
+
if ct.is_finite():
|
|
598
|
+
return True
|
|
599
|
+
|
|
600
|
+
if ct.is_affine():
|
|
601
|
+
return not (ct is CartanType(['A',1,1]) or
|
|
602
|
+
(ct.type() == 'BC' or ct.dual().type() == 'BC'))
|
|
603
|
+
|
|
604
|
+
cm = ct.cartan_matrix()
|
|
605
|
+
d = cm.symmetrizer()
|
|
606
|
+
I = ct.index_set()
|
|
607
|
+
return all(-cm[j,i] == 1 and d[i] == 1
|
|
608
|
+
for i in I for j in I if cm[i,j] < -1)
|