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,730 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
`\mathcal{B}(\infty)` crystals of tableaux in nonexceptional types and `G_2`
|
|
5
|
+
|
|
6
|
+
A tableau model for `\mathcal{B}(\infty)`. For more information, see
|
|
7
|
+
:class:`~sage.combinat.crystals.infinity_crystals.InfinityCrystalOfTableaux`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Ben Salisbury: initial version
|
|
12
|
+
- Travis Scrimshaw: initial version
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
#*****************************************************************************
|
|
16
|
+
# Copyright (C) 2013 Ben Salisbury <bsalisbury1 at gmail.com>
|
|
17
|
+
# Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
18
|
+
#
|
|
19
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
20
|
+
#
|
|
21
|
+
# This code is distributed in the hope that it will be useful,
|
|
22
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
23
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
24
|
+
# General Public License for more details.
|
|
25
|
+
#
|
|
26
|
+
# The full text of the GPL is available at:
|
|
27
|
+
#
|
|
28
|
+
# http://www.gnu.org/licenses/
|
|
29
|
+
#****************************************************************************
|
|
30
|
+
|
|
31
|
+
from sage.structure.parent import Parent
|
|
32
|
+
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
|
|
33
|
+
from sage.categories.highest_weight_crystals import HighestWeightCrystals
|
|
34
|
+
from sage.categories.crystals import Crystals
|
|
35
|
+
from sage.categories.supercrystals import SuperCrystals
|
|
36
|
+
from sage.categories.homset import Hom
|
|
37
|
+
from sage.misc.cachefunc import cached_method
|
|
38
|
+
from sage.misc.flatten import flatten
|
|
39
|
+
|
|
40
|
+
from sage.combinat.partition import Partition
|
|
41
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
42
|
+
from sage.combinat.crystals.letters import CrystalOfLetters
|
|
43
|
+
from sage.combinat.crystals.tensor_product import CrystalOfWords
|
|
44
|
+
from sage.combinat.crystals.tensor_product_element import (CrystalOfTableauxElement,
|
|
45
|
+
InfinityCrystalOfTableauxElement, InfinityCrystalOfTableauxElementTypeD,
|
|
46
|
+
InfinityQueerCrystalOfTableauxElement)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class InfinityCrystalOfTableaux(CrystalOfWords):
|
|
50
|
+
r"""
|
|
51
|
+
`\mathcal{B}(\infty)` crystal of tableaux.
|
|
52
|
+
|
|
53
|
+
A tableaux model `\mathcal{T}(\infty)` for the crystal
|
|
54
|
+
`\mathcal{B}(\infty)` is introduced by Hong and Lee in [HL2008]_. This model
|
|
55
|
+
is currently valid for types `A_n`, `B_n`, `C_n`, `D_n`, and `G_2`, and
|
|
56
|
+
builds on the tableaux model given by Kashiwara and Nakashima [KN1994]_ in
|
|
57
|
+
types `A_n`, `B_n`, `C_n`, and `D_n`, and by Kang and Misra [KM1994]_ in
|
|
58
|
+
type `G_2`.
|
|
59
|
+
|
|
60
|
+
.. NOTE::
|
|
61
|
+
|
|
62
|
+
We are using the English convention for our tableaux.
|
|
63
|
+
|
|
64
|
+
We say a tableau `T` is *marginally large* if:
|
|
65
|
+
|
|
66
|
+
- for each `1 \leq i \leq n`, the leftmost box in the `i`-th row
|
|
67
|
+
from the top in `T` is an `i`-box,
|
|
68
|
+
|
|
69
|
+
- for each `1 \leq i \leq n`, the number of `i`-boxes in the `i`-th row
|
|
70
|
+
from the top in `T` is greater than the total number of boxes in the
|
|
71
|
+
`(i+1)`-th row by exactly one.
|
|
72
|
+
|
|
73
|
+
We now will describe this tableaux model type-by-type.
|
|
74
|
+
|
|
75
|
+
.. rubric:: Type `A_n`
|
|
76
|
+
|
|
77
|
+
`\mathcal{T}(\infty)` is the set of marginally large semistandard
|
|
78
|
+
tableaux with exactly `n` rows over the alphabet `\{1 \prec 2 \prec
|
|
79
|
+
\cdots \prec n+1 \}`.
|
|
80
|
+
|
|
81
|
+
.. rubric:: Type `B_n`
|
|
82
|
+
|
|
83
|
+
`\mathcal{T}(\infty)` is the set of marginally large semistandard
|
|
84
|
+
tableaux with exactly `n` rows over the alphabet `\{1 \prec \cdots
|
|
85
|
+
\prec n \prec 0 \prec \overline{n} \prec \cdots \prec \overline{1} \}`
|
|
86
|
+
and subject to the following constraints:
|
|
87
|
+
|
|
88
|
+
- for each `1 \le i \le n`, the contents of the boxes in the
|
|
89
|
+
`i`-th row are `\preceq \overline{i}`,
|
|
90
|
+
|
|
91
|
+
- the entry `0` can appear at most once in a single row.
|
|
92
|
+
|
|
93
|
+
.. rubric:: Type `C_n`
|
|
94
|
+
|
|
95
|
+
`\mathcal{T}(\infty)` is the set of marginally large semistandard
|
|
96
|
+
tableaux with exactly `n` rows over the alphabet `\{1 \prec \cdots
|
|
97
|
+
\prec n \prec \overline{n} \prec \cdots \prec \overline{1} \}` and
|
|
98
|
+
for each `1 \leq i \leq n`, the contents of the boxes in the `i`-th
|
|
99
|
+
row are `\preceq \overline{i}`.
|
|
100
|
+
|
|
101
|
+
.. rubric:: Type `D_n`
|
|
102
|
+
|
|
103
|
+
`\mathcal{T}(\infty)` is the set of marginally large semistandard
|
|
104
|
+
tableaux with exactly `n-1` rows over the alphabet `\{1 \prec \cdots
|
|
105
|
+
\prec n, \overline{n} \prec \cdots \prec \overline{1} \}` and subject
|
|
106
|
+
to the following constraints:
|
|
107
|
+
|
|
108
|
+
- for each `1 \le i \le n`, the contents of the boxes in the `i`-th
|
|
109
|
+
row are `\preceq \overline{i}`,
|
|
110
|
+
|
|
111
|
+
- the entries `n` and `\overline{n}` may not appear simultaneously in
|
|
112
|
+
a single row.
|
|
113
|
+
|
|
114
|
+
.. rubric:: Type `G_2`
|
|
115
|
+
|
|
116
|
+
`\mathcal{T}(\infty)` is the set of marginally large semistandard
|
|
117
|
+
tableaux with exactly `2` rows over the ordered alphabet `\{1 \prec
|
|
118
|
+
2 \prec 3 \prec 0 \prec \overline{3} \prec \overline{2} \prec
|
|
119
|
+
\overline{1}\}` and subject to the following constraints:
|
|
120
|
+
|
|
121
|
+
- the contents of the boxes in the first row are `\preceq \overline{i}`,
|
|
122
|
+
|
|
123
|
+
- the contents of the boxes in the second row are `\preceq 3`,
|
|
124
|
+
|
|
125
|
+
- the entry `0` can appear at most once in the first row and not at
|
|
126
|
+
all in the second row.
|
|
127
|
+
|
|
128
|
+
In particular, the shape of the tableaux is not fixed in any instance of
|
|
129
|
+
`\mathcal{T}(\infty)`; the row lengths of a tableau can be arbitrarily long.
|
|
130
|
+
|
|
131
|
+
INPUT:
|
|
132
|
+
|
|
133
|
+
- ``cartan_type`` -- one of ``['A',n]``, ``['B',n]``, ``['C',n]``,
|
|
134
|
+
``['D',n]``, or ``['G',2]``, where ``n`` is a positive integer
|
|
135
|
+
|
|
136
|
+
EXAMPLES::
|
|
137
|
+
|
|
138
|
+
sage: B = crystals.infinity.Tableaux(['A',2])
|
|
139
|
+
sage: b = B.highest_weight_vector(); b.pp()
|
|
140
|
+
1 1
|
|
141
|
+
2
|
|
142
|
+
sage: b.f_string([2,1,1,2,2,2]).pp()
|
|
143
|
+
1 1 1 1 1 2 3
|
|
144
|
+
2 3 3 3
|
|
145
|
+
|
|
146
|
+
sage: B = crystals.infinity.Tableaux(['G',2])
|
|
147
|
+
sage: b = B(rows=[[1,1,1,1,1,2,3,3,0,-3,-1,-1,-1],[2,3,3,3]])
|
|
148
|
+
sage: b.e_string([2,1,1,1,1,1,1]).pp()
|
|
149
|
+
1 1 1 1 2 3 3 3 3 -2 -2 -2
|
|
150
|
+
2 3 3
|
|
151
|
+
sage: b.e_string([2,1,1,1,1,1,1,1])
|
|
152
|
+
|
|
153
|
+
We check that a few classical crystals embed into `\mathcal{T}(\infty)`::
|
|
154
|
+
|
|
155
|
+
sage: def crystal_test(B, C):
|
|
156
|
+
....: T = crystals.elementary.T(C.cartan_type(), C.module_generators[0].weight())
|
|
157
|
+
....: TP = crystals.TensorProduct(T, B)
|
|
158
|
+
....: mg = TP(T[0], B.module_generators[0])
|
|
159
|
+
....: g = {C.module_generators[0]: mg}
|
|
160
|
+
....: f = C.crystal_morphism(g, category=HighestWeightCrystals())
|
|
161
|
+
....: G = B.digraph(subset=[f(x) for x in C])
|
|
162
|
+
....: return G.is_isomorphic(C.digraph(), edge_labels=True)
|
|
163
|
+
sage: B = crystals.infinity.Tableaux(['A',2])
|
|
164
|
+
sage: C = crystals.Tableaux(['A',2], shape=[2,1])
|
|
165
|
+
sage: crystal_test(B, C)
|
|
166
|
+
True
|
|
167
|
+
sage: C = crystals.Tableaux(['A',2], shape=[6,2])
|
|
168
|
+
sage: crystal_test(B, C)
|
|
169
|
+
True
|
|
170
|
+
sage: B = crystals.infinity.Tableaux(['B',2])
|
|
171
|
+
sage: C = crystals.Tableaux(['B',2], shape=[3])
|
|
172
|
+
sage: crystal_test(B, C)
|
|
173
|
+
True
|
|
174
|
+
sage: C = crystals.Tableaux(['B',2], shape=[2,1])
|
|
175
|
+
sage: crystal_test(B, C)
|
|
176
|
+
True
|
|
177
|
+
sage: B = crystals.infinity.Tableaux(['C',3])
|
|
178
|
+
sage: C = crystals.Tableaux(['C',3], shape=[2,1])
|
|
179
|
+
sage: crystal_test(B, C)
|
|
180
|
+
True
|
|
181
|
+
sage: B = crystals.infinity.Tableaux(['D',4])
|
|
182
|
+
sage: C = crystals.Tableaux(['D',4], shape=[2])
|
|
183
|
+
sage: crystal_test(B, C)
|
|
184
|
+
True
|
|
185
|
+
sage: C = crystals.Tableaux(['D',4], shape=[1,1,1,1])
|
|
186
|
+
sage: crystal_test(B, C)
|
|
187
|
+
True
|
|
188
|
+
sage: B = crystals.infinity.Tableaux(['G',2])
|
|
189
|
+
sage: C = crystals.Tableaux(['G',2], shape=[3])
|
|
190
|
+
sage: crystal_test(B, C)
|
|
191
|
+
True
|
|
192
|
+
"""
|
|
193
|
+
@staticmethod
|
|
194
|
+
def __classcall_private__(cls, cartan_type):
|
|
195
|
+
"""
|
|
196
|
+
Normalize input to ensure a unique representation.
|
|
197
|
+
|
|
198
|
+
EXAMPLES::
|
|
199
|
+
|
|
200
|
+
sage: B = crystals.infinity.Tableaux(['A',4])
|
|
201
|
+
sage: B2 = crystals.infinity.Tableaux(CartanType(['A',4]))
|
|
202
|
+
sage: B is B2
|
|
203
|
+
True
|
|
204
|
+
"""
|
|
205
|
+
cartan_type = CartanType(cartan_type)
|
|
206
|
+
if cartan_type.type() == 'D':
|
|
207
|
+
return InfinityCrystalOfTableauxTypeD(cartan_type)
|
|
208
|
+
if cartan_type.type() == 'Q':
|
|
209
|
+
return DualInfinityQueerCrystalOfTableaux(cartan_type)
|
|
210
|
+
return super().__classcall__(cls, cartan_type)
|
|
211
|
+
|
|
212
|
+
def __init__(self, cartan_type):
|
|
213
|
+
"""
|
|
214
|
+
Initialize ``self``.
|
|
215
|
+
|
|
216
|
+
EXAMPLES::
|
|
217
|
+
|
|
218
|
+
sage: B = crystals.infinity.Tableaux(['A',2])
|
|
219
|
+
sage: TestSuite(B).run() # long time
|
|
220
|
+
"""
|
|
221
|
+
Parent.__init__(self, category=(HighestWeightCrystals(),
|
|
222
|
+
InfiniteEnumeratedSets()))
|
|
223
|
+
self._cartan_type = cartan_type
|
|
224
|
+
self.letters = CrystalOfLetters(cartan_type)
|
|
225
|
+
self.module_generators = (self.module_generator(),)
|
|
226
|
+
|
|
227
|
+
def _repr_(self):
|
|
228
|
+
"""
|
|
229
|
+
Return a string representation of ``self``.
|
|
230
|
+
|
|
231
|
+
EXAMPLES::
|
|
232
|
+
|
|
233
|
+
sage: B = crystals.infinity.Tableaux(['A',4]); B
|
|
234
|
+
The infinity crystal of tableaux of type ['A', 4]
|
|
235
|
+
"""
|
|
236
|
+
return "The infinity crystal of tableaux of type %s" % self._cartan_type
|
|
237
|
+
|
|
238
|
+
@cached_method
|
|
239
|
+
def module_generator(self):
|
|
240
|
+
r"""
|
|
241
|
+
Return the module generator (or highest weight element) of ``self``.
|
|
242
|
+
|
|
243
|
+
The module generator is the unique tableau of shape `(n, n-1, \ldots,
|
|
244
|
+
2, 1)` with weight `0`.
|
|
245
|
+
|
|
246
|
+
EXAMPLES::
|
|
247
|
+
|
|
248
|
+
sage: T = crystals.infinity.Tableaux(['A',3])
|
|
249
|
+
sage: T.module_generator()
|
|
250
|
+
[[1, 1, 1], [2, 2], [3]]
|
|
251
|
+
"""
|
|
252
|
+
n = self._cartan_type.rank()
|
|
253
|
+
p = Partition(list(reversed(range(1, n + 1))))
|
|
254
|
+
# The column canonical tableau, read by columns
|
|
255
|
+
module_generator = flatten([[p[j]-i for i in range(p[j])] for j in range(n)])
|
|
256
|
+
return self(list=[self.letters(x) for x in module_generator])
|
|
257
|
+
|
|
258
|
+
def _element_constructor_(self, *args, **options):
|
|
259
|
+
"""
|
|
260
|
+
Construct an element of ``self`` from the input data.
|
|
261
|
+
|
|
262
|
+
EXAMPLES::
|
|
263
|
+
|
|
264
|
+
sage: T = crystals.Tableaux(['A',3], shape = [2,2])
|
|
265
|
+
sage: T(rows=[[1,2],[3,4]])
|
|
266
|
+
[[1, 2], [3, 4]]
|
|
267
|
+
sage: T(columns=[[3,1],[4,2]])
|
|
268
|
+
[[1, 2], [3, 4]]
|
|
269
|
+
"""
|
|
270
|
+
return self.element_class(self, *args, **options)
|
|
271
|
+
|
|
272
|
+
def _coerce_map_from_(self, P):
|
|
273
|
+
"""
|
|
274
|
+
Return ``True`` or the coerce map from ``P`` if a map exists.
|
|
275
|
+
|
|
276
|
+
EXAMPLES::
|
|
277
|
+
|
|
278
|
+
sage: T = crystals.infinity.Tableaux(['A',3])
|
|
279
|
+
sage: RC = crystals.infinity.RiggedConfigurations(['A',3])
|
|
280
|
+
sage: T._coerce_map_from_(RC)
|
|
281
|
+
Crystal Isomorphism morphism:
|
|
282
|
+
From: The infinity crystal of rigged configurations of type ['A', 3]
|
|
283
|
+
To: The infinity crystal of tableaux of type ['A', 3]
|
|
284
|
+
"""
|
|
285
|
+
from sage.combinat.rigged_configurations.rc_infinity import (InfinityCrystalOfRiggedConfigurations,
|
|
286
|
+
InfinityCrystalOfNonSimplyLacedRC)
|
|
287
|
+
if (isinstance(P, InfinityCrystalOfRiggedConfigurations)
|
|
288
|
+
and (self.cartan_type().is_simply_laced()
|
|
289
|
+
or isinstance(P, InfinityCrystalOfNonSimplyLacedRC))):
|
|
290
|
+
from sage.combinat.rigged_configurations.bij_infinity import FromRCIsomorphism
|
|
291
|
+
return FromRCIsomorphism(Hom(P, self))
|
|
292
|
+
return super()._coerce_map_from_(P)
|
|
293
|
+
|
|
294
|
+
class Element(InfinityCrystalOfTableauxElement):
|
|
295
|
+
r"""
|
|
296
|
+
Elements in `\mathcal{B}(\infty)` crystal of tableaux.
|
|
297
|
+
"""
|
|
298
|
+
|
|
299
|
+
def phi(self, i):
|
|
300
|
+
r"""
|
|
301
|
+
Return `\varphi_i` of ``self``.
|
|
302
|
+
|
|
303
|
+
Let `T \in \mathcal{B}(\infty)` Define `\varphi_i(T) :=
|
|
304
|
+
\varepsilon_i(T) + \langle h_i, \mathrm{wt}(T) \rangle`, where `h_i`
|
|
305
|
+
is the `i`-th simple coroot and `\mathrm{wt}(T)` is the :meth:`weight`
|
|
306
|
+
of `T`.
|
|
307
|
+
|
|
308
|
+
INPUT:
|
|
309
|
+
|
|
310
|
+
- ``i`` -- an element of the index set
|
|
311
|
+
|
|
312
|
+
EXAMPLES::
|
|
313
|
+
|
|
314
|
+
sage: B = crystals.infinity.Tableaux("A3")
|
|
315
|
+
sage: [B.highest_weight_vector().f_string([1,3,2,3,1,3,2,1]).phi(i) for i in B.index_set()]
|
|
316
|
+
[-3, 4, -3]
|
|
317
|
+
|
|
318
|
+
sage: B = crystals.infinity.Tableaux("G2")
|
|
319
|
+
sage: [B.highest_weight_vector().f_string([2,2,1,2,1,1,1,2]).phi(i) for i in B.index_set()]
|
|
320
|
+
[5, -3]
|
|
321
|
+
"""
|
|
322
|
+
P = self.parent().weight_lattice_realization()
|
|
323
|
+
h = P.simple_coroots()
|
|
324
|
+
return self.epsilon(i) + P(self.weight()).scalar(h[i])
|
|
325
|
+
|
|
326
|
+
@cached_method
|
|
327
|
+
def weight(self):
|
|
328
|
+
r"""
|
|
329
|
+
Return the weight of ``self``.
|
|
330
|
+
|
|
331
|
+
From the definition of a crystal and that the highest weight
|
|
332
|
+
element `b_{\infty}` of `\mathcal{B}(\infty)` is `0`, the weight of
|
|
333
|
+
`T \in \mathcal{B}(\infty)` can be defined as `\mathrm{wt}(T)
|
|
334
|
+
:= -\sum_j \alpha_{i_j}` where `\widetilde{e}_{i_1} \cdots
|
|
335
|
+
\widetilde{e}_{i_{\ell}} T = b_{\infty}` and `\{\alpha_i\}` is the
|
|
336
|
+
set of simple roots. (Note that the weight is independent of the
|
|
337
|
+
path chosen to get to the highest weight.)
|
|
338
|
+
|
|
339
|
+
However we can also take advantage of the fact that
|
|
340
|
+
`\rho \colon R_{\lambda} \otimes \mathcal{B}(\infty) \longrightarrow
|
|
341
|
+
B(\lambda)`, where `\lambda` is the shape of `T`, preserves the
|
|
342
|
+
tableau representation of `T`. Therefore
|
|
343
|
+
|
|
344
|
+
.. MATH::
|
|
345
|
+
|
|
346
|
+
\mathrm{wt}(T) = \mathrm{wt}\bigl( \rho(T) \bigr) - \lambda
|
|
347
|
+
|
|
348
|
+
where `\mathrm{wt}\bigl( \rho(T) \bigr)` is just the usual weight of
|
|
349
|
+
the tableau `T`.
|
|
350
|
+
|
|
351
|
+
Let `\Lambda_i` be the `i`-th fundamental weight. In type `D`, the
|
|
352
|
+
height `n-1` columns corresponds to `\Lambda_{n-1} + \Lambda_n` and
|
|
353
|
+
the in type `B`, the height `n` columns corresponds to
|
|
354
|
+
`2 \Lambda_n`.
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: B = crystals.infinity.Tableaux("C7")
|
|
359
|
+
sage: b = B.highest_weight_vector().f_string([1,6,4,7,4,2,4,6,2,4,6,7,1,2,4,7])
|
|
360
|
+
sage: b.weight()
|
|
361
|
+
(-2, -1, 3, -5, 5, -3, -3)
|
|
362
|
+
|
|
363
|
+
Check that the definitions agree::
|
|
364
|
+
|
|
365
|
+
sage: P = B.weight_lattice_realization()
|
|
366
|
+
sage: alpha = P.simple_roots()
|
|
367
|
+
sage: b.weight() == -2*alpha[1] - 3*alpha[2] - 5*alpha[4] - 3*alpha[6] - 3*alpha[7]
|
|
368
|
+
True
|
|
369
|
+
|
|
370
|
+
Check that it works for type `B`::
|
|
371
|
+
|
|
372
|
+
sage: B = crystals.infinity.Tableaux("B2")
|
|
373
|
+
sage: B.highest_weight_vector().weight()
|
|
374
|
+
(0, 0)
|
|
375
|
+
sage: b = B.highest_weight_vector().f_string([1,2,2,2,1,2])
|
|
376
|
+
sage: P = B.weight_lattice_realization()
|
|
377
|
+
sage: alpha = P.simple_roots()
|
|
378
|
+
sage: b.weight() == -2*alpha[1] - 4*alpha[2]
|
|
379
|
+
True
|
|
380
|
+
|
|
381
|
+
Check that it works for type `D`::
|
|
382
|
+
|
|
383
|
+
sage: B = crystals.infinity.Tableaux("D4")
|
|
384
|
+
sage: B.highest_weight_vector().weight()
|
|
385
|
+
(0, 0, 0, 0)
|
|
386
|
+
sage: b = B.highest_weight_vector().f_string([1,4,4,2,4,3,2,4,1,3,2,4])
|
|
387
|
+
sage: P = B.weight_lattice_realization()
|
|
388
|
+
sage: alpha = P.simple_roots()
|
|
389
|
+
sage: b.weight() == -2*alpha[1] - 3*alpha[2] - 2*alpha[3] - 5*alpha[4]
|
|
390
|
+
True
|
|
391
|
+
"""
|
|
392
|
+
P = self.parent().weight_lattice_realization()
|
|
393
|
+
La = P.fundamental_weights()
|
|
394
|
+
cur_col_len = 1
|
|
395
|
+
shape_wt = P.zero()
|
|
396
|
+
n = self.cartan_type().rank()
|
|
397
|
+
ty = self.cartan_type().type()
|
|
398
|
+
for i in range(1, len(self)):
|
|
399
|
+
if self[i-1] < self[i] or (self[i-1].value != 0 and self[i-1] == self[i]):
|
|
400
|
+
if (cur_col_len == n - 1 and ty == 'D') or \
|
|
401
|
+
(cur_col_len == n and ty == 'B'):
|
|
402
|
+
shape_wt += La[n]
|
|
403
|
+
shape_wt += La[cur_col_len]
|
|
404
|
+
cur_col_len = 1
|
|
405
|
+
else:
|
|
406
|
+
cur_col_len += 1
|
|
407
|
+
shape_wt += La[1]
|
|
408
|
+
# Since we miss the last column (which is always height 1)
|
|
409
|
+
return CrystalOfTableauxElement.weight(self) - shape_wt
|
|
410
|
+
|
|
411
|
+
def reduced_form(self):
|
|
412
|
+
r"""
|
|
413
|
+
Return the reduced form of ``self``.
|
|
414
|
+
|
|
415
|
+
The reduced form of a tableaux `T \in \mathcal{T}(\infty)` is the
|
|
416
|
+
(not necessarily semistandard) tableaux obtained from `T` by
|
|
417
|
+
removing all `i`-boxes in the `i`-th row, subject to the condition
|
|
418
|
+
that if the row is empty, a `\ast` is put as a placeholder.
|
|
419
|
+
This is described in [BN2010]_ and [LS2012]_.
|
|
420
|
+
|
|
421
|
+
EXAMPLES::
|
|
422
|
+
|
|
423
|
+
sage: B = crystals.infinity.Tableaux(['A',3])
|
|
424
|
+
sage: b = B.highest_weight_vector().f_string([2,2,2,3,3,3,3,3])
|
|
425
|
+
sage: b.pp()
|
|
426
|
+
1 1 1 1 1 1 1 1
|
|
427
|
+
2 2 2 2 4 4 4
|
|
428
|
+
3 4 4
|
|
429
|
+
sage: b.reduced_form()
|
|
430
|
+
[['*'], [4, 4, 4], [4, 4]]
|
|
431
|
+
"""
|
|
432
|
+
oldtab = self.to_tableau()
|
|
433
|
+
newtab = []
|
|
434
|
+
for i, row in enumerate(oldtab):
|
|
435
|
+
j = 0
|
|
436
|
+
row = list(row)
|
|
437
|
+
while j < len(row):
|
|
438
|
+
if row[j] == i+1:
|
|
439
|
+
row.pop(j)
|
|
440
|
+
if not row:
|
|
441
|
+
row.append('*')
|
|
442
|
+
else:
|
|
443
|
+
j += 1
|
|
444
|
+
newtab.append(row)
|
|
445
|
+
from sage.misc.stopgap import stopgap
|
|
446
|
+
stopgap("Return value is no longer a Tableau.", 17997)
|
|
447
|
+
return newtab
|
|
448
|
+
|
|
449
|
+
def seg(self):
|
|
450
|
+
r"""
|
|
451
|
+
Return the statistic `\mathrm{seg}` of ``self``.
|
|
452
|
+
|
|
453
|
+
More precisely, following [LS2012]_, define a `k`-segment of a
|
|
454
|
+
tableau `T` in `\mathcal{B}(\infty)` to be a maximal string
|
|
455
|
+
of `k`-boxes in a single row of `T`. Set `\mathrm{seg}^{\prime}(T)`
|
|
456
|
+
to be the number of `k`-segments in `T`, as `k` varies over
|
|
457
|
+
all possible values. Then `\mathrm{seg}(T)` is determined
|
|
458
|
+
type-by-type.
|
|
459
|
+
|
|
460
|
+
- In types `A_n` and `C_n`, define `\mathrm{seg}(T) :=
|
|
461
|
+
\mathrm{seg}^{\prime}(T)`.
|
|
462
|
+
|
|
463
|
+
- In types `B_n` and `G_2`, set `e(T)` to be the number of rows in
|
|
464
|
+
`T` which contain both a `0`-box and an `\overline{\imath}`-box.
|
|
465
|
+
Define `\mathrm{seg}(T) := \mathrm{seg}^{\prime}(T) - e(T)`.
|
|
466
|
+
|
|
467
|
+
- In type `D_n`, set `d(T)` to be the number of rows in `T` which
|
|
468
|
+
contain an `\overline{\imath}`-box, but no `n`-box nor
|
|
469
|
+
`\overline{n}`-box. Define `\mathrm{seg}(T) :=
|
|
470
|
+
\mathrm{seg}^{\prime}(T) + d(T)`.
|
|
471
|
+
|
|
472
|
+
EXAMPLES::
|
|
473
|
+
|
|
474
|
+
sage: B = crystals.infinity.Tableaux(['A',3])
|
|
475
|
+
sage: b = B.highest_weight_vector().f_string([1,3,2,2,3,1,1,3])
|
|
476
|
+
sage: b.pp()
|
|
477
|
+
1 1 1 1 1 1 2 2 4
|
|
478
|
+
2 2 2 2 3
|
|
479
|
+
3 4 4
|
|
480
|
+
sage: b.seg()
|
|
481
|
+
4
|
|
482
|
+
|
|
483
|
+
sage: B = crystals.infinity.Tableaux(['D',4])
|
|
484
|
+
sage: b = B(rows=[[1,1,1,1,1,1,3,-2,-1],[2,2,2,4,-2],[3,3],[4]])
|
|
485
|
+
sage: b.pp()
|
|
486
|
+
1 1 1 1 1 1 3 -2 -1
|
|
487
|
+
2 2 2 4 -2
|
|
488
|
+
3 3
|
|
489
|
+
4
|
|
490
|
+
sage: b.seg()
|
|
491
|
+
6
|
|
492
|
+
|
|
493
|
+
sage: B = crystals.infinity.Tableaux(['G',2])
|
|
494
|
+
sage: b = B.highest_weight_vector().f_string([2,1,1,1,2,1,2,2,1,2,2,2,1,2,2,1])
|
|
495
|
+
sage: b.pp()
|
|
496
|
+
1 1 1 1 1 1 1 1 2 3 0 -3
|
|
497
|
+
2 3 3 3 3 3 3
|
|
498
|
+
sage: b.seg()
|
|
499
|
+
5
|
|
500
|
+
"""
|
|
501
|
+
tab = self.to_tableau()
|
|
502
|
+
segments = []
|
|
503
|
+
for r in range(len(tab)):
|
|
504
|
+
for c in range(len(tab[r])):
|
|
505
|
+
if tab[r][c] != r+1:
|
|
506
|
+
if [r,tab[r][c]] not in segments:
|
|
507
|
+
segments.append([r,tab[r][c]])
|
|
508
|
+
if self.parent().cartan_type().type() == 'B':
|
|
509
|
+
for r in range(len(tab)):
|
|
510
|
+
for c in range(len(tab[r])):
|
|
511
|
+
if tab[r][c] == 0 and tab[r][-1] == -r-1:
|
|
512
|
+
segments.remove([r,tab[r][c]])
|
|
513
|
+
if self.parent().cartan_type().type() == 'D':
|
|
514
|
+
n = self.parent().cartan_type().rank()
|
|
515
|
+
add = []
|
|
516
|
+
for r in range(len(tab)):
|
|
517
|
+
if tab[r][-1] == -1*(r+1):
|
|
518
|
+
for c in range(len(tab[r])):
|
|
519
|
+
if tab[r][c] != n and tab[r][c] != -n:
|
|
520
|
+
if [r,n] not in add:
|
|
521
|
+
add.append([r,n])
|
|
522
|
+
if len(add) > 0:
|
|
523
|
+
segments.append([r,n])
|
|
524
|
+
if self.parent().cartan_type().type() == 'G':
|
|
525
|
+
for c in range(len(tab[0])):
|
|
526
|
+
if tab[0][c] == 0 and tab[0][-1] == -1:
|
|
527
|
+
segments.remove([0,tab[0][c]])
|
|
528
|
+
return len(segments)
|
|
529
|
+
|
|
530
|
+
def content(self):
|
|
531
|
+
r"""
|
|
532
|
+
Return the content of ``self``.
|
|
533
|
+
|
|
534
|
+
The content `|T|` of `T \in \mathcal{B}(\infty)` is the number of
|
|
535
|
+
blocks added to the highest weight to obtain `T` with any
|
|
536
|
+
`\overline{\imath}`-boxes in the `i`-th row counted with
|
|
537
|
+
multiplicity `2` provided the underlying Cartan type is of type
|
|
538
|
+
`B`, `D`, or `G`.
|
|
539
|
+
|
|
540
|
+
EXAMPLES::
|
|
541
|
+
|
|
542
|
+
sage: B = crystals.infinity.Tableaux("D5")
|
|
543
|
+
sage: b = B.highest_weight_vector().f_string([5,4,3,1,1,3,4,5,3,4,5,1,4,5,2,3,5,3,2,4])
|
|
544
|
+
sage: b.content()
|
|
545
|
+
13
|
|
546
|
+
|
|
547
|
+
sage: B = crystals.infinity.Tableaux("B2")
|
|
548
|
+
sage: b = B(rows=[[1,1,1,1,1,1,2,2,2,-2,-2],[2,0,-2,-2,-2]])
|
|
549
|
+
sage: b.content()
|
|
550
|
+
12
|
|
551
|
+
|
|
552
|
+
sage: B = crystals.infinity.Tableaux("C2")
|
|
553
|
+
sage: b = B(rows=[[1,1,1,1,1,1,2,2,2,-2,-2],[2,-2,-2,-2]])
|
|
554
|
+
sage: b.content()
|
|
555
|
+
8
|
|
556
|
+
"""
|
|
557
|
+
tab = self.to_tableau()
|
|
558
|
+
count = 0
|
|
559
|
+
ct = self.parent().cartan_type().type()
|
|
560
|
+
for i,row in enumerate(tab):
|
|
561
|
+
for entry in row:
|
|
562
|
+
if entry == -i-1 and ct in ('B', 'D', 'G'):
|
|
563
|
+
count += 2
|
|
564
|
+
elif entry != i+1:
|
|
565
|
+
count += 1
|
|
566
|
+
return count
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
class InfinityCrystalOfTableauxTypeD(InfinityCrystalOfTableaux):
|
|
570
|
+
r"""
|
|
571
|
+
`\mathcal{B}(\infty)` crystal of tableaux for type `D_n`.
|
|
572
|
+
|
|
573
|
+
This is the set `\mathcal{T}(\infty)` of marginally large semistandard
|
|
574
|
+
tableaux with exactly `n-1` rows over the alphabet `\{1 \prec \cdots
|
|
575
|
+
\prec n, \overline{n} \prec \cdots \prec \overline{1} \}` and subject
|
|
576
|
+
to the following constraints:
|
|
577
|
+
|
|
578
|
+
- for each `1 \le i \le n`, the contents of the boxes in the `i`-th
|
|
579
|
+
row are `\preceq \overline{i}`,
|
|
580
|
+
|
|
581
|
+
- the entries `n` and `\overline{n}` may not appear simultaneously in
|
|
582
|
+
a single row.
|
|
583
|
+
|
|
584
|
+
For more information, see
|
|
585
|
+
:class:`~sage.combinat.crystals.infinity_crystals.InfinityCrystalOfTableaux`.
|
|
586
|
+
|
|
587
|
+
EXAMPLES::
|
|
588
|
+
|
|
589
|
+
sage: B = crystals.infinity.Tableaux("D4")
|
|
590
|
+
sage: b = B.highest_weight_vector().f_string([4,3,2,1,4])
|
|
591
|
+
sage: b.pp()
|
|
592
|
+
1 1 1 1 1 1 2
|
|
593
|
+
2 2 2 2 3
|
|
594
|
+
3 -4 -3
|
|
595
|
+
sage: b.weight()
|
|
596
|
+
(-1, 0, -2, -1)
|
|
597
|
+
"""
|
|
598
|
+
@staticmethod
|
|
599
|
+
def __classcall_private__(cls, cartan_type):
|
|
600
|
+
"""
|
|
601
|
+
Normalize input to ensure a unique representation.
|
|
602
|
+
|
|
603
|
+
EXAMPLES::
|
|
604
|
+
|
|
605
|
+
sage: B = crystals.infinity.Tableaux(['D',4])
|
|
606
|
+
sage: B2 = crystals.infinity.Tableaux(CartanType(['D',4]))
|
|
607
|
+
sage: B is B2
|
|
608
|
+
True
|
|
609
|
+
"""
|
|
610
|
+
return super().__classcall__(cls, CartanType(cartan_type))
|
|
611
|
+
|
|
612
|
+
@cached_method
|
|
613
|
+
def module_generator(self):
|
|
614
|
+
r"""
|
|
615
|
+
Return the module generator (or highest weight element) of ``self``.
|
|
616
|
+
|
|
617
|
+
The module generator is the unique tableau of shape `(n-1, \ldots, 2,
|
|
618
|
+
1)` with weight `0`.
|
|
619
|
+
|
|
620
|
+
EXAMPLES::
|
|
621
|
+
|
|
622
|
+
sage: T = crystals.infinity.Tableaux(['D',4])
|
|
623
|
+
sage: T.module_generator()
|
|
624
|
+
[[1, 1, 1], [2, 2], [3]]
|
|
625
|
+
"""
|
|
626
|
+
n = self._cartan_type.rank()
|
|
627
|
+
p = Partition(list(reversed(range(1, n))))
|
|
628
|
+
# The column canonical tableau, read by columns
|
|
629
|
+
module_generator = flatten([[p[j]-i for i in range(p[j])] for j in range(n-1)])
|
|
630
|
+
return self(list=[self.letters(x) for x in module_generator])
|
|
631
|
+
|
|
632
|
+
class Element(InfinityCrystalOfTableauxElementTypeD, InfinityCrystalOfTableaux.Element):
|
|
633
|
+
r"""
|
|
634
|
+
Elements in `\mathcal{B}(\infty)` crystal of tableaux for type `D_n`.
|
|
635
|
+
"""
|
|
636
|
+
pass
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
#########################################################
|
|
640
|
+
## Queer superalgebra
|
|
641
|
+
|
|
642
|
+
class DualInfinityQueerCrystalOfTableaux(CrystalOfWords):
|
|
643
|
+
@staticmethod
|
|
644
|
+
def __classcall_private__(cls, cartan_type):
|
|
645
|
+
"""
|
|
646
|
+
Normalize input to ensure a unique representation.
|
|
647
|
+
|
|
648
|
+
EXAMPLES::
|
|
649
|
+
|
|
650
|
+
sage: B = crystals.infinity.Tableaux(['A',4])
|
|
651
|
+
sage: B2 = crystals.infinity.Tableaux(CartanType(['A',4]))
|
|
652
|
+
sage: B is B2
|
|
653
|
+
True
|
|
654
|
+
"""
|
|
655
|
+
cartan_type = CartanType(cartan_type)
|
|
656
|
+
return super().__classcall__(cls, cartan_type)
|
|
657
|
+
|
|
658
|
+
def __init__(self, cartan_type):
|
|
659
|
+
"""
|
|
660
|
+
Initialize ``self``.
|
|
661
|
+
|
|
662
|
+
EXAMPLES::
|
|
663
|
+
|
|
664
|
+
sage: B = crystals.infinity.Tableaux(['A',2])
|
|
665
|
+
sage: TestSuite(B).run() # long time
|
|
666
|
+
"""
|
|
667
|
+
Parent.__init__(self, category=(SuperCrystals(), InfiniteEnumeratedSets()))
|
|
668
|
+
self._cartan_type = cartan_type
|
|
669
|
+
self.letters = CrystalOfLetters(cartan_type)
|
|
670
|
+
self.module_generators = (self.module_generator(),)
|
|
671
|
+
|
|
672
|
+
def _repr_(self):
|
|
673
|
+
"""
|
|
674
|
+
Return a string representation of ``self``.
|
|
675
|
+
|
|
676
|
+
EXAMPLES::
|
|
677
|
+
|
|
678
|
+
sage: B = crystals.infinity.Tableaux(['A',4]); B
|
|
679
|
+
The infinity crystal of tableaux of type ['A', 4]
|
|
680
|
+
"""
|
|
681
|
+
return "The dual infinity crystal of tableaux of type %s" % self._cartan_type
|
|
682
|
+
|
|
683
|
+
@cached_method
|
|
684
|
+
def module_generator(self):
|
|
685
|
+
r"""
|
|
686
|
+
Return the module generator (or highest weight element) of ``self``.
|
|
687
|
+
|
|
688
|
+
The module generator is the unique semistandard hook tableau of shape
|
|
689
|
+
`(n, n-1, \ldots,2, 1)` with weight `0`.
|
|
690
|
+
|
|
691
|
+
EXAMPLES::
|
|
692
|
+
|
|
693
|
+
sage: B = crystals.infinity.Tableaux(["Q",5])
|
|
694
|
+
sage: B.module_generator()
|
|
695
|
+
[[5, 5, 5, 5, 5], [4, 4, 4, 4], [3, 3, 3], [2, 2], [1]]
|
|
696
|
+
"""
|
|
697
|
+
n = self._cartan_type.rank() + 1
|
|
698
|
+
row_lens = list(reversed(range(1, n+1)))
|
|
699
|
+
module_generator = flatten([[val]*val for val in row_lens])
|
|
700
|
+
return self.element_class(self, [self.letters(x) for x in module_generator], row_lens)
|
|
701
|
+
|
|
702
|
+
@cached_method
|
|
703
|
+
def index_set(self):
|
|
704
|
+
r"""
|
|
705
|
+
Return the index set of ``self``.
|
|
706
|
+
|
|
707
|
+
EXAMPLES::
|
|
708
|
+
|
|
709
|
+
sage: B = crystals.infinity.Tableaux(["Q",3])
|
|
710
|
+
sage: B.index_set()
|
|
711
|
+
(1, 2, -1)
|
|
712
|
+
"""
|
|
713
|
+
n = self._cartan_type.rank()
|
|
714
|
+
return tuple(range(1, n+1)) + (-1,)
|
|
715
|
+
|
|
716
|
+
def _element_constructor_(self, *args, **options):
|
|
717
|
+
"""
|
|
718
|
+
Construct an element of ``self`` from the input data.
|
|
719
|
+
|
|
720
|
+
EXAMPLES::
|
|
721
|
+
|
|
722
|
+
sage: B = crystals.infinity.Tableaux(["Q",4])
|
|
723
|
+
sage: t = B([[4,4,4,4,2,1],[3,3,3],[2,2],[1]])
|
|
724
|
+
sage: t
|
|
725
|
+
[[4, 4, 4, 4, 2, 1], [3, 3, 3], [2, 2], [1]]
|
|
726
|
+
"""
|
|
727
|
+
return self.element_class(self, *args, **options)
|
|
728
|
+
|
|
729
|
+
class Element(InfinityQueerCrystalOfTableauxElement):
|
|
730
|
+
pass
|