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,685 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.combinat sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Blob algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2020-05-16): Initial version
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2020 Travis Scrimshaw <tcscrims at gmail.com>
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
|
+
# ****************************************************************************
|
|
20
|
+
|
|
21
|
+
from sage.categories.algebras import Algebras
|
|
22
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
23
|
+
from sage.combinat.diagram_algebras import (TemperleyLiebDiagrams, diagram_latex,
|
|
24
|
+
TL_diagram_ascii_art)
|
|
25
|
+
from sage.combinat.dyck_word import DyckWords
|
|
26
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
27
|
+
from sage.combinat.subset import powerset
|
|
28
|
+
from sage.misc.cachefunc import cached_method
|
|
29
|
+
from sage.rings.integer import Integer
|
|
30
|
+
from sage.structure.element import Element, get_coercion_model
|
|
31
|
+
from sage.structure.parent import Parent
|
|
32
|
+
from sage.structure.richcmp import richcmp
|
|
33
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class BlobDiagram(Element):
|
|
37
|
+
r"""
|
|
38
|
+
A blob diagram.
|
|
39
|
+
|
|
40
|
+
A blob diagram consists of a perfect matching of the set
|
|
41
|
+
`\{1, \ldots, n\} \sqcup \{-1, \ldots, -n\}` such that the result
|
|
42
|
+
is a noncrossing matching (a :class:`Temperley-Lieb diagram
|
|
43
|
+
<sage.combinat.diagram_algebras.TemperleyLiebDiagram>`), divided
|
|
44
|
+
into two sets of pairs: one for the pairs with blobs and one for
|
|
45
|
+
those without. The blobed pairs must either be either the leftmost
|
|
46
|
+
propagating strand or to the left of it and not nested.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, parent, marked, unmarked):
|
|
50
|
+
r"""
|
|
51
|
+
Initialize ``self``.
|
|
52
|
+
|
|
53
|
+
TESTS::
|
|
54
|
+
|
|
55
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
56
|
+
sage: BD4 = BlobDiagrams(4)
|
|
57
|
+
sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
|
|
58
|
+
sage: TestSuite(B).run()
|
|
59
|
+
"""
|
|
60
|
+
Element.__init__(self, parent)
|
|
61
|
+
self.marked = tuple(sorted([tuple(sorted(pair)) for pair in marked]))
|
|
62
|
+
self.unmarked = tuple(sorted([tuple(sorted(pair)) for pair in unmarked]))
|
|
63
|
+
|
|
64
|
+
def _repr_(self):
|
|
65
|
+
r"""
|
|
66
|
+
Return a string representation of ``self``.
|
|
67
|
+
|
|
68
|
+
EXAMPLES::
|
|
69
|
+
|
|
70
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
71
|
+
sage: BD4 = BlobDiagrams(4)
|
|
72
|
+
sage: BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
|
|
73
|
+
({{-3, 1}}, {{-4, 2}, {-2, -1}, {3, 4}})
|
|
74
|
+
"""
|
|
75
|
+
return '({{{}}}, {{{}}})'.format(', '.join('{' + repr(X)[1:-1] + '}'
|
|
76
|
+
for X in self.marked),
|
|
77
|
+
', '.join('{' + repr(X)[1:-1] + '}'
|
|
78
|
+
for X in self.unmarked))
|
|
79
|
+
|
|
80
|
+
def __hash__(self):
|
|
81
|
+
r"""
|
|
82
|
+
Return the hash of ``self``.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
87
|
+
sage: BD4 = BlobDiagrams(4)
|
|
88
|
+
sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
|
|
89
|
+
sage: hash(B) in [hash(D) for D in BD4]
|
|
90
|
+
True
|
|
91
|
+
sage: len(set([hash(D) for D in BD4])) == len(BD4)
|
|
92
|
+
True
|
|
93
|
+
"""
|
|
94
|
+
return hash((self.marked, self.unmarked))
|
|
95
|
+
|
|
96
|
+
def _richcmp_(self, other, op):
|
|
97
|
+
r"""
|
|
98
|
+
Compare ``self`` to ``other`` with operation ``op``.
|
|
99
|
+
|
|
100
|
+
EXAMPLES::
|
|
101
|
+
|
|
102
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
103
|
+
sage: BD4 = BlobDiagrams(4)
|
|
104
|
+
sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
|
|
105
|
+
sage: any(B == D for D in BD4)
|
|
106
|
+
True
|
|
107
|
+
sage: B2 = BD4([], [[1,-3], [2,-4], [3,4], [-1,-2]])
|
|
108
|
+
sage: B == B2
|
|
109
|
+
False
|
|
110
|
+
sage: B != B2
|
|
111
|
+
True
|
|
112
|
+
sage: sorted(BlobDiagrams(3))
|
|
113
|
+
[({}, {{-3, -2}, {-1, 1}, {2, 3}}),
|
|
114
|
+
({}, {{-3, -2}, {-1, 3}, {1, 2}}),
|
|
115
|
+
({}, {{-3, 1}, {-2, -1}, {2, 3}}),
|
|
116
|
+
({}, {{-3, 3}, {-2, -1}, {1, 2}}),
|
|
117
|
+
({}, {{-3, 3}, {-2, 2}, {-1, 1}}),
|
|
118
|
+
({{-3, 1}}, {{-2, -1}, {2, 3}}),
|
|
119
|
+
({{-3, 3}}, {{-2, -1}, {1, 2}}),
|
|
120
|
+
({{-2, -1}}, {{-3, 1}, {2, 3}}),
|
|
121
|
+
({{-2, -1}}, {{-3, 3}, {1, 2}}),
|
|
122
|
+
({{-1, 1}}, {{-3, -2}, {2, 3}}),
|
|
123
|
+
({{-1, 1}}, {{-3, 3}, {-2, 2}}),
|
|
124
|
+
({{-1, 3}}, {{-3, -2}, {1, 2}}),
|
|
125
|
+
({{1, 2}}, {{-3, -2}, {-1, 3}}),
|
|
126
|
+
({{1, 2}}, {{-3, 3}, {-2, -1}}),
|
|
127
|
+
({{-3, 1}, {-2, -1}}, {{2, 3}}),
|
|
128
|
+
({{-3, 3}, {-2, -1}}, {{1, 2}}),
|
|
129
|
+
({{-3, 3}, {1, 2}}, {{-2, -1}}),
|
|
130
|
+
({{-2, -1}, {1, 2}}, {{-3, 3}}),
|
|
131
|
+
({{-1, 3}, {1, 2}}, {{-3, -2}}),
|
|
132
|
+
({{-3, 3}, {-2, -1}, {1, 2}}, {})]
|
|
133
|
+
"""
|
|
134
|
+
return richcmp((len(self.marked), self.marked, self.unmarked),
|
|
135
|
+
(len(other.marked), other.marked, other.unmarked),
|
|
136
|
+
op)
|
|
137
|
+
|
|
138
|
+
def temperley_lieb_diagram(self):
|
|
139
|
+
r"""
|
|
140
|
+
Return the Temperley-Lieb diagram corresponding to ``self``.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
145
|
+
sage: BD4 = BlobDiagrams(4)
|
|
146
|
+
sage: B = BD4([[1,-3]], [[2,-4], [3,4], [-1,-2]])
|
|
147
|
+
sage: B.temperley_lieb_diagram()
|
|
148
|
+
{{-4, 2}, {-3, 1}, {-2, -1}, {3, 4}}
|
|
149
|
+
"""
|
|
150
|
+
return self.parent()._TL_diagrams(self.marked + self.unmarked)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class BlobDiagrams(Parent, UniqueRepresentation):
|
|
154
|
+
r"""
|
|
155
|
+
The set of all blob diagrams.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
def __init__(self, n):
|
|
159
|
+
r"""
|
|
160
|
+
Initialize ``self``.
|
|
161
|
+
|
|
162
|
+
TESTS::
|
|
163
|
+
|
|
164
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
165
|
+
sage: BD4 = BlobDiagrams(4)
|
|
166
|
+
sage: TestSuite(BD4).run()
|
|
167
|
+
"""
|
|
168
|
+
self._n = Integer(n)
|
|
169
|
+
self._TL_diagrams = TemperleyLiebDiagrams(n)
|
|
170
|
+
Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
171
|
+
|
|
172
|
+
def _repr_(self):
|
|
173
|
+
r"""
|
|
174
|
+
Return a string representation of ``self``.
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
179
|
+
sage: BlobDiagrams(4)
|
|
180
|
+
Blob diagrams of order 4
|
|
181
|
+
"""
|
|
182
|
+
return f"Blob diagrams of order {self._n}"
|
|
183
|
+
|
|
184
|
+
def cardinality(self):
|
|
185
|
+
r"""
|
|
186
|
+
Return the cardinality of ``self``.
|
|
187
|
+
|
|
188
|
+
EXAMPLES::
|
|
189
|
+
|
|
190
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
191
|
+
sage: BD4 = BlobDiagrams(4)
|
|
192
|
+
sage: BD4.cardinality()
|
|
193
|
+
70
|
|
194
|
+
"""
|
|
195
|
+
return (2 * self._n).binomial(self._n)
|
|
196
|
+
|
|
197
|
+
def order(self):
|
|
198
|
+
r"""
|
|
199
|
+
Return the order of ``self``.
|
|
200
|
+
|
|
201
|
+
EXAMPLES::
|
|
202
|
+
|
|
203
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
204
|
+
sage: BD4 = BlobDiagrams(4)
|
|
205
|
+
sage: BD4.order()
|
|
206
|
+
4
|
|
207
|
+
"""
|
|
208
|
+
return self._n
|
|
209
|
+
|
|
210
|
+
@cached_method
|
|
211
|
+
def base_set(self):
|
|
212
|
+
r"""
|
|
213
|
+
Return the base set of ``self``.
|
|
214
|
+
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
218
|
+
sage: BD4 = BlobDiagrams(4)
|
|
219
|
+
sage: sorted(BD4.base_set())
|
|
220
|
+
[-4, -3, -2, -1, 1, 2, 3, 4]
|
|
221
|
+
"""
|
|
222
|
+
return frozenset(range(1, self._n + 1)).union(range(-self._n, 0))
|
|
223
|
+
|
|
224
|
+
def _element_constructor_(self, marked, unmarked=None):
|
|
225
|
+
r"""
|
|
226
|
+
Construct an element of ``self``.
|
|
227
|
+
|
|
228
|
+
EXAMPLES::
|
|
229
|
+
|
|
230
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
231
|
+
sage: BD4 = BlobDiagrams(4)
|
|
232
|
+
sage: BD4([[1,-3]], [[-1,-2], [2,3], [-4,4]])
|
|
233
|
+
({{-3, 1}}, {{-4, 4}, {-2, -1}, {2, 3}})
|
|
234
|
+
sage: BD4([[(1,-3)], ([-1,-2], (2,3), [-4,4])])
|
|
235
|
+
({{-3, 1}}, {{-4, 4}, {-2, -1}, {2, 3}})
|
|
236
|
+
"""
|
|
237
|
+
if unmarked is None:
|
|
238
|
+
marked, unmarked = marked
|
|
239
|
+
ret = self.element_class(self, marked, unmarked)
|
|
240
|
+
if ret not in self:
|
|
241
|
+
raise ValueError("not a blob diagram of order {}".format(self._n))
|
|
242
|
+
return ret
|
|
243
|
+
|
|
244
|
+
def __contains__(self, X):
|
|
245
|
+
r"""
|
|
246
|
+
Check if ``X`` is contained in ``self``.
|
|
247
|
+
|
|
248
|
+
EXAMPLES::
|
|
249
|
+
|
|
250
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
251
|
+
sage: BD4 = BlobDiagrams(4)
|
|
252
|
+
sage: BD4([[1,-3], [-1,-2]], [[2,-4], [3,4]]) # indirect doctest
|
|
253
|
+
({{-3, 1}, {-2, -1}}, {{-4, 2}, {3, 4}})
|
|
254
|
+
sage: BD4([[1,4], [-1,-2], [-3,-4]], [[2,3]]) # indirect doctest
|
|
255
|
+
({{-4, -3}, {-2, -1}, {1, 4}}, {{2, 3}})
|
|
256
|
+
|
|
257
|
+
sage: BD4([[1,-2], [-1,-3]], [[2,-4], [3,4]]) # crossing strands
|
|
258
|
+
Traceback (most recent call last):
|
|
259
|
+
...
|
|
260
|
+
ValueError: not a blob diagram of order 4
|
|
261
|
+
sage: BD4([[1,-4], [-1,-2]], [[2,-3], [3,4]]) # crossing strands
|
|
262
|
+
Traceback (most recent call last):
|
|
263
|
+
...
|
|
264
|
+
ValueError: not a blob diagram of order 4
|
|
265
|
+
sage: BD4([[1,-2], [-1,-3]], [[3,-4], [2,4]]) # crossing strands
|
|
266
|
+
Traceback (most recent call last):
|
|
267
|
+
...
|
|
268
|
+
ValueError: not a blob diagram of order 4
|
|
269
|
+
sage: BD4([[1,-3], [-1,-2], [3,4]], [[2,-4]]) # trapped blob cup
|
|
270
|
+
Traceback (most recent call last):
|
|
271
|
+
...
|
|
272
|
+
ValueError: not a blob diagram of order 4
|
|
273
|
+
sage: BD4([[-1,3], [1,2], [-3,-4]], [[-2,4]]) # trapped blob cap
|
|
274
|
+
Traceback (most recent call last):
|
|
275
|
+
...
|
|
276
|
+
ValueError: not a blob diagram of order 4
|
|
277
|
+
sage: BD4([[1,4], [-1,-2], [-3,-4], [2,3]], []) # nested blob cup
|
|
278
|
+
Traceback (most recent call last):
|
|
279
|
+
...
|
|
280
|
+
ValueError: not a blob diagram of order 4
|
|
281
|
+
sage: BD4([[-1,-4], [1,2], [3,4], [-2,-3]], []) # nested blob cap
|
|
282
|
+
Traceback (most recent call last):
|
|
283
|
+
...
|
|
284
|
+
ValueError: not a blob diagram of order 4
|
|
285
|
+
sage: BD4([[3,-3]], [[1,-1],[2,-2],[4,-4]]) # trapped propagating line
|
|
286
|
+
Traceback (most recent call last):
|
|
287
|
+
...
|
|
288
|
+
ValueError: not a blob diagram of order 4
|
|
289
|
+
"""
|
|
290
|
+
if not isinstance(X, BlobDiagram):
|
|
291
|
+
return False
|
|
292
|
+
# Check that it is a Temperley-Lieb diagram
|
|
293
|
+
TL = X.marked + X.unmarked # the TL diagram
|
|
294
|
+
if TL not in self._TL_diagrams:
|
|
295
|
+
return False
|
|
296
|
+
# Check left escaping
|
|
297
|
+
for x, y in X.marked:
|
|
298
|
+
if x > 0: # Must be a cup
|
|
299
|
+
for P in TL:
|
|
300
|
+
if P[1] < 0: # P is a cap
|
|
301
|
+
continue
|
|
302
|
+
if P[1] < x:
|
|
303
|
+
if P[0] < 0: # A propagating line to the left
|
|
304
|
+
return False
|
|
305
|
+
else: # Note that P[1] != x
|
|
306
|
+
if 0 < P[0] < x: # A nesting line
|
|
307
|
+
return False
|
|
308
|
+
elif y < 0: # Must be a cap
|
|
309
|
+
for P in TL:
|
|
310
|
+
if P[0] > 0: # P is a cup
|
|
311
|
+
continue
|
|
312
|
+
if P[0] > y:
|
|
313
|
+
if P[1] > 0: # A propagating line to the left
|
|
314
|
+
return False
|
|
315
|
+
else: # Note that P[0] != y
|
|
316
|
+
if 0 > P[1] > y: # A nesting line
|
|
317
|
+
return False
|
|
318
|
+
else: # Must be a propagating line
|
|
319
|
+
if any(P[0] < 0 and P[1] > 0 and P[1] < y for P in TL):
|
|
320
|
+
return False
|
|
321
|
+
return True
|
|
322
|
+
|
|
323
|
+
def __iter__(self):
|
|
324
|
+
r"""
|
|
325
|
+
Iterate over ``self``.
|
|
326
|
+
|
|
327
|
+
EXAMPLES::
|
|
328
|
+
|
|
329
|
+
sage: from sage.combinat.blob_algebra import BlobDiagrams
|
|
330
|
+
sage: BD3 = BlobDiagrams(3)
|
|
331
|
+
sage: sorted(BD3)
|
|
332
|
+
[({}, {{-3, -2}, {-1, 1}, {2, 3}}),
|
|
333
|
+
({}, {{-3, -2}, {-1, 3}, {1, 2}}),
|
|
334
|
+
({}, {{-3, 1}, {-2, -1}, {2, 3}}),
|
|
335
|
+
({}, {{-3, 3}, {-2, -1}, {1, 2}}),
|
|
336
|
+
({}, {{-3, 3}, {-2, 2}, {-1, 1}}),
|
|
337
|
+
({{-3, 1}}, {{-2, -1}, {2, 3}}),
|
|
338
|
+
({{-3, 3}}, {{-2, -1}, {1, 2}}),
|
|
339
|
+
({{-2, -1}}, {{-3, 1}, {2, 3}}),
|
|
340
|
+
({{-2, -1}}, {{-3, 3}, {1, 2}}),
|
|
341
|
+
({{-1, 1}}, {{-3, -2}, {2, 3}}),
|
|
342
|
+
({{-1, 1}}, {{-3, 3}, {-2, 2}}),
|
|
343
|
+
({{-1, 3}}, {{-3, -2}, {1, 2}}),
|
|
344
|
+
({{1, 2}}, {{-3, -2}, {-1, 3}}),
|
|
345
|
+
({{1, 2}}, {{-3, 3}, {-2, -1}}),
|
|
346
|
+
({{-3, 1}, {-2, -1}}, {{2, 3}}),
|
|
347
|
+
({{-3, 3}, {-2, -1}}, {{1, 2}}),
|
|
348
|
+
({{-3, 3}, {1, 2}}, {{-2, -1}}),
|
|
349
|
+
({{-2, -1}, {1, 2}}, {{-3, 3}}),
|
|
350
|
+
({{-1, 3}, {1, 2}}, {{-3, -2}}),
|
|
351
|
+
({{-3, 3}, {-2, -1}, {1, 2}}, {})]
|
|
352
|
+
"""
|
|
353
|
+
for D in DyckWords(self._n):
|
|
354
|
+
markable = set()
|
|
355
|
+
unmarked = []
|
|
356
|
+
unpaired = []
|
|
357
|
+
# Determine the pairing and which pairings are markable
|
|
358
|
+
for i,d in enumerate(D):
|
|
359
|
+
if i >= self._n:
|
|
360
|
+
i = -2*self._n + i
|
|
361
|
+
else:
|
|
362
|
+
i += 1
|
|
363
|
+
if d == 1:
|
|
364
|
+
unpaired.append(i)
|
|
365
|
+
else: # d == 0
|
|
366
|
+
m = unpaired.pop()
|
|
367
|
+
if not unpaired:
|
|
368
|
+
markable.add((m, i))
|
|
369
|
+
else:
|
|
370
|
+
unmarked.append((m, i))
|
|
371
|
+
for X in powerset(markable):
|
|
372
|
+
yield self.element_class(self, X, unmarked + list(markable.difference(X)))
|
|
373
|
+
|
|
374
|
+
Element = BlobDiagram
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
class BlobAlgebra(CombinatorialFreeModule):
|
|
378
|
+
r"""
|
|
379
|
+
The blob algebra.
|
|
380
|
+
|
|
381
|
+
The *blob algebra* (also known as the Temperley-Lieb algebra of type `B`
|
|
382
|
+
in [ILZ2018]_, but is a quotient of the Temperley-Lieb algebra of type `B`
|
|
383
|
+
defined in [Graham1985]_) is a diagram-type algebra introduced in
|
|
384
|
+
[MS1994]_ whose basis consists of :class:`Temperley-Lieb diagrams
|
|
385
|
+
<sage.combinat.diagram_algebras.TemperleyLiebDiagram>`, noncrossing
|
|
386
|
+
perfect matchings, that may contain blobs on strands that can be
|
|
387
|
+
deformed so that the blob touches the left side (which we can think of
|
|
388
|
+
as a frozen pole).
|
|
389
|
+
|
|
390
|
+
The form we give here has 3 parameters, the natural one from the
|
|
391
|
+
:class:`Temperley-Lieb algebra <sage.combinat.diagram_algebras.TemperleyLiebAlgebra>`,
|
|
392
|
+
one for the idempotent relation, and one for a loop with a blob.
|
|
393
|
+
|
|
394
|
+
INPUT:
|
|
395
|
+
|
|
396
|
+
- ``k`` -- the order
|
|
397
|
+
- ``q1`` -- the loop parameter
|
|
398
|
+
- ``q2`` -- the idempotent parameter
|
|
399
|
+
- ``q3`` -- the blob loop parameter
|
|
400
|
+
|
|
401
|
+
EXAMPLES::
|
|
402
|
+
|
|
403
|
+
sage: R.<q,r,s> = ZZ[]
|
|
404
|
+
sage: B4 = algebras.Blob(4, q, r, s)
|
|
405
|
+
sage: B = sorted(B4.basis())
|
|
406
|
+
sage: B[14]
|
|
407
|
+
B({{-4, -3}}, {{-2, -1}, {1, 2}, {3, 4}})
|
|
408
|
+
sage: B[40]
|
|
409
|
+
B({{3, 4}}, {{-4, -3}, {-2, -1}, {1, 2}})
|
|
410
|
+
sage: B[14] * B[40]
|
|
411
|
+
q*r*s*B({}, {{-4, -3}, {-2, -1}, {1, 2}, {3, 4}})
|
|
412
|
+
|
|
413
|
+
REFERENCES:
|
|
414
|
+
|
|
415
|
+
- [MS1994]_
|
|
416
|
+
- [ILZ2018]_
|
|
417
|
+
"""
|
|
418
|
+
@staticmethod
|
|
419
|
+
def __classcall_private__(cls, k, q1, q2, q3, base_ring=None, prefix='B'):
|
|
420
|
+
r"""
|
|
421
|
+
Normalize input to ensure a unique representation.
|
|
422
|
+
|
|
423
|
+
TESTS::
|
|
424
|
+
|
|
425
|
+
sage: R.<q,r,s> = ZZ[]
|
|
426
|
+
sage: B3 = algebras.Blob(3, q, r, s)
|
|
427
|
+
sage: Bp = algebras.Blob(3, q, r, s, R, prefix='B')
|
|
428
|
+
sage: B3 is Bp
|
|
429
|
+
True
|
|
430
|
+
"""
|
|
431
|
+
if base_ring is None:
|
|
432
|
+
base_ring = get_coercion_model().common_parent(q1, q2, q3)
|
|
433
|
+
q1 = base_ring(q1)
|
|
434
|
+
q2 = base_ring(q2)
|
|
435
|
+
q3 = base_ring(q3)
|
|
436
|
+
return super().__classcall__(cls, k, q1, q2, q3, base_ring, prefix)
|
|
437
|
+
|
|
438
|
+
def __init__(self, k, q1, q2, q3, base_ring, prefix):
|
|
439
|
+
r"""
|
|
440
|
+
Initialize ``self``.
|
|
441
|
+
|
|
442
|
+
TESTS::
|
|
443
|
+
|
|
444
|
+
sage: R.<q,r,s> = ZZ[]
|
|
445
|
+
sage: B4 = algebras.Blob(4, q, r, s)
|
|
446
|
+
sage: TestSuite(B4).run()
|
|
447
|
+
|
|
448
|
+
sage: B3 = algebras.Blob(3, q, r, s)
|
|
449
|
+
sage: B = list(B3.basis())
|
|
450
|
+
sage: TestSuite(B3).run(elements=B) # long time
|
|
451
|
+
"""
|
|
452
|
+
self._q1 = q1
|
|
453
|
+
self._q2 = q2
|
|
454
|
+
self._q3 = q3
|
|
455
|
+
diagrams = BlobDiagrams(k)
|
|
456
|
+
cat = Algebras(base_ring.category()).FiniteDimensional().WithBasis()
|
|
457
|
+
CombinatorialFreeModule.__init__(self, base_ring, diagrams, category=cat,
|
|
458
|
+
prefix=prefix, bracket=False)
|
|
459
|
+
|
|
460
|
+
def _ascii_art_term(self, diagram):
|
|
461
|
+
r"""
|
|
462
|
+
Return an ascii art representation of ``diagram``.
|
|
463
|
+
|
|
464
|
+
EXAMPLES::
|
|
465
|
+
|
|
466
|
+
sage: R.<q,r,s> = ZZ[]
|
|
467
|
+
sage: B2 = algebras.Blob(2, q, r, s)
|
|
468
|
+
sage: x = B2.an_element()
|
|
469
|
+
sage: ascii_art(x) # indirect doctest
|
|
470
|
+
o o o o o o
|
|
471
|
+
2* `-` + 3* `-` + 2* `0`
|
|
472
|
+
.-. .0. .-.
|
|
473
|
+
o o o o o o
|
|
474
|
+
"""
|
|
475
|
+
return TL_diagram_ascii_art(diagram.marked+diagram.unmarked, use_unicode=False,
|
|
476
|
+
blobs=diagram.marked)
|
|
477
|
+
|
|
478
|
+
def _unicode_art_term(self, diagram):
|
|
479
|
+
r"""
|
|
480
|
+
Return a unicode art representation of ``diagram``.
|
|
481
|
+
|
|
482
|
+
EXAMPLES::
|
|
483
|
+
|
|
484
|
+
sage: R.<q,r,s> = ZZ[]
|
|
485
|
+
sage: B2 = algebras.Blob(2, q, r, s)
|
|
486
|
+
sage: x = B2.an_element()
|
|
487
|
+
sage: unicode_art(x) # indirect doctest
|
|
488
|
+
⚬ ⚬ ⚬ ⚬ ⚬ ⚬
|
|
489
|
+
2* ╰─╯ + 3* ╰─╯ + 2* ╰●╯
|
|
490
|
+
╭─╮ ╭●╮ ╭─╮
|
|
491
|
+
⚬ ⚬ ⚬ ⚬ ⚬ ⚬
|
|
492
|
+
"""
|
|
493
|
+
return TL_diagram_ascii_art(diagram.marked+diagram.unmarked, use_unicode=True,
|
|
494
|
+
blobs=diagram.marked)
|
|
495
|
+
|
|
496
|
+
def _latex_term(self, diagram):
|
|
497
|
+
r"""
|
|
498
|
+
Return a latex representation of ``diagram``.
|
|
499
|
+
|
|
500
|
+
EXAMPLES::
|
|
501
|
+
|
|
502
|
+
sage: R.<q,r,s> = ZZ[]
|
|
503
|
+
sage: B2 = algebras.Blob(2, q, r, s)
|
|
504
|
+
sage: latex(B2.an_element()) # indirect doctest
|
|
505
|
+
2 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
|
|
506
|
+
\tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
|
|
507
|
+
\node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
|
|
508
|
+
\node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
|
|
509
|
+
\node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
|
|
510
|
+
\node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
|
|
511
|
+
\draw[] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. (G--1);
|
|
512
|
+
\draw[] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. (G-2);
|
|
513
|
+
\end{tikzpicture}
|
|
514
|
+
+ 3 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
|
|
515
|
+
\tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
|
|
516
|
+
\node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
|
|
517
|
+
\node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
|
|
518
|
+
\node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
|
|
519
|
+
\node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
|
|
520
|
+
\draw[blue,very thick] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. node[midway,circle,fill,scale=0.6] {} (G--1);
|
|
521
|
+
\draw[] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. (G-2);
|
|
522
|
+
\end{tikzpicture}
|
|
523
|
+
+ 2 \begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}]
|
|
524
|
+
\tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt]
|
|
525
|
+
\node[vertex] (G-1) at (0.0, 1) [shape = circle, draw] {};
|
|
526
|
+
\node[vertex] (G-2) at (1.5, 1) [shape = circle, draw] {};
|
|
527
|
+
\node[vertex] (G--2) at (1.5, -1) [shape = circle, draw] {};
|
|
528
|
+
\node[vertex] (G--1) at (0.0, -1) [shape = circle, draw] {};
|
|
529
|
+
\draw[blue,very thick] (G-1) .. controls +(0.5, -0.5) and +(-0.5, -0.5) .. node[midway,circle,fill,scale=0.6] {} (G-2);
|
|
530
|
+
\draw[] (G--2) .. controls +(-0.5, 0.5) and +(0.5, 0.5) .. (G--1);
|
|
531
|
+
\end{tikzpicture}
|
|
532
|
+
"""
|
|
533
|
+
def edge_options(P):
|
|
534
|
+
if P[1] < P[0]:
|
|
535
|
+
P = [P[1], P[0]]
|
|
536
|
+
if tuple(P) in diagram.marked:
|
|
537
|
+
return 'blue,very thick'
|
|
538
|
+
return ''
|
|
539
|
+
|
|
540
|
+
def edge_additions(P):
|
|
541
|
+
if P[1] < P[0]:
|
|
542
|
+
P = [P[1], P[0]]
|
|
543
|
+
if tuple(P) in diagram.marked:
|
|
544
|
+
return 'node[midway,circle,fill,scale=0.6] {} '
|
|
545
|
+
return ''
|
|
546
|
+
return diagram_latex(diagram.marked+diagram.unmarked,
|
|
547
|
+
edge_options=edge_options,
|
|
548
|
+
edge_additions=edge_additions)
|
|
549
|
+
|
|
550
|
+
def order(self):
|
|
551
|
+
r"""
|
|
552
|
+
Return the order of ``self``.
|
|
553
|
+
|
|
554
|
+
The order of a partition algebra is defined as half of the number
|
|
555
|
+
of nodes in the diagrams.
|
|
556
|
+
|
|
557
|
+
EXAMPLES::
|
|
558
|
+
|
|
559
|
+
sage: R.<q,r,s> = ZZ[]
|
|
560
|
+
sage: B4 = algebras.Blob(4, q, r, s)
|
|
561
|
+
sage: B4.order()
|
|
562
|
+
4
|
|
563
|
+
"""
|
|
564
|
+
return self._indices.order()
|
|
565
|
+
|
|
566
|
+
@cached_method
|
|
567
|
+
def one_basis(self):
|
|
568
|
+
r"""
|
|
569
|
+
Return the index of the basis element `1`.
|
|
570
|
+
|
|
571
|
+
EXAMPLES::
|
|
572
|
+
|
|
573
|
+
sage: R.<q,r,s> = ZZ[]
|
|
574
|
+
sage: B4 = algebras.Blob(4, q, r, s)
|
|
575
|
+
sage: B4.one_basis()
|
|
576
|
+
({}, {{-4, 4}, {-3, 3}, {-2, 2}, {-1, 1}})
|
|
577
|
+
"""
|
|
578
|
+
B = self._indices
|
|
579
|
+
return B.element_class(B, [], [[i, -i] for i in range(1, self.order()+1)])
|
|
580
|
+
|
|
581
|
+
def product_on_basis(self, top, bot):
|
|
582
|
+
r"""
|
|
583
|
+
Return the product of the basis elements indexed by ``top``
|
|
584
|
+
and ``bot``.
|
|
585
|
+
|
|
586
|
+
EXAMPLES::
|
|
587
|
+
|
|
588
|
+
sage: R.<q,r,s> = ZZ[]
|
|
589
|
+
sage: B4 = algebras.Blob(4, q, r, s)
|
|
590
|
+
sage: B = B4.basis()
|
|
591
|
+
sage: BD = sorted(B.keys())
|
|
592
|
+
sage: BD[14]
|
|
593
|
+
({{-4, -3}}, {{-2, -1}, {1, 2}, {3, 4}})
|
|
594
|
+
sage: BD[40]
|
|
595
|
+
({{3, 4}}, {{-4, -3}, {-2, -1}, {1, 2}})
|
|
596
|
+
sage: B4.product_on_basis(BD[14], BD[40])
|
|
597
|
+
q*r*s*B({}, {{-4, -3}, {-2, -1}, {1, 2}, {3, 4}})
|
|
598
|
+
sage: all(len((x*y).support()) == 1 for x in B for y in B)
|
|
599
|
+
True
|
|
600
|
+
"""
|
|
601
|
+
ret_lists = [[], []]
|
|
602
|
+
coeff = self.base_ring().one()
|
|
603
|
+
top_marked = set(top.marked)
|
|
604
|
+
top_unmarked = set(top.unmarked)
|
|
605
|
+
bot_marked = set(bot.marked)
|
|
606
|
+
bot_unmarked = set(bot.unmarked)
|
|
607
|
+
|
|
608
|
+
for top_set, is_unmarked in [(top_marked, 0), (top_unmarked, 1)]:
|
|
609
|
+
while top_set:
|
|
610
|
+
# We are starting a new strand
|
|
611
|
+
cur, stop = top_set.pop() # note that cur < stop
|
|
612
|
+
unmarked = is_unmarked
|
|
613
|
+
#print(top_set, unmarked, cur, stop)
|
|
614
|
+
if cur > 0: # Both are anchored to the top
|
|
615
|
+
ret_lists[unmarked].append((cur, stop))
|
|
616
|
+
continue
|
|
617
|
+
anchored = bool(stop > 0) # Possibly only stop is anchored
|
|
618
|
+
|
|
619
|
+
# Follow the path from cur until we either reach stop or
|
|
620
|
+
# we break out of the loop because both ends are anchored
|
|
621
|
+
while anchored or cur != stop:
|
|
622
|
+
#print(anchored, unmarked, cur, stop)
|
|
623
|
+
cur = -cur # Move cur to the bottom diagram
|
|
624
|
+
for X in bot_marked:
|
|
625
|
+
if cur in X:
|
|
626
|
+
if unmarked:
|
|
627
|
+
unmarked = 0
|
|
628
|
+
else:
|
|
629
|
+
coeff *= self._q2
|
|
630
|
+
prev = cur
|
|
631
|
+
cur = X[1-X.index(prev)]
|
|
632
|
+
bot_marked.remove(X)
|
|
633
|
+
break
|
|
634
|
+
for X in bot_unmarked:
|
|
635
|
+
if cur in X:
|
|
636
|
+
prev = cur
|
|
637
|
+
cur = X[1-X.index(prev)]
|
|
638
|
+
bot_unmarked.remove(X)
|
|
639
|
+
break
|
|
640
|
+
if cur < 0: # cur is anchored at the bottom
|
|
641
|
+
if anchored:
|
|
642
|
+
ret_lists[unmarked].append((stop, cur))
|
|
643
|
+
break
|
|
644
|
+
else:
|
|
645
|
+
anchored = True
|
|
646
|
+
stop, cur = cur, stop # stop is now anchored to the bottom
|
|
647
|
+
continue
|
|
648
|
+
cur = -cur # bring cur back to the top diagram
|
|
649
|
+
for X in top_marked:
|
|
650
|
+
if cur in X:
|
|
651
|
+
if unmarked:
|
|
652
|
+
unmarked = 0
|
|
653
|
+
else:
|
|
654
|
+
coeff *= self._q2
|
|
655
|
+
prev = cur
|
|
656
|
+
cur = X[1-X.index(prev)]
|
|
657
|
+
top_marked.remove(X)
|
|
658
|
+
break
|
|
659
|
+
for X in top_unmarked:
|
|
660
|
+
if cur in X:
|
|
661
|
+
prev = cur
|
|
662
|
+
cur = X[1-X.index(prev)]
|
|
663
|
+
top_unmarked.remove(X)
|
|
664
|
+
break
|
|
665
|
+
if cur > 0: # cur is anchored at the top
|
|
666
|
+
if anchored:
|
|
667
|
+
ret_lists[unmarked].append((stop, cur))
|
|
668
|
+
break
|
|
669
|
+
else:
|
|
670
|
+
anchored = True
|
|
671
|
+
stop, cur = cur, stop # stop is now anchored to the top
|
|
672
|
+
if cur == stop: # We have found a (marked) loop
|
|
673
|
+
if unmarked:
|
|
674
|
+
coeff *= self._q1
|
|
675
|
+
else:
|
|
676
|
+
coeff *= self._q3
|
|
677
|
+
# Everything remaining in the bottom sets are just anchored
|
|
678
|
+
# at the bottom, (i.e., are of the form {-i, -j}).
|
|
679
|
+
ret_lists[0].extend(bot_marked)
|
|
680
|
+
ret_lists[1].extend(bot_unmarked)
|
|
681
|
+
|
|
682
|
+
if coeff == 0:
|
|
683
|
+
return self.zero()
|
|
684
|
+
diagram = self._indices.element_class(self._indices, ret_lists[0], ret_lists[1])
|
|
685
|
+
return self._from_dict({diagram: coeff}, remove_zeros=False)
|