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,771 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Bijection classes for type `D_n^{(1)}`
|
|
5
|
+
|
|
6
|
+
Part of the (internal) classes which runs the bijection between rigged
|
|
7
|
+
configurations and KR tableaux of type `D_n^{(1)}`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2011-04-15): Initial version
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
|
|
16
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
17
|
+
sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[3, 2]]))
|
|
18
|
+
sage: TestSuite(bijection).run()
|
|
19
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
|
|
20
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
21
|
+
sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[]]))
|
|
22
|
+
sage: TestSuite(bijection).run()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
# Copyright (C) 2011, 2012 Travis Scrimshaw <tscrim@ucdavis.edu>
|
|
27
|
+
#
|
|
28
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
29
|
+
#
|
|
30
|
+
# This code is distributed in the hope that it will be useful,
|
|
31
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
32
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
33
|
+
# General Public License for more details.
|
|
34
|
+
#
|
|
35
|
+
# The full text of the GPL is available at:
|
|
36
|
+
#
|
|
37
|
+
# https://www.gnu.org/licenses/
|
|
38
|
+
# ****************************************************************************
|
|
39
|
+
|
|
40
|
+
from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
41
|
+
from sage.combinat.rigged_configurations.bij_type_A import RCToKRTBijectionTypeA
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class KRTToRCBijectionTypeD(KRTToRCBijectionTypeA):
|
|
45
|
+
r"""
|
|
46
|
+
Specific implementation of the bijection from KR tableaux to rigged
|
|
47
|
+
configurations for type `D_n^{(1)}`.
|
|
48
|
+
|
|
49
|
+
This inherits from type `A_n^{(1)}` because we use the same methods in
|
|
50
|
+
some places.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def run(self, verbose=False):
|
|
54
|
+
"""
|
|
55
|
+
Run the bijection from a tensor product of KR tableaux to a rigged
|
|
56
|
+
configuration for type `D_n^{(1)}`.
|
|
57
|
+
|
|
58
|
+
INPUT:
|
|
59
|
+
|
|
60
|
+
- ``tp_krt`` -- a tensor product of KR tableaux
|
|
61
|
+
|
|
62
|
+
- ``verbose`` -- (default: ``False``) display each step in the
|
|
63
|
+
bijection
|
|
64
|
+
|
|
65
|
+
EXAMPLES::
|
|
66
|
+
|
|
67
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
|
|
68
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
69
|
+
sage: KRTToRCBijectionTypeD(KRT(pathlist=[[-3,2]])).run()
|
|
70
|
+
<BLANKLINE>
|
|
71
|
+
-1[ ]-1
|
|
72
|
+
<BLANKLINE>
|
|
73
|
+
2[ ]2
|
|
74
|
+
<BLANKLINE>
|
|
75
|
+
-1[ ]-1
|
|
76
|
+
<BLANKLINE>
|
|
77
|
+
-1[ ]-1
|
|
78
|
+
<BLANKLINE>
|
|
79
|
+
"""
|
|
80
|
+
if verbose:
|
|
81
|
+
from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \
|
|
82
|
+
import TensorProductOfKirillovReshetikhinTableauxElement
|
|
83
|
+
|
|
84
|
+
for cur_crystal in reversed(self.tp_krt):
|
|
85
|
+
r = cur_crystal.parent().r()
|
|
86
|
+
# Iterate through the columns
|
|
87
|
+
for col_number, cur_column in enumerate(reversed(cur_crystal.to_array(False))):
|
|
88
|
+
self.cur_path.insert(0, []) # Prepend an empty list
|
|
89
|
+
|
|
90
|
+
# Check to see if we are a spinor column
|
|
91
|
+
if r >= self.n-1:
|
|
92
|
+
if verbose:
|
|
93
|
+
print("====================")
|
|
94
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
95
|
+
print("--------------------")
|
|
96
|
+
print(repr(self.ret_rig_con))
|
|
97
|
+
print("--------------------\n")
|
|
98
|
+
print("Applying doubling map")
|
|
99
|
+
self.doubling_map()
|
|
100
|
+
|
|
101
|
+
self.cur_dims.insert(0, [0, 1])
|
|
102
|
+
|
|
103
|
+
for letter in reversed(cur_column):
|
|
104
|
+
# This check is needed for the n-1 spin column
|
|
105
|
+
if self.cur_dims[0][0] < r:
|
|
106
|
+
self.cur_dims[0][0] += 1
|
|
107
|
+
val = letter.value # Convert from a CrystalOfLetter to an Integer
|
|
108
|
+
|
|
109
|
+
if verbose:
|
|
110
|
+
print("====================")
|
|
111
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
112
|
+
print("--------------------")
|
|
113
|
+
print(repr(self.ret_rig_con))
|
|
114
|
+
print("--------------------\n")
|
|
115
|
+
|
|
116
|
+
# Build the next state
|
|
117
|
+
self.cur_path[0].insert(0, [letter]) # Prepend the value
|
|
118
|
+
self.next_state(val)
|
|
119
|
+
|
|
120
|
+
# Check to see if we are a spinor column
|
|
121
|
+
if r >= self.n-1:
|
|
122
|
+
if verbose:
|
|
123
|
+
print("====================")
|
|
124
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
125
|
+
print("--------------------")
|
|
126
|
+
print(repr(self.ret_rig_con))
|
|
127
|
+
print("--------------------\n")
|
|
128
|
+
print("Applying halving map")
|
|
129
|
+
self.halving_map()
|
|
130
|
+
|
|
131
|
+
# If we've split off a column, we need to merge the current column
|
|
132
|
+
# to the current crystal tableau
|
|
133
|
+
if col_number > 0:
|
|
134
|
+
for i, letter_singleton in enumerate(self.cur_path[0]):
|
|
135
|
+
self.cur_path[1][i].insert(0, letter_singleton[0])
|
|
136
|
+
self.cur_dims[1][1] += 1
|
|
137
|
+
self.cur_path.pop(0)
|
|
138
|
+
self.cur_dims.pop(0)
|
|
139
|
+
|
|
140
|
+
# And perform the inverse column splitting map on the RC
|
|
141
|
+
for a in range(self.n):
|
|
142
|
+
self._update_vacancy_nums(a)
|
|
143
|
+
|
|
144
|
+
self.ret_rig_con.set_immutable() # Return it to immutable
|
|
145
|
+
return self.ret_rig_con
|
|
146
|
+
|
|
147
|
+
def next_state(self, val):
|
|
148
|
+
r"""
|
|
149
|
+
Build the next state for type `D_n^{(1)}`.
|
|
150
|
+
|
|
151
|
+
TESTS::
|
|
152
|
+
|
|
153
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
|
|
154
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
155
|
+
sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[5,3]]))
|
|
156
|
+
sage: bijection.cur_path.insert(0, [])
|
|
157
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
158
|
+
sage: bijection.cur_path[0].insert(0, [3])
|
|
159
|
+
sage: bijection.next_state(3)
|
|
160
|
+
"""
|
|
161
|
+
# Note that type D_n only contains the (absolute) values between 1 and n
|
|
162
|
+
# (unlike type A_n which is 1 to n+1). Thus we only need to subtract 1
|
|
163
|
+
# to match the indices.
|
|
164
|
+
# Also note that we must subtract 1 from n to match the indices as well.
|
|
165
|
+
n = self.n
|
|
166
|
+
tableau_height = len(self.cur_path[0]) - 1
|
|
167
|
+
|
|
168
|
+
# If it is a regular value, we follow the A_n rules
|
|
169
|
+
if val > 0:
|
|
170
|
+
KRTToRCBijectionTypeA.next_state(self, val)
|
|
171
|
+
|
|
172
|
+
# If we are inserting n-1 (which will only update nu[a] for a <=
|
|
173
|
+
# n-1), we need to update the vacancy number of nu[n] as well
|
|
174
|
+
if val == n - 1:
|
|
175
|
+
self._update_vacancy_nums(val)
|
|
176
|
+
if tableau_height >= n - 2:
|
|
177
|
+
self._correct_vacancy_nums()
|
|
178
|
+
return
|
|
179
|
+
|
|
180
|
+
pos_val = -val
|
|
181
|
+
|
|
182
|
+
if pos_val == n:
|
|
183
|
+
# Special case for `\overline{n}` and adding to make height `n`
|
|
184
|
+
# where we only update the vacancy numbers
|
|
185
|
+
# This only occurs with `r = n - 1`
|
|
186
|
+
if self.cur_dims[0][0] == n - 1 and tableau_height == n - 1:
|
|
187
|
+
self._update_vacancy_nums(n-2)
|
|
188
|
+
self._update_vacancy_nums(n-1)
|
|
189
|
+
self._correct_vacancy_nums()
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
if len(self.ret_rig_con[n - 1]) > 0:
|
|
193
|
+
max_width = self.ret_rig_con[n - 1][0] + 1
|
|
194
|
+
else:
|
|
195
|
+
max_width = 1
|
|
196
|
+
|
|
197
|
+
# Update the last one and skip a rigged partition
|
|
198
|
+
max_width = self.ret_rig_con[n - 1].insert_cell(max_width)
|
|
199
|
+
|
|
200
|
+
for a in reversed(range(tableau_height, n - 2)):
|
|
201
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
202
|
+
self._update_vacancy_nums(a + 1)
|
|
203
|
+
self._update_partition_values(a + 1)
|
|
204
|
+
|
|
205
|
+
# Update all other effected remaining values
|
|
206
|
+
|
|
207
|
+
self._update_vacancy_nums(n - 1)
|
|
208
|
+
if tableau_height >= n - 2:
|
|
209
|
+
self._correct_vacancy_nums()
|
|
210
|
+
self._update_partition_values(n - 1)
|
|
211
|
+
|
|
212
|
+
self._update_vacancy_nums(tableau_height)
|
|
213
|
+
self._update_partition_values(tableau_height)
|
|
214
|
+
|
|
215
|
+
if tableau_height > 0:
|
|
216
|
+
self._update_vacancy_nums(tableau_height - 1)
|
|
217
|
+
self._update_partition_values(tableau_height - 1)
|
|
218
|
+
|
|
219
|
+
self._update_vacancy_nums(n - 2)
|
|
220
|
+
return
|
|
221
|
+
|
|
222
|
+
# Always add a cell to the first singular value in the first
|
|
223
|
+
# tableau we are updating.
|
|
224
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
225
|
+
max_width = self.ret_rig_con[pos_val - 1][0] + 1
|
|
226
|
+
else:
|
|
227
|
+
max_width = 1
|
|
228
|
+
# Special case for `\overline{n-1}` to take the larger of the last two
|
|
229
|
+
if pos_val == n - 1 and len(self.ret_rig_con[n - 1]) > 0 and \
|
|
230
|
+
self.ret_rig_con[n - 1][0] + 1 > max_width:
|
|
231
|
+
max_width = self.ret_rig_con[n - 1][0] + 1
|
|
232
|
+
|
|
233
|
+
# Add cells similar to type A_n but we move to the right until we reach
|
|
234
|
+
# the value of n-2
|
|
235
|
+
for a in range(pos_val - 1, n - 2):
|
|
236
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
237
|
+
|
|
238
|
+
# Handle the special behavior near values of n
|
|
239
|
+
if tableau_height <= n - 2:
|
|
240
|
+
max_width2 = self.ret_rig_con[n - 2].insert_cell(max_width)
|
|
241
|
+
max_width = self.ret_rig_con[n - 1].insert_cell(max_width)
|
|
242
|
+
max_width = min(max_width2, max_width)
|
|
243
|
+
elif pos_val <= self.cur_dims[0][0]:
|
|
244
|
+
# Special case when the height will become n
|
|
245
|
+
max_width = self.ret_rig_con[self.cur_dims[0][0] - 1].insert_cell(max_width)
|
|
246
|
+
|
|
247
|
+
# Go back following the regular A_n rules
|
|
248
|
+
if tableau_height <= n - 3:
|
|
249
|
+
max_width = self.ret_rig_con[n - 3].insert_cell(max_width)
|
|
250
|
+
|
|
251
|
+
self._update_vacancy_nums(n - 2)
|
|
252
|
+
self._update_vacancy_nums(n - 1)
|
|
253
|
+
if tableau_height >= n - 2:
|
|
254
|
+
self._correct_vacancy_nums()
|
|
255
|
+
self._update_partition_values(n - 2)
|
|
256
|
+
self._update_partition_values(n - 1)
|
|
257
|
+
|
|
258
|
+
for a in reversed(range(tableau_height, n - 3)):
|
|
259
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
260
|
+
self._update_vacancy_nums(a + 1)
|
|
261
|
+
self._update_partition_values(a + 1)
|
|
262
|
+
|
|
263
|
+
# Update the final rigged partitions
|
|
264
|
+
if tableau_height < n - 2:
|
|
265
|
+
self._update_vacancy_nums(tableau_height)
|
|
266
|
+
self._update_partition_values(tableau_height)
|
|
267
|
+
|
|
268
|
+
if pos_val <= tableau_height:
|
|
269
|
+
for a in range(pos_val - 1, tableau_height):
|
|
270
|
+
self._update_vacancy_nums(a)
|
|
271
|
+
self._update_partition_values(a)
|
|
272
|
+
if pos_val > 1:
|
|
273
|
+
self._update_vacancy_nums(pos_val-2)
|
|
274
|
+
self._update_partition_values(pos_val-2)
|
|
275
|
+
elif 0 < tableau_height:
|
|
276
|
+
self._update_vacancy_nums(tableau_height - 1)
|
|
277
|
+
self._update_partition_values(tableau_height - 1)
|
|
278
|
+
elif pos_val <= n - 1:
|
|
279
|
+
for a in range(pos_val - 1, n - 2):
|
|
280
|
+
self._update_vacancy_nums(a)
|
|
281
|
+
self._update_partition_values(a)
|
|
282
|
+
if pos_val > 1:
|
|
283
|
+
self._update_vacancy_nums(pos_val-2)
|
|
284
|
+
self._update_partition_values(pos_val-2)
|
|
285
|
+
|
|
286
|
+
def _correct_vacancy_nums(self):
|
|
287
|
+
r"""
|
|
288
|
+
Correct the vacancy numbers with special considerations for spinor
|
|
289
|
+
columns.
|
|
290
|
+
|
|
291
|
+
This should only be called when we are going to have a (left-most)
|
|
292
|
+
spinor column of height `n-1` or `n` in type `D^{(1)_n`.
|
|
293
|
+
|
|
294
|
+
This is a correction for the spinor column where we consider the
|
|
295
|
+
weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor
|
|
296
|
+
bijection. This adds 1 to each of the respective vacancy numbers
|
|
297
|
+
to account for this.
|
|
298
|
+
|
|
299
|
+
TESTS::
|
|
300
|
+
|
|
301
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[2,1]])
|
|
302
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
303
|
+
sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
|
|
304
|
+
sage: bijection.doubling_map()
|
|
305
|
+
sage: bijection.cur_path.insert(0, [])
|
|
306
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
307
|
+
sage: bijection.cur_path[0].insert(0, [2])
|
|
308
|
+
sage: bijection.next_state(2) # indirect doctest
|
|
309
|
+
sage: bijection.ret_rig_con
|
|
310
|
+
<BLANKLINE>
|
|
311
|
+
-2[ ]-2
|
|
312
|
+
<BLANKLINE>
|
|
313
|
+
(/)
|
|
314
|
+
<BLANKLINE>
|
|
315
|
+
(/)
|
|
316
|
+
<BLANKLINE>
|
|
317
|
+
(/)
|
|
318
|
+
<BLANKLINE>
|
|
319
|
+
"""
|
|
320
|
+
pos = self.n - 2
|
|
321
|
+
if self.cur_dims[0][0] == len(self.cur_path[0]):
|
|
322
|
+
# The current r value is never greater than the height of the current column
|
|
323
|
+
# Thus if we do not enter into this if block, then r < height and
|
|
324
|
+
# we adjust the (n-1)-th partition.
|
|
325
|
+
pos += 1
|
|
326
|
+
|
|
327
|
+
for i in range(len(self.ret_rig_con[pos]._list)):
|
|
328
|
+
self.ret_rig_con[pos].vacancy_numbers[i] += 1
|
|
329
|
+
|
|
330
|
+
def doubling_map(self):
|
|
331
|
+
r"""
|
|
332
|
+
Perform the doubling map of the rigged configuration at the current
|
|
333
|
+
state of the bijection.
|
|
334
|
+
|
|
335
|
+
This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which
|
|
336
|
+
doubles each of the rigged partitions and updates the vacancy numbers
|
|
337
|
+
accordingly.
|
|
338
|
+
|
|
339
|
+
TESTS::
|
|
340
|
+
|
|
341
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]])
|
|
342
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
343
|
+
sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
|
|
344
|
+
sage: bijection.cur_path.insert(0, [])
|
|
345
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
346
|
+
sage: bijection.cur_path[0].insert(0, [2])
|
|
347
|
+
sage: bijection.next_state(2)
|
|
348
|
+
sage: bijection.ret_rig_con
|
|
349
|
+
<BLANKLINE>
|
|
350
|
+
-2[ ]-2
|
|
351
|
+
<BLANKLINE>
|
|
352
|
+
(/)
|
|
353
|
+
<BLANKLINE>
|
|
354
|
+
(/)
|
|
355
|
+
<BLANKLINE>
|
|
356
|
+
(/)
|
|
357
|
+
<BLANKLINE>
|
|
358
|
+
sage: bijection.cur_dims
|
|
359
|
+
[[0, 1]]
|
|
360
|
+
sage: bijection.doubling_map()
|
|
361
|
+
sage: bijection.ret_rig_con
|
|
362
|
+
<BLANKLINE>
|
|
363
|
+
-4[ ][ ]-4
|
|
364
|
+
<BLANKLINE>
|
|
365
|
+
(/)
|
|
366
|
+
<BLANKLINE>
|
|
367
|
+
(/)
|
|
368
|
+
<BLANKLINE>
|
|
369
|
+
(/)
|
|
370
|
+
<BLANKLINE>
|
|
371
|
+
sage: bijection.cur_dims
|
|
372
|
+
[[0, 2]]
|
|
373
|
+
"""
|
|
374
|
+
for i in range(len(self.cur_dims)):
|
|
375
|
+
self.cur_dims[i][1] *= 2
|
|
376
|
+
for i in range(len(self.ret_rig_con)):
|
|
377
|
+
for j in range(len(self.ret_rig_con[i])):
|
|
378
|
+
self.ret_rig_con[i]._list[j] *= 2
|
|
379
|
+
self.ret_rig_con[i].rigging[j] *= 2
|
|
380
|
+
self.ret_rig_con[i].vacancy_numbers[j] *= 2
|
|
381
|
+
|
|
382
|
+
def halving_map(self):
|
|
383
|
+
r"""
|
|
384
|
+
Perform the halving map of the rigged configuration at the current
|
|
385
|
+
state of the bijection.
|
|
386
|
+
|
|
387
|
+
This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)`
|
|
388
|
+
which halves each of the rigged partitions and updates the vacancy
|
|
389
|
+
numbers accordingly.
|
|
390
|
+
|
|
391
|
+
TESTS::
|
|
392
|
+
|
|
393
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 1], [[4,1]])
|
|
394
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
395
|
+
sage: bijection = KRTToRCBijectionTypeD(KRT(pathlist=[[-1,4,3,2]]))
|
|
396
|
+
sage: bijection.cur_path.insert(0, [])
|
|
397
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
398
|
+
sage: bijection.cur_path[0].insert(0, [2])
|
|
399
|
+
sage: bijection.next_state(2)
|
|
400
|
+
sage: test = bijection.ret_rig_con
|
|
401
|
+
sage: bijection.doubling_map()
|
|
402
|
+
sage: bijection.halving_map()
|
|
403
|
+
sage: test == bijection.ret_rig_con
|
|
404
|
+
True
|
|
405
|
+
"""
|
|
406
|
+
# Skip the first column since it is a spinor
|
|
407
|
+
for i in range(1, len(self.cur_dims)):
|
|
408
|
+
self.cur_dims[i][1] //= 2
|
|
409
|
+
for i in range(len(self.ret_rig_con)):
|
|
410
|
+
for j in range(len(self.ret_rig_con[i])):
|
|
411
|
+
self.ret_rig_con[i]._list[j] //= 2
|
|
412
|
+
self.ret_rig_con[i].rigging[j] //= 2
|
|
413
|
+
self.ret_rig_con[i].vacancy_numbers[j] //= 2
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
class RCToKRTBijectionTypeD(RCToKRTBijectionTypeA):
|
|
417
|
+
r"""
|
|
418
|
+
Specific implementation of the bijection from rigged configurations to tensor products of KR tableaux for type `D_n^{(1)}`.
|
|
419
|
+
"""
|
|
420
|
+
|
|
421
|
+
def run(self, verbose=False, build_graph=False):
|
|
422
|
+
"""
|
|
423
|
+
Run the bijection from rigged configurations to tensor product of KR
|
|
424
|
+
tableaux for type `D_n^{(1)}`.
|
|
425
|
+
|
|
426
|
+
INPUT:
|
|
427
|
+
|
|
428
|
+
- ``verbose`` -- boolean (default: ``False``); display each step in the
|
|
429
|
+
bijection
|
|
430
|
+
- ``build_graph`` -- boolean (default: ``False``); build the graph of each
|
|
431
|
+
step of the bijection
|
|
432
|
+
|
|
433
|
+
EXAMPLES::
|
|
434
|
+
|
|
435
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
|
|
436
|
+
sage: x = RC(partition_list=[[1],[1],[1],[1]])
|
|
437
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
438
|
+
sage: RCToKRTBijectionTypeD(x).run()
|
|
439
|
+
[[2], [-3]]
|
|
440
|
+
sage: bij = RCToKRTBijectionTypeD(x)
|
|
441
|
+
sage: bij.run(build_graph=True)
|
|
442
|
+
[[2], [-3]]
|
|
443
|
+
sage: bij._graph
|
|
444
|
+
Digraph on 3 vertices
|
|
445
|
+
"""
|
|
446
|
+
from sage.combinat.crystals.letters import CrystalOfLetters
|
|
447
|
+
letters = CrystalOfLetters(self.rigged_con.parent()._cartan_type.classical())
|
|
448
|
+
|
|
449
|
+
# This is technically bad, but because the first thing we do is append
|
|
450
|
+
# an empty list to ret_crystal_path, we correct this. We do it this
|
|
451
|
+
# way so that we do not have to remove an empty list after the
|
|
452
|
+
# bijection has been performed.
|
|
453
|
+
ret_crystal_path = []
|
|
454
|
+
|
|
455
|
+
for dim in self.rigged_con.parent().dims:
|
|
456
|
+
ret_crystal_path.append([])
|
|
457
|
+
|
|
458
|
+
# Iterate over each column
|
|
459
|
+
for dummy_var in range(dim[1]):
|
|
460
|
+
# Split off a new column if necessary
|
|
461
|
+
if self.cur_dims[0][1] > 1:
|
|
462
|
+
self.cur_dims[0][1] -= 1
|
|
463
|
+
self.cur_dims.insert(0, [dim[0], 1])
|
|
464
|
+
|
|
465
|
+
# Perform the corresponding splitting map on rigged configurations
|
|
466
|
+
# All it does is update the vacancy numbers on the RC side
|
|
467
|
+
for a in range(self.n):
|
|
468
|
+
self._update_vacancy_numbers(a)
|
|
469
|
+
|
|
470
|
+
if build_graph:
|
|
471
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
472
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), 'ls'])
|
|
473
|
+
|
|
474
|
+
# Check to see if we are a spinor
|
|
475
|
+
if dim[0] >= self.n - 1:
|
|
476
|
+
if verbose:
|
|
477
|
+
print("====================")
|
|
478
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
479
|
+
print("--------------------")
|
|
480
|
+
print(ret_crystal_path)
|
|
481
|
+
print("--------------------\n")
|
|
482
|
+
print("Applying doubling map")
|
|
483
|
+
self.doubling_map()
|
|
484
|
+
|
|
485
|
+
if build_graph:
|
|
486
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
487
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), '2x'])
|
|
488
|
+
|
|
489
|
+
if dim[0] == self.n - 1:
|
|
490
|
+
if verbose:
|
|
491
|
+
print("====================")
|
|
492
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
493
|
+
print("--------------------")
|
|
494
|
+
print(ret_crystal_path)
|
|
495
|
+
print("--------------------\n")
|
|
496
|
+
b = self.next_state(self.n)
|
|
497
|
+
if b == self.n:
|
|
498
|
+
b = -self.n
|
|
499
|
+
ret_crystal_path[-1].append(letters(b)) # Append the rank
|
|
500
|
+
|
|
501
|
+
if build_graph:
|
|
502
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
503
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
|
|
504
|
+
|
|
505
|
+
while self.cur_dims[0][0] > 0:
|
|
506
|
+
if verbose:
|
|
507
|
+
print("====================")
|
|
508
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
509
|
+
print("--------------------")
|
|
510
|
+
print(ret_crystal_path)
|
|
511
|
+
print("--------------------\n")
|
|
512
|
+
|
|
513
|
+
self.cur_dims[0][0] -= 1 # This takes care of the indexing
|
|
514
|
+
b = self.next_state(self.cur_dims[0][0])
|
|
515
|
+
|
|
516
|
+
# Corrections for spinor
|
|
517
|
+
if dim[0] == self.n and b == -self.n \
|
|
518
|
+
and self.cur_dims[0][0] == self.n - 1:
|
|
519
|
+
b = -(self.n-1)
|
|
520
|
+
|
|
521
|
+
# Make sure we have a crystal letter
|
|
522
|
+
ret_crystal_path[-1].append(letters(b)) # Append the rank
|
|
523
|
+
|
|
524
|
+
if build_graph:
|
|
525
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
526
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
|
|
527
|
+
|
|
528
|
+
self.cur_dims.pop(0) # Pop off the leading column
|
|
529
|
+
|
|
530
|
+
# Check to see if we were a spinor
|
|
531
|
+
if dim[0] >= self.n-1:
|
|
532
|
+
if verbose:
|
|
533
|
+
print("====================")
|
|
534
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
535
|
+
print("--------------------")
|
|
536
|
+
print(ret_crystal_path)
|
|
537
|
+
print("--------------------\n")
|
|
538
|
+
print("Applying halving map")
|
|
539
|
+
self.halving_map()
|
|
540
|
+
|
|
541
|
+
if build_graph:
|
|
542
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
543
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), '1/2x'])
|
|
544
|
+
|
|
545
|
+
if build_graph:
|
|
546
|
+
self._graph.pop(0) # Remove the dummy at the start
|
|
547
|
+
from sage.graphs.digraph import DiGraph
|
|
548
|
+
from sage.graphs.dot2tex_utils import have_dot2tex
|
|
549
|
+
self._graph = DiGraph(self._graph, format='list_of_edges')
|
|
550
|
+
if have_dot2tex():
|
|
551
|
+
self._graph.set_latex_options(format='dot2tex', edge_labels=True)
|
|
552
|
+
|
|
553
|
+
return self.KRT(pathlist=ret_crystal_path)
|
|
554
|
+
|
|
555
|
+
def next_state(self, height):
|
|
556
|
+
r"""
|
|
557
|
+
Build the next state for type `D_n^{(1)}`.
|
|
558
|
+
|
|
559
|
+
TESTS::
|
|
560
|
+
|
|
561
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[2, 1]])
|
|
562
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
563
|
+
sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[1,1],[1],[1]]))
|
|
564
|
+
sage: bijection.next_state(0)
|
|
565
|
+
1
|
|
566
|
+
"""
|
|
567
|
+
n = self.n
|
|
568
|
+
ell = [None] * (2 * n - 2) # No `\bar{\ell}^{n-1}` and `\bar{\ell}^n`
|
|
569
|
+
b = None
|
|
570
|
+
|
|
571
|
+
# Calculate the rank and ell values
|
|
572
|
+
|
|
573
|
+
last_size = 0
|
|
574
|
+
for a in range(height, n - 2):
|
|
575
|
+
ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
576
|
+
|
|
577
|
+
if ell[a] is None:
|
|
578
|
+
b = a + 1
|
|
579
|
+
break
|
|
580
|
+
else:
|
|
581
|
+
last_size = self.cur_partitions[a][ell[a]]
|
|
582
|
+
|
|
583
|
+
if height == n:
|
|
584
|
+
# Special case from height `n` spinor with `r = n-1`
|
|
585
|
+
ell[n - 2] = self._find_singular_string(self.cur_partitions[n - 2], last_size)
|
|
586
|
+
if ell[n - 2] is not None:
|
|
587
|
+
last_size = self.cur_partitions[n - 2][ell[n - 2]]
|
|
588
|
+
else:
|
|
589
|
+
b = -n
|
|
590
|
+
elif height == n - 1:
|
|
591
|
+
# Special case for height `n-1` spinor
|
|
592
|
+
ell[n - 1] = self._find_singular_string(self.cur_partitions[n - 1], last_size)
|
|
593
|
+
if ell[n - 1] is not None:
|
|
594
|
+
last_size = self.cur_partitions[n - 1][ell[n - 1]]
|
|
595
|
+
else:
|
|
596
|
+
b = n
|
|
597
|
+
elif b is None:
|
|
598
|
+
# Do the special cases when we've reached n - 2
|
|
599
|
+
ell[n - 2] = self._find_singular_string(self.cur_partitions[n - 2], last_size)
|
|
600
|
+
ell[n - 1] = self._find_singular_string(self.cur_partitions[n - 1], last_size)
|
|
601
|
+
|
|
602
|
+
if ell[n - 2] is not None:
|
|
603
|
+
temp_size = self.cur_partitions[n - 2][ell[n - 2]]
|
|
604
|
+
if ell[n - 1] is not None:
|
|
605
|
+
last_size = self.cur_partitions[n - 1][ell[n - 1]]
|
|
606
|
+
last_size = max(temp_size, last_size)
|
|
607
|
+
else:
|
|
608
|
+
b = n
|
|
609
|
+
else:
|
|
610
|
+
if ell[n - 1] is not None:
|
|
611
|
+
b = -n
|
|
612
|
+
else:
|
|
613
|
+
b = n - 1
|
|
614
|
+
|
|
615
|
+
if b is None:
|
|
616
|
+
# Now go back
|
|
617
|
+
for a in reversed(range(n - 2)):
|
|
618
|
+
# Modified form of _find_singular_string
|
|
619
|
+
end = ell[a]
|
|
620
|
+
if a < height:
|
|
621
|
+
end = len(self.cur_partitions[a])
|
|
622
|
+
for i in reversed(range(end)):
|
|
623
|
+
if self.cur_partitions[a][i] >= last_size and \
|
|
624
|
+
self.cur_partitions[a].vacancy_numbers[i] == self.cur_partitions[a].rigging[i]:
|
|
625
|
+
ell[n + a] = i
|
|
626
|
+
break
|
|
627
|
+
|
|
628
|
+
if ell[n + a] is None:
|
|
629
|
+
b = -(a + 2)
|
|
630
|
+
break
|
|
631
|
+
else:
|
|
632
|
+
last_size = self.cur_partitions[a][ell[n + a]]
|
|
633
|
+
|
|
634
|
+
if b is None:
|
|
635
|
+
b = -1
|
|
636
|
+
|
|
637
|
+
# Determine the new rigged configuration by removing a box from the selected
|
|
638
|
+
# string and then making the new string singular
|
|
639
|
+
ret_row = self.cur_partitions[0].remove_cell(ell[0])
|
|
640
|
+
ret_row_bar = self.cur_partitions[0].remove_cell(ell[n])
|
|
641
|
+
for a in range(1, n - 2):
|
|
642
|
+
ret_row_next = self.cur_partitions[a].remove_cell(ell[a])
|
|
643
|
+
ret_row_bar_next = self.cur_partitions[a].remove_cell(ell[n + a])
|
|
644
|
+
|
|
645
|
+
self._update_vacancy_numbers(a - 1)
|
|
646
|
+
if ret_row is not None:
|
|
647
|
+
self.cur_partitions[a - 1].rigging[ret_row] = \
|
|
648
|
+
self.cur_partitions[a - 1].vacancy_numbers[ret_row]
|
|
649
|
+
if ret_row_bar is not None:
|
|
650
|
+
self.cur_partitions[a - 1].rigging[ret_row_bar] = \
|
|
651
|
+
self.cur_partitions[a - 1].vacancy_numbers[ret_row_bar]
|
|
652
|
+
|
|
653
|
+
ret_row = ret_row_next
|
|
654
|
+
ret_row_bar = ret_row_bar_next
|
|
655
|
+
|
|
656
|
+
# Special behavior for all a > n-3
|
|
657
|
+
ret_row_next = self.cur_partitions[n - 2].remove_cell(ell[n - 2])
|
|
658
|
+
ret_row_bar_next = self.cur_partitions[n - 1].remove_cell(ell[n - 1])
|
|
659
|
+
|
|
660
|
+
self._update_vacancy_numbers(n - 3)
|
|
661
|
+
if ret_row is not None:
|
|
662
|
+
self.cur_partitions[n - 3].rigging[ret_row] = \
|
|
663
|
+
self.cur_partitions[n - 3].vacancy_numbers[ret_row]
|
|
664
|
+
if ret_row_bar is not None:
|
|
665
|
+
self.cur_partitions[n - 3].rigging[ret_row_bar] = \
|
|
666
|
+
self.cur_partitions[n - 3].vacancy_numbers[ret_row_bar]
|
|
667
|
+
|
|
668
|
+
self._update_vacancy_numbers(n - 2)
|
|
669
|
+
if ret_row_next is not None:
|
|
670
|
+
self.cur_partitions[n - 2].rigging[ret_row_next] = \
|
|
671
|
+
self.cur_partitions[n - 2].vacancy_numbers[ret_row_next]
|
|
672
|
+
|
|
673
|
+
self._update_vacancy_numbers(n - 1)
|
|
674
|
+
if height >= n - 1:
|
|
675
|
+
self._correct_vacancy_nums()
|
|
676
|
+
if ret_row_bar_next is not None:
|
|
677
|
+
self.cur_partitions[n - 1].rigging[ret_row_bar_next] = \
|
|
678
|
+
self.cur_partitions[n - 1].vacancy_numbers[ret_row_bar_next]
|
|
679
|
+
|
|
680
|
+
return b
|
|
681
|
+
|
|
682
|
+
def doubling_map(self):
|
|
683
|
+
r"""
|
|
684
|
+
Perform the doubling map of the rigged configuration at the current
|
|
685
|
+
state of the bijection.
|
|
686
|
+
|
|
687
|
+
This is the map `B(\Lambda) \hookrightarrow B(2 \Lambda)` which
|
|
688
|
+
doubles each of the rigged partitions and updates the vacancy numbers
|
|
689
|
+
accordingly.
|
|
690
|
+
|
|
691
|
+
TESTS::
|
|
692
|
+
|
|
693
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
|
|
694
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
695
|
+
sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
|
|
696
|
+
sage: bijection.cur_partitions
|
|
697
|
+
[(/)
|
|
698
|
+
, (/)
|
|
699
|
+
, (/)
|
|
700
|
+
, -1[ ]-1
|
|
701
|
+
]
|
|
702
|
+
sage: bijection.doubling_map()
|
|
703
|
+
sage: bijection.cur_partitions
|
|
704
|
+
[(/)
|
|
705
|
+
, (/)
|
|
706
|
+
, (/)
|
|
707
|
+
, -2[ ][ ]-2
|
|
708
|
+
]
|
|
709
|
+
"""
|
|
710
|
+
# Skip the first column since it is a spinor
|
|
711
|
+
for i in range(1, len(self.cur_dims)):
|
|
712
|
+
self.cur_dims[i][1] *= 2
|
|
713
|
+
for partition in self.cur_partitions:
|
|
714
|
+
for j in range(len(partition)):
|
|
715
|
+
partition._list[j] *= 2
|
|
716
|
+
partition.rigging[j] *= 2
|
|
717
|
+
partition.vacancy_numbers[j] *= 2
|
|
718
|
+
|
|
719
|
+
def halving_map(self):
|
|
720
|
+
r"""
|
|
721
|
+
Perform the halving map of the rigged configuration at the current
|
|
722
|
+
state of the bijection.
|
|
723
|
+
|
|
724
|
+
This is the inverse map to `B(\Lambda) \hookrightarrow B(2 \Lambda)`
|
|
725
|
+
which halves each of the rigged partitions and updates the vacancy
|
|
726
|
+
numbers accordingly.
|
|
727
|
+
|
|
728
|
+
TESTS::
|
|
729
|
+
|
|
730
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
|
|
731
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
732
|
+
sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
|
|
733
|
+
sage: test = bijection.cur_partitions
|
|
734
|
+
sage: bijection.doubling_map()
|
|
735
|
+
sage: bijection.halving_map()
|
|
736
|
+
sage: test == bijection.cur_partitions
|
|
737
|
+
True
|
|
738
|
+
"""
|
|
739
|
+
for i in range(len(self.cur_dims)):
|
|
740
|
+
self.cur_dims[i][1] //= 2
|
|
741
|
+
for partition in self.cur_partitions:
|
|
742
|
+
for j in range(len(partition)):
|
|
743
|
+
partition._list[j] //= 2
|
|
744
|
+
partition.rigging[j] //= 2
|
|
745
|
+
partition.vacancy_numbers[j] //= 2
|
|
746
|
+
|
|
747
|
+
def _correct_vacancy_nums(self):
|
|
748
|
+
r"""
|
|
749
|
+
Correct the vacancy numbers with special considerations for spinor
|
|
750
|
+
columns.
|
|
751
|
+
|
|
752
|
+
This should only be called when we are going to have a (left-most)
|
|
753
|
+
spinor column of height `n-1` or `n`.
|
|
754
|
+
|
|
755
|
+
This is a correction for the spinor column where we consider the
|
|
756
|
+
weight `\overline{\Lambda_k}` where `k = n-1,n` during the spinor
|
|
757
|
+
bijection. This adds 1 to each of the respective vacancy numbers
|
|
758
|
+
to account for this.
|
|
759
|
+
|
|
760
|
+
TESTS::
|
|
761
|
+
|
|
762
|
+
sage: RC = RiggedConfigurations(['D', 4, 1], [[4, 1]])
|
|
763
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
764
|
+
sage: bijection = RCToKRTBijectionTypeD(RC(partition_list=[[],[],[],[1]]))
|
|
765
|
+
sage: bijection.doubling_map()
|
|
766
|
+
sage: bijection.next_state(4) # indirect doctest
|
|
767
|
+
-4
|
|
768
|
+
"""
|
|
769
|
+
n = self.n
|
|
770
|
+
for i in range(len(self.cur_partitions[n-1]._list)):
|
|
771
|
+
self.cur_partitions[n-1].vacancy_numbers[i] += 1
|