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,728 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
r"""
|
|
3
|
+
Path tableaux
|
|
4
|
+
|
|
5
|
+
This is an abstract base class for using local rules to construct
|
|
6
|
+
rectification and the action of the cactus group [Wes2017]_.
|
|
7
|
+
|
|
8
|
+
This is a construction of the Henriques-Kamnitzer construction of
|
|
9
|
+
the action of the cactus group on tensor powers of a crystal. This is
|
|
10
|
+
also a generalisation of the Fomin growth rules, which are a version of
|
|
11
|
+
the operations on standard tableaux which were previously constructed
|
|
12
|
+
using jeu de taquin.
|
|
13
|
+
|
|
14
|
+
The basic operations are rectification, evacuation and promotion.
|
|
15
|
+
Rectification of standard skew tableaux agrees with the rectification
|
|
16
|
+
by jeu de taquin as does evacuation. Promotion agrees with promotion
|
|
17
|
+
by jeu de taquin on rectangular tableaux but in general they are different.
|
|
18
|
+
|
|
19
|
+
REFERENCES:
|
|
20
|
+
|
|
21
|
+
- [Wes2017]_
|
|
22
|
+
|
|
23
|
+
AUTHORS:
|
|
24
|
+
|
|
25
|
+
- Bruce Westbury (2018): initial version
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# ****************************************************************************
|
|
29
|
+
# Copyright (C) 2018 Bruce Westbury <bruce.westbury@gmail.com>,
|
|
30
|
+
#
|
|
31
|
+
# This program is free software: you can redistribute it and/or modify
|
|
32
|
+
# it under the terms of the GNU General Public License as published by
|
|
33
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
34
|
+
# (at your option) any later version.
|
|
35
|
+
# https://www.gnu.org/licenses/
|
|
36
|
+
# ****************************************************************************
|
|
37
|
+
|
|
38
|
+
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
|
|
39
|
+
from sage.misc.abstract_method import abstract_method
|
|
40
|
+
from sage.categories.sets_cat import Sets
|
|
41
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
42
|
+
from sage.structure.parent import Parent
|
|
43
|
+
#from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet_graded
|
|
44
|
+
from sage.structure.sage_object import SageObject
|
|
45
|
+
from sage.structure.list_clone import ClonableArray
|
|
46
|
+
from sage.misc.latex import latex
|
|
47
|
+
#from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
|
|
48
|
+
#from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class PathTableau(ClonableArray, metaclass=InheritComparisonClasscallMetaclass):
|
|
52
|
+
r"""
|
|
53
|
+
This is the abstract base class for a path tableau.
|
|
54
|
+
"""
|
|
55
|
+
@abstract_method
|
|
56
|
+
def local_rule(self, i):
|
|
57
|
+
r"""
|
|
58
|
+
This is the abstract local rule defined in any coboundary category.
|
|
59
|
+
|
|
60
|
+
This has input a list of objects. This method first takes
|
|
61
|
+
the list of objects of length three consisting of the `(i-1)`-st,
|
|
62
|
+
`i`-th and `(i+1)`-term and applies the rule. It then replaces
|
|
63
|
+
the `i`-th object by the object returned by the rule.
|
|
64
|
+
|
|
65
|
+
EXAMPLES::
|
|
66
|
+
|
|
67
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
68
|
+
sage: t.local_rule(3)
|
|
69
|
+
[0, 1, 2, 1, 2, 1, 0]
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
################################# Book Keeping ############################
|
|
73
|
+
|
|
74
|
+
def size(self):
|
|
75
|
+
r"""
|
|
76
|
+
Return the size or length of ``self``.
|
|
77
|
+
|
|
78
|
+
EXAMPLES::
|
|
79
|
+
|
|
80
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
81
|
+
sage: t.size()
|
|
82
|
+
7
|
|
83
|
+
"""
|
|
84
|
+
return len(self)
|
|
85
|
+
|
|
86
|
+
def initial_shape(self):
|
|
87
|
+
r"""
|
|
88
|
+
Return the initial shape of ``self``.
|
|
89
|
+
|
|
90
|
+
EXAMPLES::
|
|
91
|
+
|
|
92
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
93
|
+
sage: t.initial_shape()
|
|
94
|
+
0
|
|
95
|
+
"""
|
|
96
|
+
return self[0]
|
|
97
|
+
|
|
98
|
+
def final_shape(self):
|
|
99
|
+
r"""
|
|
100
|
+
Return the final shape of ``self``.
|
|
101
|
+
|
|
102
|
+
EXAMPLES::
|
|
103
|
+
|
|
104
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
105
|
+
sage: t.final_shape()
|
|
106
|
+
0
|
|
107
|
+
"""
|
|
108
|
+
return self[-1]
|
|
109
|
+
|
|
110
|
+
############################# Jeu de taquin ###############################
|
|
111
|
+
|
|
112
|
+
def promotion(self):
|
|
113
|
+
r"""
|
|
114
|
+
Return the promotion operator applied to ``self``.
|
|
115
|
+
|
|
116
|
+
EXAMPLES::
|
|
117
|
+
|
|
118
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
119
|
+
sage: t.promotion()
|
|
120
|
+
[0, 1, 2, 1, 0, 1, 0]
|
|
121
|
+
"""
|
|
122
|
+
with self.clone() as result:
|
|
123
|
+
for i in range(1,self.size()-1):
|
|
124
|
+
result = result.local_rule(i)
|
|
125
|
+
|
|
126
|
+
return result
|
|
127
|
+
|
|
128
|
+
def evacuation(self):
|
|
129
|
+
r"""
|
|
130
|
+
Return the evacuation operator applied to ``self``.
|
|
131
|
+
|
|
132
|
+
EXAMPLES::
|
|
133
|
+
|
|
134
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
135
|
+
sage: t.evacuation()
|
|
136
|
+
[0, 1, 2, 3, 2, 1, 0]
|
|
137
|
+
"""
|
|
138
|
+
if self.size() < 3:
|
|
139
|
+
return self
|
|
140
|
+
|
|
141
|
+
L = list(self)
|
|
142
|
+
result = []
|
|
143
|
+
P = self.parent()
|
|
144
|
+
for i in range(self.size()):
|
|
145
|
+
L = list(P(L).promotion())
|
|
146
|
+
result.append( L.pop() )
|
|
147
|
+
result.reverse()
|
|
148
|
+
return P(result)
|
|
149
|
+
|
|
150
|
+
def commutor(self, other, verbose=False):
|
|
151
|
+
r"""
|
|
152
|
+
Return the commutor of ``self`` with ``other``.
|
|
153
|
+
|
|
154
|
+
If ``verbose=True`` then the function will print
|
|
155
|
+
the rectangle.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
160
|
+
sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
|
|
161
|
+
sage: t1.commutor(t2)
|
|
162
|
+
([0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0])
|
|
163
|
+
sage: t1.commutor(t2,verbose=True)
|
|
164
|
+
[0, 1, 2, 1, 0]
|
|
165
|
+
[1, 2, 3, 2, 1]
|
|
166
|
+
[2, 3, 4, 3, 2]
|
|
167
|
+
[3, 4, 5, 4, 3]
|
|
168
|
+
[2, 3, 4, 3, 2]
|
|
169
|
+
[1, 2, 3, 2, 1]
|
|
170
|
+
[0, 1, 2, 1, 0]
|
|
171
|
+
([0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0])
|
|
172
|
+
|
|
173
|
+
TESTS::
|
|
174
|
+
|
|
175
|
+
sage: t1 = path_tableaux.DyckPath([])
|
|
176
|
+
sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
|
|
177
|
+
sage: t1.commutor(t2)
|
|
178
|
+
Traceback (most recent call last):
|
|
179
|
+
...
|
|
180
|
+
ValueError: this requires nonempty lists
|
|
181
|
+
sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
182
|
+
sage: t2 = path_tableaux.DyckPath([])
|
|
183
|
+
sage: t1.commutor(t2)
|
|
184
|
+
Traceback (most recent call last):
|
|
185
|
+
...
|
|
186
|
+
ValueError: this requires nonempty lists
|
|
187
|
+
sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1])
|
|
188
|
+
sage: t2 = path_tableaux.DyckPath([0,1,2,1,0])
|
|
189
|
+
sage: t1.commutor(t2)
|
|
190
|
+
Traceback (most recent call last):
|
|
191
|
+
...
|
|
192
|
+
ValueError: [0, 1, 2, 3, 2, 1], [0, 1, 2, 1, 0] is not a composable pair
|
|
193
|
+
"""
|
|
194
|
+
n = self.size()
|
|
195
|
+
m = len(other)
|
|
196
|
+
if n == 0 or m == 0:
|
|
197
|
+
raise ValueError("this requires nonempty lists")
|
|
198
|
+
if n == 1 or m == 1:
|
|
199
|
+
return (other, self)
|
|
200
|
+
|
|
201
|
+
P = self.parent()
|
|
202
|
+
|
|
203
|
+
row = list(other)
|
|
204
|
+
col = list(self)
|
|
205
|
+
if col[-1] != row[0]:
|
|
206
|
+
raise ValueError("%s, %s is not a composable pair" % (self,other))
|
|
207
|
+
|
|
208
|
+
path = P(col + row[1:])
|
|
209
|
+
|
|
210
|
+
for i in range(1,n):
|
|
211
|
+
if verbose:
|
|
212
|
+
print(path[n-i:n+m-i])
|
|
213
|
+
for j in range(m-1):
|
|
214
|
+
path = path.local_rule(n+j-i)
|
|
215
|
+
if verbose:
|
|
216
|
+
print(path[:m])
|
|
217
|
+
|
|
218
|
+
return (P(path[:m]), P(path[m-1:]))
|
|
219
|
+
|
|
220
|
+
def cactus(self, i, j):
|
|
221
|
+
r"""
|
|
222
|
+
Return the action of the generator `s_{i,j}` of the cactus
|
|
223
|
+
group on ``self``.
|
|
224
|
+
|
|
225
|
+
INPUT:
|
|
226
|
+
|
|
227
|
+
- ``i`` -- positive integer
|
|
228
|
+
- ``j`` -- positive integer weakly greater than `i`
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
233
|
+
sage: t.cactus(1,5)
|
|
234
|
+
[0, 1, 0, 1, 2, 1, 0]
|
|
235
|
+
|
|
236
|
+
sage: t.cactus(1,6)
|
|
237
|
+
[0, 1, 2, 1, 0, 1, 0]
|
|
238
|
+
|
|
239
|
+
sage: t.cactus(1,7) == t.evacuation()
|
|
240
|
+
True
|
|
241
|
+
sage: t.cactus(1,7).cactus(1,6) == t.promotion()
|
|
242
|
+
True
|
|
243
|
+
|
|
244
|
+
TESTS::
|
|
245
|
+
|
|
246
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
247
|
+
sage: t.cactus(1,8)
|
|
248
|
+
Traceback (most recent call last):
|
|
249
|
+
...
|
|
250
|
+
ValueError: integers out of bounds
|
|
251
|
+
sage: t.cactus(0,3)
|
|
252
|
+
Traceback (most recent call last):
|
|
253
|
+
...
|
|
254
|
+
ValueError: integers out of bounds
|
|
255
|
+
"""
|
|
256
|
+
if not 0 < i <= j <= self.size():
|
|
257
|
+
raise ValueError("integers out of bounds")
|
|
258
|
+
|
|
259
|
+
if i == j:
|
|
260
|
+
return self
|
|
261
|
+
|
|
262
|
+
if i == 1:
|
|
263
|
+
h = list(self)[:j]
|
|
264
|
+
t = list(self)[j:]
|
|
265
|
+
T = self.parent()(h)
|
|
266
|
+
L = list(T.evacuation()) + t
|
|
267
|
+
return self.parent()(L)
|
|
268
|
+
|
|
269
|
+
return self.cactus(1,j).cactus(1,j-i+1).cactus(1,j)
|
|
270
|
+
|
|
271
|
+
########################### Visualisation and checking ####################
|
|
272
|
+
|
|
273
|
+
def _test_involution_rule(self, **options):
|
|
274
|
+
"""
|
|
275
|
+
Check that the local rule gives an involution.
|
|
276
|
+
|
|
277
|
+
TESTS::
|
|
278
|
+
|
|
279
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
280
|
+
sage: t._test_involution_rule()
|
|
281
|
+
"""
|
|
282
|
+
tester = self._tester(**options)
|
|
283
|
+
for i in range(self.size()-2):
|
|
284
|
+
tester.assertEqual(self.local_rule(i+1).local_rule(i + 1), self)
|
|
285
|
+
|
|
286
|
+
def _test_involution_cactus(self, **options):
|
|
287
|
+
"""
|
|
288
|
+
Check that the cactus group generators are involutions.
|
|
289
|
+
|
|
290
|
+
TESTS::
|
|
291
|
+
|
|
292
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
293
|
+
sage: t._test_involution_cactus()
|
|
294
|
+
"""
|
|
295
|
+
tester = self._tester(**options)
|
|
296
|
+
for i in range(2, self.size()+1):
|
|
297
|
+
tester.assertEqual(self.cactus(1,i).cactus(1,i), self)
|
|
298
|
+
|
|
299
|
+
def _test_promotion(self, **options):
|
|
300
|
+
"""
|
|
301
|
+
Check that promotion can be expressed in terms of the cactus generators.
|
|
302
|
+
|
|
303
|
+
TESTS::
|
|
304
|
+
|
|
305
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
306
|
+
sage: t._test_promotion()
|
|
307
|
+
"""
|
|
308
|
+
tester = self._tester(**options)
|
|
309
|
+
n = self.size()
|
|
310
|
+
tester.assertEqual(self.cactus(1,n-1).cactus(1,n).promotion(), self)
|
|
311
|
+
|
|
312
|
+
def _test_commutation(self, **options):
|
|
313
|
+
"""
|
|
314
|
+
Check the commutation relations in the presentation of the cactus group.
|
|
315
|
+
|
|
316
|
+
TESTS::
|
|
317
|
+
|
|
318
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
319
|
+
sage: t._test_commutation()
|
|
320
|
+
"""
|
|
321
|
+
from itertools import combinations
|
|
322
|
+
tester = self._tester(**options)
|
|
323
|
+
|
|
324
|
+
n = self.size()
|
|
325
|
+
if n < 5:
|
|
326
|
+
return
|
|
327
|
+
for i,j,r,s in combinations(range(1,n+1), 4):
|
|
328
|
+
lhs = self.cactus(i, j).cactus(r, s)
|
|
329
|
+
rhs = self.cactus(r, s).cactus(i, j)
|
|
330
|
+
tester.assertEqual(lhs, rhs)
|
|
331
|
+
|
|
332
|
+
def _test_coboundary(self, **options):
|
|
333
|
+
"""
|
|
334
|
+
Check the coboundary relations in the presentation of the cactus group.
|
|
335
|
+
|
|
336
|
+
TESTS::
|
|
337
|
+
|
|
338
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
339
|
+
sage: t._test_coboundary()
|
|
340
|
+
"""
|
|
341
|
+
from itertools import combinations
|
|
342
|
+
tester = self._tester(**options)
|
|
343
|
+
|
|
344
|
+
n = self.size()
|
|
345
|
+
if n < 4:
|
|
346
|
+
return
|
|
347
|
+
for i,j,r,s in combinations(range(1,n+3), 4):
|
|
348
|
+
lhs = self.cactus(i, s-2).cactus(j-1, r-1)
|
|
349
|
+
rhs = self.cactus(i+s-r-1, i+s-j-1).cactus(i, s-2)
|
|
350
|
+
tester.assertEqual(lhs, rhs)
|
|
351
|
+
|
|
352
|
+
def orbit(self):
|
|
353
|
+
r"""
|
|
354
|
+
Return the orbit of ``self`` under the action of the cactus group.
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
359
|
+
sage: t.orbit()
|
|
360
|
+
{[0, 1, 0, 1, 0, 1, 0],
|
|
361
|
+
[0, 1, 0, 1, 2, 1, 0],
|
|
362
|
+
[0, 1, 2, 1, 0, 1, 0],
|
|
363
|
+
[0, 1, 2, 1, 2, 1, 0],
|
|
364
|
+
[0, 1, 2, 3, 2, 1, 0]}
|
|
365
|
+
"""
|
|
366
|
+
orb = set()
|
|
367
|
+
rec = set([self])
|
|
368
|
+
while rec:
|
|
369
|
+
new = set()
|
|
370
|
+
for a in rec:
|
|
371
|
+
for i in range(2, self.size()):
|
|
372
|
+
b = a.cactus(1, i)
|
|
373
|
+
if (b not in orb) and (b not in rec):
|
|
374
|
+
new.add(b)
|
|
375
|
+
orb = orb.union(rec)
|
|
376
|
+
rec = new.copy()
|
|
377
|
+
|
|
378
|
+
return orb
|
|
379
|
+
|
|
380
|
+
def dual_equivalence_graph(self):
|
|
381
|
+
r"""
|
|
382
|
+
Return the graph with vertices the orbit of ``self``
|
|
383
|
+
and edges given by the action of the cactus group generators.
|
|
384
|
+
|
|
385
|
+
In most implementations the generators `s_{i,i+1}` will act
|
|
386
|
+
as the identity operators. The usual dual equivalence graphs
|
|
387
|
+
are given by replacing the label `i,i+2` by `i` and removing
|
|
388
|
+
edges with other labels.
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: s = path_tableaux.DyckPath([0,1,2,3,2,3,2,1,0])
|
|
393
|
+
sage: s.dual_equivalence_graph().adjacency_matrix() # needs sage.graphs sage.modules
|
|
394
|
+
[0 1 1 1 0 1 0 1 1 0 0 0 0 0]
|
|
395
|
+
[1 0 1 1 1 1 1 0 1 0 0 1 1 0]
|
|
396
|
+
[1 1 0 1 1 1 0 1 0 1 1 1 0 0]
|
|
397
|
+
[1 1 1 0 1 0 1 1 1 1 0 1 1 0]
|
|
398
|
+
[0 1 1 1 0 0 1 0 0 1 1 0 1 1]
|
|
399
|
+
[1 1 1 0 0 0 1 1 1 1 1 0 1 0]
|
|
400
|
+
[0 1 0 1 1 1 0 1 0 1 1 1 0 1]
|
|
401
|
+
[1 0 1 1 0 1 1 0 1 1 1 1 1 0]
|
|
402
|
+
[1 1 0 1 0 1 0 1 0 1 0 1 1 0]
|
|
403
|
+
[0 0 1 1 1 1 1 1 1 0 0 1 1 1]
|
|
404
|
+
[0 0 1 0 1 1 1 1 0 0 0 1 1 1]
|
|
405
|
+
[0 1 1 1 0 0 1 1 1 1 1 0 1 1]
|
|
406
|
+
[0 1 0 1 1 1 0 1 1 1 1 1 0 1]
|
|
407
|
+
[0 0 0 0 1 0 1 0 0 1 1 1 1 0]
|
|
408
|
+
sage: s = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
409
|
+
sage: s.dual_equivalence_graph().edges(sort=True) # needs sage.graphs
|
|
410
|
+
[([0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 2, 1, 0], '4,7'),
|
|
411
|
+
([0, 1, 0, 1, 0, 1, 0], [0, 1, 2, 1, 0, 1, 0], '2,5'),
|
|
412
|
+
([0, 1, 0, 1, 0, 1, 0], [0, 1, 2, 1, 2, 1, 0], '2,7'),
|
|
413
|
+
([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 1, 0, 1, 0], '2,6'),
|
|
414
|
+
([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 1, 2, 1, 0], '1,4'),
|
|
415
|
+
([0, 1, 0, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0], '2,7'),
|
|
416
|
+
([0, 1, 2, 1, 0, 1, 0], [0, 1, 2, 1, 2, 1, 0], '4,7'),
|
|
417
|
+
([0, 1, 2, 1, 0, 1, 0], [0, 1, 2, 3, 2, 1, 0], '3,7'),
|
|
418
|
+
([0, 1, 2, 1, 2, 1, 0], [0, 1, 2, 3, 2, 1, 0], '3,6')]
|
|
419
|
+
"""
|
|
420
|
+
from sage.graphs.graph import Graph
|
|
421
|
+
from itertools import combinations
|
|
422
|
+
|
|
423
|
+
G = Graph()
|
|
424
|
+
orb = self.orbit()
|
|
425
|
+
|
|
426
|
+
for a in orb:
|
|
427
|
+
for i,j in combinations(range(1,self.size()+1),2):
|
|
428
|
+
b = a.cactus(i,j)
|
|
429
|
+
if a != b:
|
|
430
|
+
G.add_edge(a,b,"%d,%d" % (i,j))
|
|
431
|
+
return G
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
class PathTableaux(UniqueRepresentation,Parent):
|
|
435
|
+
"""
|
|
436
|
+
The abstract parent class for PathTableau.
|
|
437
|
+
"""
|
|
438
|
+
|
|
439
|
+
def __init__(self):
|
|
440
|
+
"""
|
|
441
|
+
Initialize ``self``.
|
|
442
|
+
|
|
443
|
+
TESTS::
|
|
444
|
+
|
|
445
|
+
sage: t = path_tableaux.DyckPaths()
|
|
446
|
+
sage: TestSuite(t).run()
|
|
447
|
+
|
|
448
|
+
sage: f = path_tableaux.FriezePatterns(QQ)
|
|
449
|
+
sage: TestSuite(f).run()
|
|
450
|
+
"""
|
|
451
|
+
Parent.__init__(self, category=Sets())
|
|
452
|
+
|
|
453
|
+
def _element_constructor_(self, *args, **kwds):
|
|
454
|
+
r"""
|
|
455
|
+
Construct an object as an element of ``self``, if possible.
|
|
456
|
+
|
|
457
|
+
TESTS::
|
|
458
|
+
|
|
459
|
+
sage: path_tableaux.DyckPath([0,1,2,1,0]) # indirect doctest
|
|
460
|
+
[0, 1, 2, 1, 0]
|
|
461
|
+
"""
|
|
462
|
+
return self.element_class(self, *args, **kwds)
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
class CylindricalDiagram(SageObject):
|
|
466
|
+
r"""
|
|
467
|
+
Cylindrical growth diagrams.
|
|
468
|
+
|
|
469
|
+
EXAMPLES::
|
|
470
|
+
|
|
471
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
472
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
473
|
+
[0, 1, 2, 3, 2, 1, 0]
|
|
474
|
+
[ , 0, 1, 2, 1, 0, 1, 0]
|
|
475
|
+
[ , , 0, 1, 0, 1, 2, 1, 0]
|
|
476
|
+
[ , , , 0, 1, 2, 3, 2, 1, 0]
|
|
477
|
+
[ , , , , 0, 1, 2, 1, 0, 1, 0]
|
|
478
|
+
[ , , , , , 0, 1, 0, 1, 2, 1, 0]
|
|
479
|
+
[ , , , , , , 0, 1, 2, 3, 2, 1, 0]
|
|
480
|
+
"""
|
|
481
|
+
|
|
482
|
+
def __init__(self, T):
|
|
483
|
+
"""
|
|
484
|
+
Initialize ``self`` from the
|
|
485
|
+
:class:`~sage.combinat.path_tableaux.path_tableau.PathTableau`
|
|
486
|
+
object ``T``.
|
|
487
|
+
|
|
488
|
+
TESTS::
|
|
489
|
+
|
|
490
|
+
sage: T = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
491
|
+
sage: D = path_tableaux.CylindricalDiagram(T)
|
|
492
|
+
sage: TestSuite(D).run()
|
|
493
|
+
|
|
494
|
+
sage: path_tableaux.CylindricalDiagram(2)
|
|
495
|
+
Traceback (most recent call last):
|
|
496
|
+
...
|
|
497
|
+
ValueError: 2 must be a path tableau
|
|
498
|
+
"""
|
|
499
|
+
if not isinstance(T, PathTableau):
|
|
500
|
+
raise ValueError('{0} must be a path tableau'.format(str(T)))
|
|
501
|
+
n = len(T)
|
|
502
|
+
result = [[None]*(2*n-1)] * n
|
|
503
|
+
for i in range(n):
|
|
504
|
+
result[i] = [""]*i + list(T)
|
|
505
|
+
T = T.promotion()
|
|
506
|
+
|
|
507
|
+
self.path_tableau = T
|
|
508
|
+
self.diagram = result
|
|
509
|
+
|
|
510
|
+
def _repr_(self):
|
|
511
|
+
r"""
|
|
512
|
+
Return a string representation of ``self``.
|
|
513
|
+
|
|
514
|
+
TESTS::
|
|
515
|
+
|
|
516
|
+
sage: cd = path_tableaux.CylindricalDiagram(path_tableaux.DyckPath([0,1,2,1,2,1,0]))
|
|
517
|
+
sage: repr(cd) == cd._repr_() # indirect test
|
|
518
|
+
True
|
|
519
|
+
|
|
520
|
+
sage: cd = path_tableaux.CylindricalDiagram(path_tableaux.FriezePattern([1,3,4,5,1]))
|
|
521
|
+
sage: repr(cd) == cd._repr_() # indirect test
|
|
522
|
+
True
|
|
523
|
+
|
|
524
|
+
sage: print(path_tableaux.DyckPath([0,1,2,1,2,1,0])) # indirect test
|
|
525
|
+
[0, 1, 2, 1, 2, 1, 0]
|
|
526
|
+
|
|
527
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
528
|
+
sage: path_tableaux.CylindricalDiagram(t)
|
|
529
|
+
[0, 1, 2, 3, 2, 1, 0]
|
|
530
|
+
[ , 0, 1, 2, 1, 0, 1, 0]
|
|
531
|
+
[ , , 0, 1, 0, 1, 2, 1, 0]
|
|
532
|
+
[ , , , 0, 1, 2, 3, 2, 1, 0]
|
|
533
|
+
[ , , , , 0, 1, 2, 1, 0, 1, 0]
|
|
534
|
+
[ , , , , , 0, 1, 0, 1, 2, 1, 0]
|
|
535
|
+
[ , , , , , , 0, 1, 2, 3, 2, 1, 0]
|
|
536
|
+
"""
|
|
537
|
+
data = [[str(x) for x in row] for row in self.diagram]
|
|
538
|
+
if not data[0]:
|
|
539
|
+
data[0] = [''] # Put sometime there
|
|
540
|
+
max_width = max(max(len(x) for x in row) for row in data if row)
|
|
541
|
+
return '\n'.join('[' + ', '.join(' '*(max_width-len(x)) + x for x in row)
|
|
542
|
+
+ ']' for row in data)
|
|
543
|
+
|
|
544
|
+
def __eq__(self, other):
|
|
545
|
+
"""
|
|
546
|
+
Check equality.
|
|
547
|
+
|
|
548
|
+
EXAMPLES::
|
|
549
|
+
|
|
550
|
+
sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
551
|
+
sage: T1 = path_tableaux.CylindricalDiagram(t1)
|
|
552
|
+
sage: t2 = path_tableaux.DyckPath([0,1,2,1,2,1,0])
|
|
553
|
+
sage: T2 = path_tableaux.CylindricalDiagram(t2)
|
|
554
|
+
sage: T1 == T2
|
|
555
|
+
False
|
|
556
|
+
sage: T1 == path_tableaux.CylindricalDiagram(t1)
|
|
557
|
+
True
|
|
558
|
+
"""
|
|
559
|
+
return isinstance(other, CylindricalDiagram) and self.diagram == other.diagram
|
|
560
|
+
|
|
561
|
+
def __ne__(self, other):
|
|
562
|
+
"""
|
|
563
|
+
Check inequality.
|
|
564
|
+
|
|
565
|
+
EXAMPLES::
|
|
566
|
+
|
|
567
|
+
sage: t1 = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
568
|
+
sage: T1 = path_tableaux.CylindricalDiagram(t1)
|
|
569
|
+
sage: t2 = path_tableaux.DyckPath([0,1,2,1,2,1,0])
|
|
570
|
+
sage: T2 = path_tableaux.CylindricalDiagram(t2)
|
|
571
|
+
sage: T1 != T2
|
|
572
|
+
True
|
|
573
|
+
sage: T1 != path_tableaux.CylindricalDiagram(t1)
|
|
574
|
+
False
|
|
575
|
+
"""
|
|
576
|
+
return not (self == other)
|
|
577
|
+
|
|
578
|
+
def _latex_(self):
|
|
579
|
+
r"""
|
|
580
|
+
Return a `\LaTeX` representation of ``self``.
|
|
581
|
+
|
|
582
|
+
EXAMPLES::
|
|
583
|
+
|
|
584
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
585
|
+
sage: latex(path_tableaux.CylindricalDiagram(t))
|
|
586
|
+
\begin{array}{ccccccccccccc}
|
|
587
|
+
0 & 1 & 2 & 3 & 2 & 1 & 0\\
|
|
588
|
+
& 0 & 1 & 2 & 1 & 0 & 1 & 0\\
|
|
589
|
+
& & 0 & 1 & 0 & 1 & 2 & 1 & 0\\
|
|
590
|
+
& & & 0 & 1 & 2 & 3 & 2 & 1 & 0\\
|
|
591
|
+
& & & & 0 & 1 & 2 & 1 & 0 & 1 & 0\\
|
|
592
|
+
& & & & & 0 & 1 & 0 & 1 & 2 & 1 & 0\\
|
|
593
|
+
& & & & & & 0 & 1 & 2 & 3 & 2 & 1 & 0
|
|
594
|
+
\end{array}
|
|
595
|
+
|
|
596
|
+
sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
|
|
597
|
+
sage: latex(path_tableaux.CylindricalDiagram(t))
|
|
598
|
+
\begin{array}{ccccccccccccc}
|
|
599
|
+
0 & 1 & 3 & 4 & 5 & 1 & 0\\
|
|
600
|
+
& 0 & 1 & \frac{5}{3} & \frac{7}{3} & \frac{2}{3} & 1 & 0\\
|
|
601
|
+
& & 0 & 1 & 2 & 1 & 3 & 1 & 0\\
|
|
602
|
+
& & & 0 & 1 & 1 & 4 & \frac{5}{3} & 1 & 0\\
|
|
603
|
+
& & & & 0 & 1 & 5 & \frac{7}{3} & 2 & 1 & 0\\
|
|
604
|
+
& & & & & 0 & 1 & \frac{2}{3} & 1 & 1 & 1 & 0\\
|
|
605
|
+
& & & & & & 0 & 1 & 3 & 4 & 5 & 1 & 0
|
|
606
|
+
\end{array}
|
|
607
|
+
"""
|
|
608
|
+
D = self.diagram
|
|
609
|
+
m = len(D[-1])
|
|
610
|
+
result = "\\begin{array}{"+"c"*m + "}\n"
|
|
611
|
+
result += "\\\\ \n".join( " & ".join(latex(a) for a in x) for x in D )
|
|
612
|
+
result += "\n \\end{array}\n"
|
|
613
|
+
return result
|
|
614
|
+
|
|
615
|
+
def __len__(self):
|
|
616
|
+
r"""
|
|
617
|
+
Return the length of ``self``.
|
|
618
|
+
|
|
619
|
+
TESTS::
|
|
620
|
+
|
|
621
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
622
|
+
sage: len(path_tableaux.CylindricalDiagram(t))
|
|
623
|
+
7
|
|
624
|
+
"""
|
|
625
|
+
return len(self.diagram)
|
|
626
|
+
|
|
627
|
+
def _ascii_art_(self):
|
|
628
|
+
r"""
|
|
629
|
+
Return an ascii art representation of ``self``.
|
|
630
|
+
|
|
631
|
+
TESTS::
|
|
632
|
+
|
|
633
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
634
|
+
sage: ascii_art(path_tableaux.CylindricalDiagram(t))
|
|
635
|
+
0 1 2 3 2 1 0
|
|
636
|
+
0 1 2 1 0 1 0
|
|
637
|
+
0 1 0 1 2 1 0
|
|
638
|
+
0 1 2 3 2 1 0
|
|
639
|
+
0 1 2 1 0 1 0
|
|
640
|
+
0 1 0 1 2 1 0
|
|
641
|
+
0 1 2 3 2 1 0
|
|
642
|
+
|
|
643
|
+
sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
|
|
644
|
+
sage: ascii_art(path_tableaux.CylindricalDiagram(t))
|
|
645
|
+
0 1 3 4 5 1 0
|
|
646
|
+
0 1 5/3 7/3 2/3 1 0
|
|
647
|
+
0 1 2 1 3 1 0
|
|
648
|
+
0 1 1 4 5/3 1 0
|
|
649
|
+
0 1 5 7/3 2 1 0
|
|
650
|
+
0 1 2/3 1 1 1 0
|
|
651
|
+
0 1 3 4 5 1 0
|
|
652
|
+
"""
|
|
653
|
+
from sage.typeset.ascii_art import ascii_art
|
|
654
|
+
from sage.misc.misc_c import prod
|
|
655
|
+
data = [[ascii_art(x) for x in row] for row in self.diagram]
|
|
656
|
+
if not data[0]:
|
|
657
|
+
data[0] = [ascii_art('')] # Put sometime there
|
|
658
|
+
max_width = max(max(len(x) for x in row) for row in data if row)
|
|
659
|
+
return prod((sum((ascii_art(' '*(max_width-len(x)+1)) + x for x in row), ascii_art(''))
|
|
660
|
+
for row in data), ascii_art(''))
|
|
661
|
+
|
|
662
|
+
def _unicode_art_(self):
|
|
663
|
+
r"""
|
|
664
|
+
Return a unicode art representation of ``self``.
|
|
665
|
+
|
|
666
|
+
TESTS::
|
|
667
|
+
|
|
668
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
669
|
+
sage: unicode_art(path_tableaux.CylindricalDiagram(t))
|
|
670
|
+
0 1 2 3 2 1 0
|
|
671
|
+
0 1 2 1 0 1 0
|
|
672
|
+
0 1 0 1 2 1 0
|
|
673
|
+
0 1 2 3 2 1 0
|
|
674
|
+
0 1 2 1 0 1 0
|
|
675
|
+
0 1 0 1 2 1 0
|
|
676
|
+
0 1 2 3 2 1 0
|
|
677
|
+
|
|
678
|
+
sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
|
|
679
|
+
sage: unicode_art(path_tableaux.CylindricalDiagram(t))
|
|
680
|
+
0 1 3 4 5 1 0
|
|
681
|
+
0 1 5/3 7/3 2/3 1 0
|
|
682
|
+
0 1 2 1 3 1 0
|
|
683
|
+
0 1 1 4 5/3 1 0
|
|
684
|
+
0 1 5 7/3 2 1 0
|
|
685
|
+
0 1 2/3 1 1 1 0
|
|
686
|
+
0 1 3 4 5 1 0
|
|
687
|
+
"""
|
|
688
|
+
from sage.typeset.unicode_art import unicode_art
|
|
689
|
+
from sage.misc.misc_c import prod
|
|
690
|
+
data = [[unicode_art(x) for x in row] for row in self.diagram]
|
|
691
|
+
if not data[0]:
|
|
692
|
+
data[0] = [unicode_art('')] # Put sometime there
|
|
693
|
+
max_width = max(max(len(x) for x in row) for row in data if row)
|
|
694
|
+
return prod((sum((unicode_art(' '*(max_width-len(x)+1)) + x for x in row), unicode_art(''))
|
|
695
|
+
for row in data), unicode_art(''))
|
|
696
|
+
|
|
697
|
+
def pp(self):
|
|
698
|
+
r"""
|
|
699
|
+
A pretty print utility method.
|
|
700
|
+
|
|
701
|
+
EXAMPLES::
|
|
702
|
+
|
|
703
|
+
sage: t = path_tableaux.DyckPath([0,1,2,3,2,1,0])
|
|
704
|
+
sage: path_tableaux.CylindricalDiagram(t).pp()
|
|
705
|
+
0 1 2 3 2 1 0
|
|
706
|
+
0 1 2 1 0 1 0
|
|
707
|
+
0 1 0 1 2 1 0
|
|
708
|
+
0 1 2 3 2 1 0
|
|
709
|
+
0 1 2 1 0 1 0
|
|
710
|
+
0 1 0 1 2 1 0
|
|
711
|
+
0 1 2 3 2 1 0
|
|
712
|
+
|
|
713
|
+
sage: t = path_tableaux.FriezePattern([1,3,4,5,1])
|
|
714
|
+
sage: path_tableaux.CylindricalDiagram(t).pp()
|
|
715
|
+
0 1 3 4 5 1 0
|
|
716
|
+
0 1 5/3 7/3 2/3 1 0
|
|
717
|
+
0 1 2 1 3 1 0
|
|
718
|
+
0 1 1 4 5/3 1 0
|
|
719
|
+
0 1 5 7/3 2 1 0
|
|
720
|
+
0 1 2/3 1 1 1 0
|
|
721
|
+
0 1 3 4 5 1 0
|
|
722
|
+
"""
|
|
723
|
+
data = [[str(x) for x in row] for row in self.diagram]
|
|
724
|
+
if not data[0]:
|
|
725
|
+
data[0] = [''] # Put sometime there
|
|
726
|
+
max_width = max(max(len(x) for x in row) for row in data if row)
|
|
727
|
+
print('\n'.join(' '.join(' '*(max_width-len(x)) + x for x in row)
|
|
728
|
+
for row in data))
|