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,338 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Bijection classes for type `A_{2n}^{(2)\dagger}`
|
|
5
|
+
|
|
6
|
+
Part of the (internal) classes which runs the bijection between rigged
|
|
7
|
+
configurations and KR tableaux of type `A_{2n}^{(2)\dagger}`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2012-12-21): Initial version
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(CartanType(['A', 4, 2]).dual(), [[2, 1]])
|
|
16
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_dual import KRTToRCBijectionTypeA2Dual
|
|
17
|
+
sage: bijection = KRTToRCBijectionTypeA2Dual(KRT(pathlist=[[2,1]]))
|
|
18
|
+
sage: TestSuite(bijection).run()
|
|
19
|
+
sage: RC = RiggedConfigurations(CartanType(['A', 4, 2]).dual(), [[2, 1]])
|
|
20
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_dual import RCToKRTBijectionTypeA2Dual
|
|
21
|
+
sage: bijection = RCToKRTBijectionTypeA2Dual(RC(partition_list=[[],[]]))
|
|
22
|
+
sage: TestSuite(bijection).run()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
# Copyright (C) 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_C import KRTToRCBijectionTypeC
|
|
41
|
+
from sage.combinat.rigged_configurations.bij_type_C import RCToKRTBijectionTypeC
|
|
42
|
+
from sage.combinat.rigged_configurations.bij_type_A import KRTToRCBijectionTypeA
|
|
43
|
+
|
|
44
|
+
from sage.rings.rational_field import QQ
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class KRTToRCBijectionTypeA2Dual(KRTToRCBijectionTypeC):
|
|
48
|
+
r"""
|
|
49
|
+
Specific implementation of the bijection from KR tableaux to rigged
|
|
50
|
+
configurations for type `A_{2n}^{(2)\dagger}`.
|
|
51
|
+
|
|
52
|
+
This inherits from type `C_n^{(1)}` because we use the same methods in
|
|
53
|
+
some places.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def next_state(self, val):
|
|
57
|
+
r"""
|
|
58
|
+
Build the next state for type `A_{2n}^{(2)\dagger}`.
|
|
59
|
+
|
|
60
|
+
TESTS::
|
|
61
|
+
|
|
62
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(CartanType(['A', 4, 2]).dual(), [[2,1]])
|
|
63
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_dual import KRTToRCBijectionTypeA2Dual
|
|
64
|
+
sage: bijection = KRTToRCBijectionTypeA2Dual(KRT(pathlist=[[-1,2]]))
|
|
65
|
+
sage: bijection.cur_path.insert(0, [])
|
|
66
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
67
|
+
sage: bijection.cur_path[0].insert(0, [2])
|
|
68
|
+
sage: bijection.next_state(2)
|
|
69
|
+
"""
|
|
70
|
+
n = self.n
|
|
71
|
+
tableau_height = len(self.cur_path[0]) - 1
|
|
72
|
+
|
|
73
|
+
if val > 0:
|
|
74
|
+
# If it is a regular value, we follow the A_n rules
|
|
75
|
+
KRTToRCBijectionTypeA.next_state(self, val)
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
pos_val = -val
|
|
79
|
+
|
|
80
|
+
if pos_val == 0:
|
|
81
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
82
|
+
max_width = self.ret_rig_con[n-1][0]
|
|
83
|
+
else:
|
|
84
|
+
max_width = 1
|
|
85
|
+
max_width = self.ret_rig_con[n-1].insert_cell(max_width)
|
|
86
|
+
width_n = max_width + 1
|
|
87
|
+
|
|
88
|
+
# Follow regular A_n rules
|
|
89
|
+
for a in reversed(range(tableau_height, n-1)):
|
|
90
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
91
|
+
self._update_vacancy_nums(a + 1)
|
|
92
|
+
self._update_partition_values(a + 1)
|
|
93
|
+
self._update_vacancy_nums(tableau_height)
|
|
94
|
+
self._update_partition_values(tableau_height)
|
|
95
|
+
if tableau_height > 0:
|
|
96
|
+
self._update_vacancy_nums(tableau_height-1)
|
|
97
|
+
self._update_partition_values(tableau_height-1)
|
|
98
|
+
|
|
99
|
+
# Make the new string at n quasi-singular
|
|
100
|
+
p = self.ret_rig_con[n-1]
|
|
101
|
+
for i in range(len(p)):
|
|
102
|
+
if p._list[i] == width_n:
|
|
103
|
+
p.rigging[i] = p.rigging[i] - QQ(1)/QQ(2)
|
|
104
|
+
break
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
case_S = [None] * n
|
|
108
|
+
pos_val = -val
|
|
109
|
+
|
|
110
|
+
# Always add a cell to the first singular value in the first
|
|
111
|
+
# tableau we are updating.
|
|
112
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
113
|
+
max_width = self.ret_rig_con[pos_val - 1][0]
|
|
114
|
+
else:
|
|
115
|
+
max_width = 1
|
|
116
|
+
|
|
117
|
+
# Add cells similar to type A_n but we move to the right until we
|
|
118
|
+
# reach the value of n-1
|
|
119
|
+
for a in range(pos_val - 1, n-1):
|
|
120
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
121
|
+
case_S[a] = max_width
|
|
122
|
+
|
|
123
|
+
# Special case for n
|
|
124
|
+
# If we find a quasi-singular string first, then we are in case (Q, S)
|
|
125
|
+
# otherwise we will find a singular string and insert 2 cells
|
|
126
|
+
partition = self.ret_rig_con[n-1]
|
|
127
|
+
num_rows = len(partition)
|
|
128
|
+
case_QS = False
|
|
129
|
+
for i in range(num_rows + 1):
|
|
130
|
+
if i == num_rows:
|
|
131
|
+
max_width = 0
|
|
132
|
+
if case_QS:
|
|
133
|
+
partition._list.append(1)
|
|
134
|
+
partition.vacancy_numbers.append(None)
|
|
135
|
+
# Go through our partition until we find a length of greater than 1
|
|
136
|
+
j = len(partition._list) - 1
|
|
137
|
+
while j >= 0 and partition._list[j] == 1:
|
|
138
|
+
j -= 1
|
|
139
|
+
partition.rigging.insert(j + 1, None)
|
|
140
|
+
width_n = 1
|
|
141
|
+
else:
|
|
142
|
+
# Go through our partition until we find a length of greater than 2
|
|
143
|
+
j = len(partition._list) - 1
|
|
144
|
+
while j >= 0 and partition._list[j] <= 2:
|
|
145
|
+
j -= 1
|
|
146
|
+
partition._list.insert(j+1, 2)
|
|
147
|
+
partition.vacancy_numbers.insert(j+1, None)
|
|
148
|
+
partition.rigging.insert(j+1, None)
|
|
149
|
+
break
|
|
150
|
+
elif partition._list[i] <= max_width:
|
|
151
|
+
if partition.vacancy_numbers[i] == partition.rigging[i]:
|
|
152
|
+
max_width = partition._list[i]
|
|
153
|
+
if case_QS:
|
|
154
|
+
partition._list[i] += 1
|
|
155
|
+
width_n = partition._list[i]
|
|
156
|
+
partition.rigging[i] = None
|
|
157
|
+
else:
|
|
158
|
+
j = i - 1
|
|
159
|
+
while j >= 0 and partition._list[j] <= max_width + 2:
|
|
160
|
+
partition.rigging[j+1] = partition.rigging[j] # Shuffle it along
|
|
161
|
+
j -= 1
|
|
162
|
+
partition._list.pop(i)
|
|
163
|
+
partition._list.insert(j+1, max_width + 2)
|
|
164
|
+
partition.rigging[j+1] = None
|
|
165
|
+
break
|
|
166
|
+
elif partition.vacancy_numbers[i] - QQ(1)/QQ(2) == partition.rigging[i] and not case_QS:
|
|
167
|
+
case_QS = True
|
|
168
|
+
partition._list[i] += 1
|
|
169
|
+
partition.rigging[i] = None
|
|
170
|
+
# No need to set max_width here since we will find a singular string
|
|
171
|
+
|
|
172
|
+
# Now go back following the regular C_n (ish) rules
|
|
173
|
+
for a in reversed(range(tableau_height, n-1)):
|
|
174
|
+
if case_S[a] == max_width:
|
|
175
|
+
self._insert_cell_case_S(self.ret_rig_con[a])
|
|
176
|
+
else:
|
|
177
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
178
|
+
self._update_vacancy_nums(a + 1)
|
|
179
|
+
self._update_partition_values(a + 1)
|
|
180
|
+
|
|
181
|
+
# Update the final rigged partitions
|
|
182
|
+
if tableau_height < n:
|
|
183
|
+
self._update_vacancy_nums(tableau_height)
|
|
184
|
+
self._update_partition_values(tableau_height)
|
|
185
|
+
|
|
186
|
+
if pos_val <= tableau_height:
|
|
187
|
+
for a in range(pos_val-1, tableau_height):
|
|
188
|
+
self._update_vacancy_nums(a)
|
|
189
|
+
self._update_partition_values(a)
|
|
190
|
+
if pos_val > 1:
|
|
191
|
+
self._update_vacancy_nums(pos_val - 2)
|
|
192
|
+
self._update_partition_values(pos_val - 2)
|
|
193
|
+
elif tableau_height > 0:
|
|
194
|
+
self._update_vacancy_nums(tableau_height - 1)
|
|
195
|
+
self._update_partition_values(tableau_height - 1)
|
|
196
|
+
|
|
197
|
+
if case_QS:
|
|
198
|
+
# Make the new string quasi-singular
|
|
199
|
+
num_rows = len(partition)
|
|
200
|
+
for i in range(num_rows):
|
|
201
|
+
if partition._list[i] == width_n:
|
|
202
|
+
partition.rigging[i] = partition.rigging[i] - QQ(1)/QQ(2)
|
|
203
|
+
break
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class RCToKRTBijectionTypeA2Dual(RCToKRTBijectionTypeC):
|
|
207
|
+
r"""
|
|
208
|
+
Specific implementation of the bijection from rigged configurations to
|
|
209
|
+
tensor products of KR tableaux for type `A_{2n}^{(2)\dagger}`.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
def next_state(self, height):
|
|
213
|
+
r"""
|
|
214
|
+
Build the next state for type `A_{2n}^{(2)\dagger}`.
|
|
215
|
+
|
|
216
|
+
TESTS::
|
|
217
|
+
|
|
218
|
+
sage: RC = RiggedConfigurations(CartanType(['A', 4, 2]).dual(), [[2,1]])
|
|
219
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_dual import RCToKRTBijectionTypeA2Dual
|
|
220
|
+
sage: bijection = RCToKRTBijectionTypeA2Dual(RC(partition_list=[[2],[2,2]]))
|
|
221
|
+
sage: bijection.next_state(2)
|
|
222
|
+
-1
|
|
223
|
+
"""
|
|
224
|
+
height -= 1 # indexing
|
|
225
|
+
n = self.n
|
|
226
|
+
ell = [None] * (2*n)
|
|
227
|
+
case_S = [False] * n
|
|
228
|
+
case_Q = False
|
|
229
|
+
b = None
|
|
230
|
+
|
|
231
|
+
# Calculate the rank and ell values
|
|
232
|
+
|
|
233
|
+
last_size = 0
|
|
234
|
+
for a in range(height, n-1):
|
|
235
|
+
ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
236
|
+
|
|
237
|
+
if ell[a] is None:
|
|
238
|
+
b = a + 1
|
|
239
|
+
break
|
|
240
|
+
else:
|
|
241
|
+
last_size = self.cur_partitions[a][ell[a]]
|
|
242
|
+
|
|
243
|
+
if b is None:
|
|
244
|
+
partition = self.cur_partitions[n-1]
|
|
245
|
+
# Special case for n
|
|
246
|
+
for i in reversed(range(len(partition))):
|
|
247
|
+
if partition[i] >= last_size:
|
|
248
|
+
if partition.vacancy_numbers[i] == partition.rigging[i]:
|
|
249
|
+
last_size = partition[i]
|
|
250
|
+
case_S[n-1] = True
|
|
251
|
+
ell[2*n-1] = i
|
|
252
|
+
break
|
|
253
|
+
elif partition.vacancy_numbers[i] - QQ(1)/QQ(2) == partition.rigging[i] and not case_Q:
|
|
254
|
+
case_Q = True
|
|
255
|
+
# This will never be singular
|
|
256
|
+
last_size = partition[i] + 1
|
|
257
|
+
ell[n-1] = i
|
|
258
|
+
|
|
259
|
+
if ell[2*n-1] is None:
|
|
260
|
+
if not case_Q:
|
|
261
|
+
b = n
|
|
262
|
+
else:
|
|
263
|
+
b = 0
|
|
264
|
+
|
|
265
|
+
if b is None:
|
|
266
|
+
# Now go back
|
|
267
|
+
for a in reversed(range(n-1)):
|
|
268
|
+
if a >= height and self.cur_partitions[a][ell[a]] == last_size:
|
|
269
|
+
ell[n+a] = ell[a]
|
|
270
|
+
case_S[a] = True
|
|
271
|
+
else:
|
|
272
|
+
ell[n+a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
273
|
+
|
|
274
|
+
if ell[n + a] is None:
|
|
275
|
+
b = -(a + 2)
|
|
276
|
+
break
|
|
277
|
+
else:
|
|
278
|
+
last_size = self.cur_partitions[a][ell[n + a]]
|
|
279
|
+
|
|
280
|
+
if b is None:
|
|
281
|
+
b = -1
|
|
282
|
+
|
|
283
|
+
# Determine the new rigged configuration by removing boxes from the
|
|
284
|
+
# selected string and then making the new string singular
|
|
285
|
+
if n > 1:
|
|
286
|
+
if case_S[0]:
|
|
287
|
+
row_num = None
|
|
288
|
+
row_num_bar = self.cur_partitions[0].remove_cell(ell[n], 2)
|
|
289
|
+
else:
|
|
290
|
+
row_num = self.cur_partitions[0].remove_cell(ell[0])
|
|
291
|
+
row_num_bar = self.cur_partitions[0].remove_cell(ell[n])
|
|
292
|
+
for a in range(1, n-1):
|
|
293
|
+
if case_S[a]:
|
|
294
|
+
row_num_next = None
|
|
295
|
+
row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a], 2)
|
|
296
|
+
else:
|
|
297
|
+
row_num_next = self.cur_partitions[a].remove_cell(ell[a])
|
|
298
|
+
row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a])
|
|
299
|
+
|
|
300
|
+
self._update_vacancy_numbers(a - 1)
|
|
301
|
+
if row_num is not None:
|
|
302
|
+
self.cur_partitions[a-1].rigging[row_num] = self.cur_partitions[a-1].vacancy_numbers[row_num]
|
|
303
|
+
if row_num_bar is not None:
|
|
304
|
+
self.cur_partitions[a-1].rigging[row_num_bar] = self.cur_partitions[a-1].vacancy_numbers[row_num_bar]
|
|
305
|
+
row_num = row_num_next
|
|
306
|
+
row_num_bar = row_num_bar_next
|
|
307
|
+
|
|
308
|
+
if case_Q:
|
|
309
|
+
row_num_next = self.cur_partitions[n-1].remove_cell(ell[n-1])
|
|
310
|
+
if case_S[n-1]:
|
|
311
|
+
row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1])
|
|
312
|
+
else:
|
|
313
|
+
row_num_bar_next = None
|
|
314
|
+
elif case_S[n-1]:
|
|
315
|
+
row_num_next = None
|
|
316
|
+
row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1], 2)
|
|
317
|
+
else:
|
|
318
|
+
row_num_next = None
|
|
319
|
+
row_num_bar_next = None
|
|
320
|
+
|
|
321
|
+
if n > 1:
|
|
322
|
+
self._update_vacancy_numbers(n - 2)
|
|
323
|
+
if row_num is not None:
|
|
324
|
+
self.cur_partitions[n-2].rigging[row_num] = self.cur_partitions[n-2].vacancy_numbers[row_num]
|
|
325
|
+
if row_num_bar is not None:
|
|
326
|
+
self.cur_partitions[n-2].rigging[row_num_bar] = self.cur_partitions[n-2].vacancy_numbers[row_num_bar]
|
|
327
|
+
|
|
328
|
+
self._update_vacancy_numbers(n - 1)
|
|
329
|
+
if row_num_next is not None:
|
|
330
|
+
self.cur_partitions[n-1].rigging[row_num_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_next]
|
|
331
|
+
if row_num_bar_next is not None:
|
|
332
|
+
if case_Q:
|
|
333
|
+
# This will always be the largest value
|
|
334
|
+
self.cur_partitions[n-1].rigging[row_num_bar_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next] - QQ(1)/QQ(2)
|
|
335
|
+
else:
|
|
336
|
+
self.cur_partitions[n-1].rigging[row_num_bar_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next]
|
|
337
|
+
|
|
338
|
+
return b
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.graphs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Bijection classes for type `A_{2n}^{(2)}`
|
|
5
|
+
|
|
6
|
+
Part of the (internal) classes which runs the bijection between rigged
|
|
7
|
+
configurations and KR tableaux of type `A_{2n}^{(2)}`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2012-12-21): Initial version
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 2], [[2, 1]])
|
|
16
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_even import KRTToRCBijectionTypeA2Even
|
|
17
|
+
sage: bijection = KRTToRCBijectionTypeA2Even(KRT(pathlist=[[-1,2]]))
|
|
18
|
+
sage: TestSuite(bijection).run()
|
|
19
|
+
sage: RC = RiggedConfigurations(['A', 4, 2], [[2, 1]])
|
|
20
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_even import RCToKRTBijectionTypeA2Even
|
|
21
|
+
sage: bijection = RCToKRTBijectionTypeA2Even(RC(partition_list=[[],[]]))
|
|
22
|
+
sage: TestSuite(bijection).run()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
# Copyright (C) 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_C import KRTToRCBijectionTypeC
|
|
42
|
+
from sage.combinat.rigged_configurations.bij_type_C import RCToKRTBijectionTypeC
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class KRTToRCBijectionTypeA2Even(KRTToRCBijectionTypeC):
|
|
46
|
+
r"""
|
|
47
|
+
Specific implementation of the bijection from KR tableaux to rigged
|
|
48
|
+
configurations for type `A_{2n}^{(2)}`.
|
|
49
|
+
|
|
50
|
+
This inherits from type `C_n^{(1)}` because we use the same methods in
|
|
51
|
+
some places.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def next_state(self, val):
|
|
55
|
+
r"""
|
|
56
|
+
Build the next state for type `A_{2n}^{(2)}`.
|
|
57
|
+
|
|
58
|
+
TESTS::
|
|
59
|
+
|
|
60
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['A', 4, 2], [[2,1]])
|
|
61
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_even import KRTToRCBijectionTypeA2Even
|
|
62
|
+
sage: bijection = KRTToRCBijectionTypeA2Even(KRT(pathlist=[[-1,-2]]))
|
|
63
|
+
sage: bijection.cur_path.insert(0, [])
|
|
64
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
65
|
+
sage: bijection.cur_path[0].insert(0, [-2])
|
|
66
|
+
sage: bijection.next_state(-2)
|
|
67
|
+
"""
|
|
68
|
+
# Note that we must subtract 1 from n to match the indices.
|
|
69
|
+
n = self.n
|
|
70
|
+
tableau_height = len(self.cur_path[0]) - 1
|
|
71
|
+
|
|
72
|
+
# If it is a regular value, we follow the A_n rules
|
|
73
|
+
if val != 'E' and val > 0:
|
|
74
|
+
KRTToRCBijectionTypeA.next_state(self, val)
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
case_S = [None] * n
|
|
78
|
+
if val == 'E':
|
|
79
|
+
pos_val = n
|
|
80
|
+
max_width = self.ret_rig_con[n-1].insert_cell(0)
|
|
81
|
+
else:
|
|
82
|
+
pos_val = -val
|
|
83
|
+
|
|
84
|
+
# Always add a cell to the first singular value in the first
|
|
85
|
+
# tableau we are updating.
|
|
86
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
87
|
+
max_width = self.ret_rig_con[pos_val - 1][0]
|
|
88
|
+
else:
|
|
89
|
+
max_width = 1
|
|
90
|
+
|
|
91
|
+
# Add cells similar to type A_n but we move to the right until we
|
|
92
|
+
# reach the value of n
|
|
93
|
+
for a in range(pos_val - 1, n):
|
|
94
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
95
|
+
case_S[a] = max_width
|
|
96
|
+
|
|
97
|
+
# Special case for n
|
|
98
|
+
self._insert_cell_case_S(self.ret_rig_con[n-1])
|
|
99
|
+
|
|
100
|
+
# Now go back following the regular C_n (ish) rules
|
|
101
|
+
for a in reversed(range(tableau_height, n-1)):
|
|
102
|
+
if case_S[a] == max_width:
|
|
103
|
+
self._insert_cell_case_S(self.ret_rig_con[a])
|
|
104
|
+
else:
|
|
105
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
106
|
+
self._update_vacancy_nums(a + 1)
|
|
107
|
+
self._update_partition_values(a + 1)
|
|
108
|
+
|
|
109
|
+
# Update the final rigged partitions
|
|
110
|
+
if tableau_height < n:
|
|
111
|
+
self._update_vacancy_nums(tableau_height)
|
|
112
|
+
self._update_partition_values(tableau_height)
|
|
113
|
+
|
|
114
|
+
if pos_val <= tableau_height:
|
|
115
|
+
for a in range(pos_val-1, tableau_height):
|
|
116
|
+
self._update_vacancy_nums(a)
|
|
117
|
+
self._update_partition_values(a)
|
|
118
|
+
if pos_val > 1:
|
|
119
|
+
self._update_vacancy_nums(pos_val - 2)
|
|
120
|
+
self._update_partition_values(pos_val - 2)
|
|
121
|
+
elif tableau_height > 0:
|
|
122
|
+
self._update_vacancy_nums(tableau_height - 1)
|
|
123
|
+
self._update_partition_values(tableau_height - 1)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class RCToKRTBijectionTypeA2Even(RCToKRTBijectionTypeC):
|
|
127
|
+
r"""
|
|
128
|
+
Specific implementation of the bijection from rigged configurations to
|
|
129
|
+
tensor products of KR tableaux for type `A_{2n}^{(2)}`.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
def next_state(self, height):
|
|
133
|
+
r"""
|
|
134
|
+
Build the next state for type `A_{2n}^{(2)}`.
|
|
135
|
+
|
|
136
|
+
TESTS::
|
|
137
|
+
|
|
138
|
+
sage: RC = RiggedConfigurations(['A', 4, 2], [[2,1]])
|
|
139
|
+
sage: from sage.combinat.rigged_configurations.bij_type_A2_even import RCToKRTBijectionTypeA2Even
|
|
140
|
+
sage: bijection = RCToKRTBijectionTypeA2Even(RC(partition_list=[[2],[2,2]]))
|
|
141
|
+
sage: bijection.next_state(2)
|
|
142
|
+
-1
|
|
143
|
+
"""
|
|
144
|
+
height -= 1 # indexing
|
|
145
|
+
n = self.n
|
|
146
|
+
ell = [None] * (2*n)
|
|
147
|
+
case_S = [False] * n
|
|
148
|
+
b = None
|
|
149
|
+
|
|
150
|
+
# Calculate the rank and ell values
|
|
151
|
+
|
|
152
|
+
last_size = 0
|
|
153
|
+
for a in range(height, n):
|
|
154
|
+
ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
155
|
+
|
|
156
|
+
if ell[a] is None:
|
|
157
|
+
b = a + 1
|
|
158
|
+
break
|
|
159
|
+
else:
|
|
160
|
+
last_size = self.cur_partitions[a][ell[a]]
|
|
161
|
+
|
|
162
|
+
if b is None and last_size == 1:
|
|
163
|
+
b = 'E'
|
|
164
|
+
# This is a slight hack since remove_cell() will just delete the
|
|
165
|
+
# appropriate row
|
|
166
|
+
case_S[n-1] = True
|
|
167
|
+
|
|
168
|
+
if b is None:
|
|
169
|
+
# Now go back
|
|
170
|
+
ell[2*n-1] = ell[n-1]
|
|
171
|
+
case_S[n-1] = True
|
|
172
|
+
for a in reversed(range(n-1)):
|
|
173
|
+
if a >= height and self.cur_partitions[a][ell[a]] == last_size:
|
|
174
|
+
ell[n+a] = ell[a]
|
|
175
|
+
case_S[a] = True
|
|
176
|
+
else:
|
|
177
|
+
ell[n+a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
178
|
+
|
|
179
|
+
if ell[n + a] is None:
|
|
180
|
+
b = -(a + 2)
|
|
181
|
+
break
|
|
182
|
+
else:
|
|
183
|
+
last_size = self.cur_partitions[a][ell[n + a]]
|
|
184
|
+
|
|
185
|
+
if b is None:
|
|
186
|
+
b = -1
|
|
187
|
+
|
|
188
|
+
# Determine the new rigged configuration by removing boxes from the
|
|
189
|
+
# selected string and then making the new string singular
|
|
190
|
+
if case_S[0]:
|
|
191
|
+
row_num = self.cur_partitions[0].remove_cell(ell[0], 2)
|
|
192
|
+
row_num_bar = None
|
|
193
|
+
else:
|
|
194
|
+
row_num = self.cur_partitions[0].remove_cell(ell[0])
|
|
195
|
+
row_num_bar = self.cur_partitions[0].remove_cell(ell[n])
|
|
196
|
+
for a in range(1, n):
|
|
197
|
+
if case_S[a]:
|
|
198
|
+
row_num_next = self.cur_partitions[a].remove_cell(ell[a], 2)
|
|
199
|
+
row_num_bar_next = None
|
|
200
|
+
else:
|
|
201
|
+
row_num_next = self.cur_partitions[a].remove_cell(ell[a])
|
|
202
|
+
row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a])
|
|
203
|
+
|
|
204
|
+
self._update_vacancy_numbers(a - 1)
|
|
205
|
+
if row_num is not None:
|
|
206
|
+
self.cur_partitions[a-1].rigging[row_num] = self.cur_partitions[a-1].vacancy_numbers[row_num]
|
|
207
|
+
if row_num_bar is not None:
|
|
208
|
+
self.cur_partitions[a-1].rigging[row_num_bar] = self.cur_partitions[a-1].vacancy_numbers[row_num_bar]
|
|
209
|
+
row_num = row_num_next
|
|
210
|
+
row_num_bar = row_num_bar_next
|
|
211
|
+
|
|
212
|
+
self._update_vacancy_numbers(n - 1)
|
|
213
|
+
if row_num is not None:
|
|
214
|
+
self.cur_partitions[n-1].rigging[row_num] = self.cur_partitions[n-1].vacancy_numbers[row_num]
|
|
215
|
+
if row_num_bar is not None:
|
|
216
|
+
self.cur_partitions[n-1].rigging[row_num_bar] = self.cur_partitions[n-1].vacancy_numbers[row_num_bar]
|
|
217
|
+
|
|
218
|
+
return b
|