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,576 @@
|
|
|
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}^{(2)}`
|
|
5
|
+
|
|
6
|
+
Part of the (internal) classes which runs the bijection between rigged
|
|
7
|
+
configurations and KR tableaux of type `D_{n+1}^{(2)}`.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2011-04-15): Initial version
|
|
12
|
+
|
|
13
|
+
TESTS::
|
|
14
|
+
|
|
15
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[2,1]])
|
|
16
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
|
|
17
|
+
sage: bijection = KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,2]]))
|
|
18
|
+
sage: TestSuite(bijection).run()
|
|
19
|
+
sage: RC = RiggedConfigurations(['D', 4, 2], [[2, 1]])
|
|
20
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
|
|
21
|
+
sage: bijection = RCToKRTBijectionTypeDTwisted(RC())
|
|
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_A2_even import KRTToRCBijectionTypeA2Even
|
|
42
|
+
from sage.combinat.rigged_configurations.bij_type_A2_even import RCToKRTBijectionTypeA2Even
|
|
43
|
+
from sage.combinat.rigged_configurations.bij_type_D import KRTToRCBijectionTypeD
|
|
44
|
+
from sage.combinat.rigged_configurations.bij_type_D import RCToKRTBijectionTypeD
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class KRTToRCBijectionTypeDTwisted(KRTToRCBijectionTypeD, KRTToRCBijectionTypeA2Even):
|
|
48
|
+
r"""
|
|
49
|
+
Specific implementation of the bijection from KR tableaux to rigged
|
|
50
|
+
configurations for type `D_{n+1}^{(2)}`.
|
|
51
|
+
|
|
52
|
+
This inherits from type `C_n^{(1)}` and `D_n^{(1)}` because we use the
|
|
53
|
+
same methods in some places.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def run(self, verbose=False):
|
|
57
|
+
"""
|
|
58
|
+
Run the bijection from a tensor product of KR tableaux to a rigged
|
|
59
|
+
configuration for type `D_{n+1}^{(2)}`.
|
|
60
|
+
|
|
61
|
+
INPUT:
|
|
62
|
+
|
|
63
|
+
- ``tp_krt`` -- a tensor product of KR tableaux
|
|
64
|
+
|
|
65
|
+
- ``verbose`` -- (default: ``False``) display each step in the
|
|
66
|
+
bijection
|
|
67
|
+
|
|
68
|
+
EXAMPLES::
|
|
69
|
+
|
|
70
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[3,1]])
|
|
71
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
|
|
72
|
+
sage: KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,3,2]])).run()
|
|
73
|
+
<BLANKLINE>
|
|
74
|
+
-1[ ]-1
|
|
75
|
+
<BLANKLINE>
|
|
76
|
+
0[ ]0
|
|
77
|
+
<BLANKLINE>
|
|
78
|
+
1[ ]1
|
|
79
|
+
<BLANKLINE>
|
|
80
|
+
"""
|
|
81
|
+
if verbose:
|
|
82
|
+
from sage.combinat.rigged_configurations.tensor_product_kr_tableaux_element \
|
|
83
|
+
import TensorProductOfKirillovReshetikhinTableauxElement
|
|
84
|
+
|
|
85
|
+
for cur_crystal in reversed(self.tp_krt):
|
|
86
|
+
r = cur_crystal.parent().r()
|
|
87
|
+
# Iterate through the columns
|
|
88
|
+
for col_number, cur_column in enumerate(reversed(cur_crystal.to_array(False))):
|
|
89
|
+
self.cur_path.insert(0, []) # Prepend an empty list
|
|
90
|
+
|
|
91
|
+
# Check to see if we are a spinor column
|
|
92
|
+
if r == self.n:
|
|
93
|
+
if verbose:
|
|
94
|
+
print("====================")
|
|
95
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
96
|
+
print("--------------------")
|
|
97
|
+
print(repr(self.ret_rig_con))
|
|
98
|
+
print("--------------------\n")
|
|
99
|
+
print("Applying doubling map")
|
|
100
|
+
self.doubling_map()
|
|
101
|
+
|
|
102
|
+
self.cur_dims.insert(0, [0, 1])
|
|
103
|
+
|
|
104
|
+
for letter in reversed(cur_column):
|
|
105
|
+
self.cur_dims[0][0] += 1
|
|
106
|
+
val = letter.value # Convert from a CrystalOfLetter to an Integer
|
|
107
|
+
|
|
108
|
+
if verbose:
|
|
109
|
+
print("====================")
|
|
110
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
111
|
+
print("--------------------")
|
|
112
|
+
print(repr(self.ret_rig_con))
|
|
113
|
+
print("--------------------\n")
|
|
114
|
+
|
|
115
|
+
# Build the next state
|
|
116
|
+
self.cur_path[0].insert(0, [letter]) # Prepend the value
|
|
117
|
+
self.next_state(val)
|
|
118
|
+
|
|
119
|
+
# Check to see if we are a spinor column
|
|
120
|
+
if r == self.n:
|
|
121
|
+
if verbose:
|
|
122
|
+
print("====================")
|
|
123
|
+
print(repr(TensorProductOfKirillovReshetikhinTableauxElement(self.tp_krt.parent(), self.cur_path)))
|
|
124
|
+
print("--------------------")
|
|
125
|
+
print(repr(self.ret_rig_con))
|
|
126
|
+
print("--------------------\n")
|
|
127
|
+
print("Applying halving map")
|
|
128
|
+
self.halving_map()
|
|
129
|
+
|
|
130
|
+
# If we've split off a column, we need to merge the current column
|
|
131
|
+
# to the current crystal tableau
|
|
132
|
+
if col_number > 0:
|
|
133
|
+
for i, letter_singleton in enumerate(self.cur_path[0]):
|
|
134
|
+
self.cur_path[1][i].insert(0, letter_singleton[0])
|
|
135
|
+
self.cur_dims[1][1] += 1
|
|
136
|
+
self.cur_path.pop(0)
|
|
137
|
+
self.cur_dims.pop(0)
|
|
138
|
+
|
|
139
|
+
# And perform the inverse column splitting map on the RC
|
|
140
|
+
for a in range(self.n):
|
|
141
|
+
self._update_vacancy_nums(a)
|
|
142
|
+
|
|
143
|
+
self.ret_rig_con.set_immutable() # Return it to immutable
|
|
144
|
+
return self.ret_rig_con
|
|
145
|
+
|
|
146
|
+
def next_state(self, val):
|
|
147
|
+
r"""
|
|
148
|
+
Build the next state for type `D_{n+1}^{(2)}`.
|
|
149
|
+
|
|
150
|
+
TESTS::
|
|
151
|
+
|
|
152
|
+
sage: KRT = crystals.TensorProductOfKirillovReshetikhinTableaux(['D', 4, 2], [[2,1]])
|
|
153
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import KRTToRCBijectionTypeDTwisted
|
|
154
|
+
sage: bijection = KRTToRCBijectionTypeDTwisted(KRT(pathlist=[[-1,2]]))
|
|
155
|
+
sage: bijection.cur_path.insert(0, [])
|
|
156
|
+
sage: bijection.cur_dims.insert(0, [0, 1])
|
|
157
|
+
sage: bijection.cur_path[0].insert(0, [2])
|
|
158
|
+
sage: bijection.next_state(2)
|
|
159
|
+
"""
|
|
160
|
+
n = self.n
|
|
161
|
+
tableau_height = len(self.cur_path[0]) - 1
|
|
162
|
+
|
|
163
|
+
if val == 'E':
|
|
164
|
+
KRTToRCBijectionTypeA2Even.next_state(self, val)
|
|
165
|
+
return
|
|
166
|
+
elif val > 0:
|
|
167
|
+
# If it is a regular value, we follow the A_n rules
|
|
168
|
+
KRTToRCBijectionTypeA.next_state(self, val)
|
|
169
|
+
if tableau_height >= n - 1:
|
|
170
|
+
self._correct_vacancy_nums()
|
|
171
|
+
return
|
|
172
|
+
|
|
173
|
+
pos_val = -val
|
|
174
|
+
|
|
175
|
+
if pos_val == 0:
|
|
176
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
177
|
+
max_width = self.ret_rig_con[n-1][0]
|
|
178
|
+
else:
|
|
179
|
+
max_width = 1
|
|
180
|
+
max_width = self.ret_rig_con[n-1].insert_cell(max_width)
|
|
181
|
+
width_n = max_width + 1
|
|
182
|
+
|
|
183
|
+
# Follow regular A_n rules
|
|
184
|
+
for a in reversed(range(tableau_height, n-1)):
|
|
185
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
186
|
+
self._update_vacancy_nums(a + 1)
|
|
187
|
+
self._update_partition_values(a + 1)
|
|
188
|
+
self._update_vacancy_nums(tableau_height)
|
|
189
|
+
if tableau_height >= n - 1:
|
|
190
|
+
self._correct_vacancy_nums()
|
|
191
|
+
self._update_partition_values(tableau_height)
|
|
192
|
+
if tableau_height > 0:
|
|
193
|
+
self._update_vacancy_nums(tableau_height-1)
|
|
194
|
+
self._update_partition_values(tableau_height-1)
|
|
195
|
+
|
|
196
|
+
# Make the new string at n quasi-singular
|
|
197
|
+
p = self.ret_rig_con[n-1]
|
|
198
|
+
num_rows = len(p)
|
|
199
|
+
for i in range(num_rows):
|
|
200
|
+
if p._list[i] == width_n:
|
|
201
|
+
j = i+1
|
|
202
|
+
while j < num_rows and p._list[j] == width_n \
|
|
203
|
+
and p.vacancy_numbers[j] == p.rigging[j]:
|
|
204
|
+
j += 1
|
|
205
|
+
p.rigging[j-1] -= 1
|
|
206
|
+
break
|
|
207
|
+
return
|
|
208
|
+
|
|
209
|
+
case_S = [None] * n
|
|
210
|
+
pos_val = -val
|
|
211
|
+
|
|
212
|
+
# Always add a cell to the first singular value in the first
|
|
213
|
+
# tableau we are updating.
|
|
214
|
+
if len(self.ret_rig_con[pos_val - 1]) > 0:
|
|
215
|
+
max_width = self.ret_rig_con[pos_val - 1][0]
|
|
216
|
+
else:
|
|
217
|
+
max_width = 1
|
|
218
|
+
|
|
219
|
+
# Add cells similar to type A_n but we move to the right until we
|
|
220
|
+
# reach the value of n-1
|
|
221
|
+
for a in range(pos_val - 1, n-1):
|
|
222
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
223
|
+
case_S[a] = max_width
|
|
224
|
+
|
|
225
|
+
# Special case for n
|
|
226
|
+
# If we find a quasi-singular string first, then we are in case (Q, S)
|
|
227
|
+
# otherwise we will find a singular string and insert 2 cells
|
|
228
|
+
partition = self.ret_rig_con[n-1]
|
|
229
|
+
num_rows = len(partition)
|
|
230
|
+
case_QS = False
|
|
231
|
+
for i in range(num_rows + 1):
|
|
232
|
+
if i == num_rows:
|
|
233
|
+
max_width = 0
|
|
234
|
+
if case_QS:
|
|
235
|
+
partition._list.append(1)
|
|
236
|
+
partition.vacancy_numbers.append(None)
|
|
237
|
+
# Go through our partition until we find a length of greater than 1
|
|
238
|
+
j = len(partition._list) - 1
|
|
239
|
+
while j >= 0 and partition._list[j] == 1:
|
|
240
|
+
j -= 1
|
|
241
|
+
partition.rigging.insert(j + 1, None)
|
|
242
|
+
width_n = 1
|
|
243
|
+
else:
|
|
244
|
+
# Go through our partition until we find a length of greater than 2
|
|
245
|
+
j = len(partition._list) - 1
|
|
246
|
+
while j >= 0 and partition._list[j] <= 2:
|
|
247
|
+
j -= 1
|
|
248
|
+
partition._list.insert(j+1, 2)
|
|
249
|
+
partition.vacancy_numbers.insert(j+1, None)
|
|
250
|
+
partition.rigging.insert(j+1, None)
|
|
251
|
+
break
|
|
252
|
+
elif partition._list[i] <= max_width:
|
|
253
|
+
if partition.vacancy_numbers[i] == partition.rigging[i]:
|
|
254
|
+
max_width = partition._list[i]
|
|
255
|
+
if case_QS:
|
|
256
|
+
partition._list[i] += 1
|
|
257
|
+
width_n = partition._list[i]
|
|
258
|
+
partition.rigging[i] = None
|
|
259
|
+
else:
|
|
260
|
+
j = i - 1
|
|
261
|
+
while j >= 0 and partition._list[j] <= max_width + 2:
|
|
262
|
+
partition.rigging[j+1] = partition.rigging[j] # Shuffle it along
|
|
263
|
+
j -= 1
|
|
264
|
+
partition._list.pop(i)
|
|
265
|
+
partition._list.insert(j+1, max_width + 2)
|
|
266
|
+
partition.rigging[j+1] = None
|
|
267
|
+
break
|
|
268
|
+
elif partition.vacancy_numbers[i] - 1 == partition.rigging[i] and not case_QS:
|
|
269
|
+
case_QS = True
|
|
270
|
+
partition._list[i] += 1
|
|
271
|
+
partition.rigging[i] = None
|
|
272
|
+
# No need to set max_width here since we will find a singular string
|
|
273
|
+
|
|
274
|
+
# Now go back following the regular C_n (ish) rules
|
|
275
|
+
for a in reversed(range(tableau_height, n-1)):
|
|
276
|
+
if case_S[a] == max_width:
|
|
277
|
+
self._insert_cell_case_S(self.ret_rig_con[a])
|
|
278
|
+
else:
|
|
279
|
+
max_width = self.ret_rig_con[a].insert_cell(max_width)
|
|
280
|
+
self._update_vacancy_nums(a + 1)
|
|
281
|
+
self._update_partition_values(a + 1)
|
|
282
|
+
|
|
283
|
+
# Update the final rigged partitions
|
|
284
|
+
self._update_vacancy_nums(tableau_height)
|
|
285
|
+
if tableau_height >= n - 1:
|
|
286
|
+
self._correct_vacancy_nums()
|
|
287
|
+
self._update_partition_values(tableau_height)
|
|
288
|
+
|
|
289
|
+
if pos_val <= tableau_height:
|
|
290
|
+
for a in range(pos_val-1, tableau_height):
|
|
291
|
+
self._update_vacancy_nums(a)
|
|
292
|
+
self._update_partition_values(a)
|
|
293
|
+
if pos_val > 1:
|
|
294
|
+
self._update_vacancy_nums(pos_val - 2)
|
|
295
|
+
self._update_partition_values(pos_val - 2)
|
|
296
|
+
elif tableau_height > 0:
|
|
297
|
+
self._update_vacancy_nums(tableau_height - 1)
|
|
298
|
+
self._update_partition_values(tableau_height - 1)
|
|
299
|
+
|
|
300
|
+
if case_QS:
|
|
301
|
+
# Make the new string quasi-singular
|
|
302
|
+
num_rows = len(partition)
|
|
303
|
+
for i in range(num_rows):
|
|
304
|
+
if partition._list[i] == width_n:
|
|
305
|
+
j = i+1
|
|
306
|
+
while j < num_rows and partition._list[j] == width_n \
|
|
307
|
+
and partition.vacancy_numbers[j] == partition.rigging[j]:
|
|
308
|
+
j += 1
|
|
309
|
+
partition.rigging[j-1] -= 1
|
|
310
|
+
break
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class RCToKRTBijectionTypeDTwisted(RCToKRTBijectionTypeD, RCToKRTBijectionTypeA2Even):
|
|
314
|
+
r"""
|
|
315
|
+
Specific implementation of the bijection from rigged configurations to
|
|
316
|
+
tensor products of KR tableaux for type `D_{n+1}^{(2)}`.
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
def run(self, verbose=False, build_graph=False):
|
|
320
|
+
"""
|
|
321
|
+
Run the bijection from rigged configurations to tensor product of KR
|
|
322
|
+
tableaux for type `D_{n+1}^{(2)}`.
|
|
323
|
+
|
|
324
|
+
INPUT:
|
|
325
|
+
|
|
326
|
+
- ``verbose`` -- boolean (default: ``False``); display each step in the
|
|
327
|
+
bijection
|
|
328
|
+
- ``build_graph`` -- boolean (default: ``False``); build the graph of each
|
|
329
|
+
step of the bijection
|
|
330
|
+
|
|
331
|
+
EXAMPLES::
|
|
332
|
+
|
|
333
|
+
sage: RC = RiggedConfigurations(['D', 4, 2], [[3, 1]])
|
|
334
|
+
sage: x = RC(partition_list=[[],[1],[1]])
|
|
335
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
|
|
336
|
+
sage: RCToKRTBijectionTypeDTwisted(x).run()
|
|
337
|
+
[[1], [3], [-2]]
|
|
338
|
+
sage: bij = RCToKRTBijectionTypeDTwisted(x)
|
|
339
|
+
sage: bij.run(build_graph=True)
|
|
340
|
+
[[1], [3], [-2]]
|
|
341
|
+
sage: bij._graph
|
|
342
|
+
Digraph on 6 vertices
|
|
343
|
+
"""
|
|
344
|
+
from sage.combinat.crystals.letters import CrystalOfLetters
|
|
345
|
+
letters = CrystalOfLetters(self.rigged_con.parent()._cartan_type.classical())
|
|
346
|
+
|
|
347
|
+
# This is technically bad, but because the first thing we do is append
|
|
348
|
+
# an empty list to ret_crystal_path, we correct this. We do it this
|
|
349
|
+
# way so that we do not have to remove an empty list after the
|
|
350
|
+
# bijection has been performed.
|
|
351
|
+
ret_crystal_path = []
|
|
352
|
+
|
|
353
|
+
for dim in self.rigged_con.parent().dims:
|
|
354
|
+
ret_crystal_path.append([])
|
|
355
|
+
|
|
356
|
+
# Iterate over each column
|
|
357
|
+
for dummy_var in range(dim[1]):
|
|
358
|
+
# Split off a new column if necessary
|
|
359
|
+
if self.cur_dims[0][1] > 1:
|
|
360
|
+
self.cur_dims[0][1] -= 1
|
|
361
|
+
self.cur_dims.insert(0, [dim[0], 1])
|
|
362
|
+
|
|
363
|
+
# Perform the corresponding splitting map on rigged configurations
|
|
364
|
+
# All it does is update the vacancy numbers on the RC side
|
|
365
|
+
for a in range(self.n):
|
|
366
|
+
self._update_vacancy_numbers(a)
|
|
367
|
+
|
|
368
|
+
if build_graph:
|
|
369
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
370
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), 'ls'])
|
|
371
|
+
|
|
372
|
+
# Check to see if we are a spinor
|
|
373
|
+
if dim[0] == self.n:
|
|
374
|
+
if verbose:
|
|
375
|
+
print("====================")
|
|
376
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
377
|
+
print("--------------------")
|
|
378
|
+
print(ret_crystal_path)
|
|
379
|
+
print("--------------------\n")
|
|
380
|
+
print("Applying doubling map")
|
|
381
|
+
self.doubling_map()
|
|
382
|
+
|
|
383
|
+
if build_graph:
|
|
384
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
385
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), '2x'])
|
|
386
|
+
|
|
387
|
+
while self.cur_dims[0][0] > 0:
|
|
388
|
+
if verbose:
|
|
389
|
+
print("====================")
|
|
390
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions, use_vacancy_numbers=True)))
|
|
391
|
+
print("--------------------")
|
|
392
|
+
print(ret_crystal_path)
|
|
393
|
+
print("--------------------\n")
|
|
394
|
+
|
|
395
|
+
self.cur_dims[0][0] -= 1 # This takes care of the indexing
|
|
396
|
+
b = self.next_state(self.cur_dims[0][0])
|
|
397
|
+
|
|
398
|
+
# Make sure we have a crystal letter
|
|
399
|
+
ret_crystal_path[-1].append(letters(b)) # Append the rank
|
|
400
|
+
|
|
401
|
+
if build_graph:
|
|
402
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
403
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), letters(b)])
|
|
404
|
+
|
|
405
|
+
self.cur_dims.pop(0) # Pop off the leading column
|
|
406
|
+
|
|
407
|
+
# Check to see if we were a spinor
|
|
408
|
+
if dim[0] == self.n:
|
|
409
|
+
if verbose:
|
|
410
|
+
print("====================")
|
|
411
|
+
print(repr(self.rigged_con.parent()(*self.cur_partitions)))
|
|
412
|
+
print("--------------------")
|
|
413
|
+
print(ret_crystal_path)
|
|
414
|
+
print("--------------------\n")
|
|
415
|
+
print("Applying halving map")
|
|
416
|
+
self.halving_map()
|
|
417
|
+
|
|
418
|
+
if build_graph:
|
|
419
|
+
y = self.rigged_con.parent()(*[x._clone() for x in self.cur_partitions], use_vacancy_numbers=True)
|
|
420
|
+
self._graph.append([self._graph[-1][1], (y, len(self._graph)), '1/2x'])
|
|
421
|
+
|
|
422
|
+
if build_graph:
|
|
423
|
+
self._graph.pop(0) # Remove the dummy at the start
|
|
424
|
+
from sage.graphs.digraph import DiGraph
|
|
425
|
+
from sage.graphs.dot2tex_utils import have_dot2tex
|
|
426
|
+
self._graph = DiGraph(self._graph)
|
|
427
|
+
if have_dot2tex():
|
|
428
|
+
self._graph.set_latex_options(format='dot2tex', edge_labels=True)
|
|
429
|
+
|
|
430
|
+
return self.KRT(pathlist=ret_crystal_path)
|
|
431
|
+
|
|
432
|
+
def next_state(self, height):
|
|
433
|
+
r"""
|
|
434
|
+
Build the next state for type `D_{n+1}^{(2)}`.
|
|
435
|
+
|
|
436
|
+
TESTS::
|
|
437
|
+
|
|
438
|
+
sage: RC = RiggedConfigurations(['D', 4, 2], [[2, 1]])
|
|
439
|
+
sage: from sage.combinat.rigged_configurations.bij_type_D_twisted import RCToKRTBijectionTypeDTwisted
|
|
440
|
+
sage: bijection = RCToKRTBijectionTypeDTwisted(RC(partition_list=[[2],[2,2],[2,2]]))
|
|
441
|
+
sage: bijection.next_state(0)
|
|
442
|
+
-1
|
|
443
|
+
"""
|
|
444
|
+
n = self.n
|
|
445
|
+
ell = [None] * (2*n)
|
|
446
|
+
case_S = [False] * n
|
|
447
|
+
case_Q = False
|
|
448
|
+
b = None
|
|
449
|
+
|
|
450
|
+
# Calculate the rank and ell values
|
|
451
|
+
|
|
452
|
+
last_size = 0
|
|
453
|
+
for a in range(height, n-1):
|
|
454
|
+
ell[a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
455
|
+
|
|
456
|
+
if ell[a] is None:
|
|
457
|
+
b = a + 1
|
|
458
|
+
break
|
|
459
|
+
else:
|
|
460
|
+
last_size = self.cur_partitions[a][ell[a]]
|
|
461
|
+
|
|
462
|
+
if b is None:
|
|
463
|
+
partition = self.cur_partitions[n-1]
|
|
464
|
+
# Modified version of _find_singular_string()
|
|
465
|
+
for i in reversed(range(len(partition))):
|
|
466
|
+
if partition[i] >= last_size:
|
|
467
|
+
if partition.vacancy_numbers[i] == partition.rigging[i]:
|
|
468
|
+
if partition[i] == 1:
|
|
469
|
+
b = 'E'
|
|
470
|
+
else:
|
|
471
|
+
last_size = partition[i]
|
|
472
|
+
case_S[n-1] = True
|
|
473
|
+
ell[2*n-1] = i
|
|
474
|
+
break
|
|
475
|
+
elif partition.vacancy_numbers[i] - 1 == partition.rigging[i] and not case_Q:
|
|
476
|
+
case_Q = True
|
|
477
|
+
# Check if it is singular as well
|
|
478
|
+
block_size = partition[i]
|
|
479
|
+
for j in reversed(range(i)):
|
|
480
|
+
if partition[j] != block_size:
|
|
481
|
+
break
|
|
482
|
+
elif partition.vacancy_numbers[j] == partition.rigging[j]:
|
|
483
|
+
case_Q = False
|
|
484
|
+
break
|
|
485
|
+
if case_Q:
|
|
486
|
+
last_size = partition[i] + 1
|
|
487
|
+
ell[n-1] = i
|
|
488
|
+
|
|
489
|
+
if ell[2*n-1] is None:
|
|
490
|
+
if not case_Q:
|
|
491
|
+
b = n
|
|
492
|
+
else:
|
|
493
|
+
b = 0
|
|
494
|
+
|
|
495
|
+
if b is None:
|
|
496
|
+
# Now go back
|
|
497
|
+
for a in reversed(range(n-1)):
|
|
498
|
+
if a >= height and self.cur_partitions[a][ell[a]] == last_size:
|
|
499
|
+
ell[n+a] = ell[a]
|
|
500
|
+
case_S[a] = True
|
|
501
|
+
else:
|
|
502
|
+
ell[n+a] = self._find_singular_string(self.cur_partitions[a], last_size)
|
|
503
|
+
|
|
504
|
+
if ell[n + a] is None:
|
|
505
|
+
b = -(a + 2)
|
|
506
|
+
break
|
|
507
|
+
else:
|
|
508
|
+
last_size = self.cur_partitions[a][ell[n + a]]
|
|
509
|
+
|
|
510
|
+
if b is None:
|
|
511
|
+
b = -1
|
|
512
|
+
|
|
513
|
+
# Determine the new rigged configuration by removing boxes from the
|
|
514
|
+
# selected string and then making the new string singular
|
|
515
|
+
if case_S[0]:
|
|
516
|
+
row_num = None
|
|
517
|
+
row_num_bar = self.cur_partitions[0].remove_cell(ell[n], 2)
|
|
518
|
+
else:
|
|
519
|
+
row_num = self.cur_partitions[0].remove_cell(ell[0])
|
|
520
|
+
row_num_bar = self.cur_partitions[0].remove_cell(ell[n])
|
|
521
|
+
for a in range(1, n-1):
|
|
522
|
+
if case_S[a]:
|
|
523
|
+
row_num_next = None
|
|
524
|
+
row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a], 2)
|
|
525
|
+
else:
|
|
526
|
+
row_num_next = self.cur_partitions[a].remove_cell(ell[a])
|
|
527
|
+
row_num_bar_next = self.cur_partitions[a].remove_cell(ell[n+a])
|
|
528
|
+
|
|
529
|
+
self._update_vacancy_numbers(a - 1)
|
|
530
|
+
if row_num is not None:
|
|
531
|
+
self.cur_partitions[a-1].rigging[row_num] = self.cur_partitions[a-1].vacancy_numbers[row_num]
|
|
532
|
+
if row_num_bar is not None:
|
|
533
|
+
self.cur_partitions[a-1].rigging[row_num_bar] = self.cur_partitions[a-1].vacancy_numbers[row_num_bar]
|
|
534
|
+
row_num = row_num_next
|
|
535
|
+
row_num_bar = row_num_bar_next
|
|
536
|
+
|
|
537
|
+
if case_Q:
|
|
538
|
+
row_num_next = self.cur_partitions[n-1].remove_cell(ell[n-1])
|
|
539
|
+
if case_S[n-1]:
|
|
540
|
+
row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1])
|
|
541
|
+
else:
|
|
542
|
+
row_num_bar_next = None
|
|
543
|
+
elif case_S[n-1]:
|
|
544
|
+
row_num_next = None
|
|
545
|
+
row_num_bar_next = self.cur_partitions[n-1].remove_cell(ell[2*n-1], 2)
|
|
546
|
+
else:
|
|
547
|
+
row_num_next = None
|
|
548
|
+
row_num_bar_next = None
|
|
549
|
+
|
|
550
|
+
self._update_vacancy_numbers(n - 2)
|
|
551
|
+
if row_num is not None:
|
|
552
|
+
self.cur_partitions[n-2].rigging[row_num] = self.cur_partitions[n-2].vacancy_numbers[row_num]
|
|
553
|
+
if row_num_bar is not None:
|
|
554
|
+
self.cur_partitions[n-2].rigging[row_num_bar] = self.cur_partitions[n-2].vacancy_numbers[row_num_bar]
|
|
555
|
+
|
|
556
|
+
self._update_vacancy_numbers(n - 1)
|
|
557
|
+
if height == n:
|
|
558
|
+
self._correct_vacancy_nums()
|
|
559
|
+
if row_num_next is not None:
|
|
560
|
+
self.cur_partitions[n-1].rigging[row_num_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_next]
|
|
561
|
+
if row_num_bar_next is not None:
|
|
562
|
+
if case_Q:
|
|
563
|
+
vac_num = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next]
|
|
564
|
+
self.cur_partitions[n-1].rigging[row_num_bar_next] = vac_num
|
|
565
|
+
block_len = self.cur_partitions[n-1][row_num_bar_next]
|
|
566
|
+
j = row_num_bar_next + 1
|
|
567
|
+
length = len(self.cur_partitions[n-1])
|
|
568
|
+
# Find the place for the quasisingular rigging
|
|
569
|
+
while j < length and self.cur_partitions[n-1][j] == block_len \
|
|
570
|
+
and self.cur_partitions[n-1].rigging[j] == vac_num:
|
|
571
|
+
j += 1
|
|
572
|
+
self.cur_partitions[n-1].rigging[j-1] = vac_num - 1
|
|
573
|
+
else:
|
|
574
|
+
self.cur_partitions[n-1].rigging[row_num_bar_next] = self.cur_partitions[n-1].vacancy_numbers[row_num_bar_next]
|
|
575
|
+
|
|
576
|
+
return b
|