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,964 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.groups sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Colored permutations: conjugacy classes, representation theory
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
8
|
+
from sage.combinat.partition_tuple import PartitionTuples
|
|
9
|
+
from sage.combinat.specht_module import SpechtModule as SymGroupSpechtModule
|
|
10
|
+
from sage.groups.conjugacy_classes import ConjugacyClass
|
|
11
|
+
from sage.matrix.constructor import matrix, diagonal_matrix
|
|
12
|
+
from sage.misc.cachefunc import cached_method
|
|
13
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
14
|
+
from sage.modules.with_basis.subquotient import SubmoduleWithBasis, QuotientModuleWithBasis
|
|
15
|
+
from sage.modules.with_basis.representation import Representation_abstract
|
|
16
|
+
from sage.structure.element import parent
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ===================================================================
|
|
20
|
+
# Conjucacy classes
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SignedPermutationGroupConjugacyClass(ConjugacyClass):
|
|
24
|
+
r"""
|
|
25
|
+
A conjugacy class of the signed permutations of `n`.
|
|
26
|
+
|
|
27
|
+
INPUT:
|
|
28
|
+
|
|
29
|
+
- ``group`` -- the signed permutations of `n`
|
|
30
|
+
- ``shape`` -- a pair of partitions or an element of ``group``
|
|
31
|
+
"""
|
|
32
|
+
def __init__(self, group, shape):
|
|
33
|
+
"""
|
|
34
|
+
Initialize ``self``.
|
|
35
|
+
|
|
36
|
+
EXAMPLES::
|
|
37
|
+
|
|
38
|
+
sage: G = SignedPermutations(4)
|
|
39
|
+
sage: C = G.conjugacy_class([[1], [2,1]])
|
|
40
|
+
sage: TestSuite(C).run()
|
|
41
|
+
"""
|
|
42
|
+
if parent(shape) is group:
|
|
43
|
+
shape = shape.cycle_type()
|
|
44
|
+
self._group = group
|
|
45
|
+
P = PartitionTuples(2, group._n)
|
|
46
|
+
self._shape = P(shape)
|
|
47
|
+
self._set = None
|
|
48
|
+
rep = self._group.conjugacy_class_representative(self._shape)
|
|
49
|
+
ConjugacyClass.__init__(self, group, rep)
|
|
50
|
+
|
|
51
|
+
def _repr_(self):
|
|
52
|
+
r"""
|
|
53
|
+
Return a string representation of ``self``.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: G = SignedPermutations(4)
|
|
58
|
+
sage: G.conjugacy_class([[3], [1]])
|
|
59
|
+
Conjugacy class of cycle type ([3], [1]) in Signed permutations of 4
|
|
60
|
+
"""
|
|
61
|
+
return "Conjugacy class of cycle type %s in %s" % (self._shape, self._group)
|
|
62
|
+
|
|
63
|
+
def __eq__(self, other):
|
|
64
|
+
r"""
|
|
65
|
+
Comparison of conjugacy classes is done by comparing the
|
|
66
|
+
defining cycle types.
|
|
67
|
+
|
|
68
|
+
EXAMPLES::
|
|
69
|
+
|
|
70
|
+
sage: G = SignedPermutations(4)
|
|
71
|
+
sage: C = G.conjugacy_class([[3], [1]])
|
|
72
|
+
sage: Cp = G.conjugacy_class(G([2,4,-3,1]))
|
|
73
|
+
sage: C == Cp
|
|
74
|
+
True
|
|
75
|
+
"""
|
|
76
|
+
if not isinstance(other, SignedPermutationGroupConjugacyClass):
|
|
77
|
+
return False
|
|
78
|
+
return self._shape == other._shape
|
|
79
|
+
|
|
80
|
+
def shape(self):
|
|
81
|
+
r"""
|
|
82
|
+
Return the shape of ``self``.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: G = SignedPermutations(4)
|
|
87
|
+
sage: C = G.conjugacy_class(G([-3,2,-4,1]))
|
|
88
|
+
sage: C.shape()
|
|
89
|
+
([3, 1], [])
|
|
90
|
+
"""
|
|
91
|
+
return self._shape
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# ===================================================================
|
|
95
|
+
# Representation theory
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class TabloidModule(Representation_abstract, CombinatorialFreeModule):
|
|
99
|
+
r"""
|
|
100
|
+
The vector space of all tabloids of a fixed shape with the natural
|
|
101
|
+
signed permutation group action.
|
|
102
|
+
|
|
103
|
+
A *tabloid* of size `n` is a pair of sequences sets `(S, T)` such that:
|
|
104
|
+
|
|
105
|
+
- For all `X, Y \in S \cup T`, we have `X \cap Y = \emptyset`
|
|
106
|
+
(all sets are pairwise disjoint).
|
|
107
|
+
- `\sum_{X \in S \cup T} |X| = n`.
|
|
108
|
+
- `\bigsqcup_{X\subseteq S \cup T} X \sqcup \overline{X} = \{1, \ldots,
|
|
109
|
+
n, \overline{1} \ldots, \overline{n}\}`.
|
|
110
|
+
|
|
111
|
+
The signed permutation group acts naturally on the entries of each set.
|
|
112
|
+
Hence, this is a representation of the signed permutation group
|
|
113
|
+
defined over any field.
|
|
114
|
+
|
|
115
|
+
EXAMPLES::
|
|
116
|
+
|
|
117
|
+
sage: B4 = SignedPermutations(4)
|
|
118
|
+
sage: la = [1]
|
|
119
|
+
sage: mu = [2, 1]
|
|
120
|
+
|
|
121
|
+
sage: TM = B4.tabloid_module([la, mu], QQ)
|
|
122
|
+
sage: TM.dimension()
|
|
123
|
+
24
|
|
124
|
+
sage: chi = TM.character(); chi
|
|
125
|
+
(0, 0, 0, 4, 24, 0, 2, 18, 0, 0, 4, 12, 0, 2, 6, 0, 0, 0, 0, 0)
|
|
126
|
+
|
|
127
|
+
We show how to compute the decomposition into irreducibles (it takes some
|
|
128
|
+
time to generate the character table this way though)::
|
|
129
|
+
|
|
130
|
+
sage: chartab = matrix([B4.specht_module(la, QQ).character() # not tested
|
|
131
|
+
....: for la in PartitionTuples(2,4)])
|
|
132
|
+
sage: chi * ~chartab # not tested
|
|
133
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 1, 1, 0)
|
|
134
|
+
|
|
135
|
+
We now do some computations for the modular representation theory::
|
|
136
|
+
|
|
137
|
+
sage: TM = B4.tabloid_module([la, mu], GF(3))
|
|
138
|
+
sage: TM.brauer_character()
|
|
139
|
+
(0, 0, 4, 24, 2, 18, 0, 0, 4, 12, 2, 6, 0, 0, 0, 0)
|
|
140
|
+
sage: IM = TM.invariant_module()
|
|
141
|
+
sage: IM.dimension() # long time
|
|
142
|
+
1
|
|
143
|
+
sage: IM.basis()[0].lift() == sum(TM.basis())
|
|
144
|
+
True
|
|
145
|
+
|
|
146
|
+
We verify the dimension is `2^{|\lambda|} \frac{n!}{
|
|
147
|
+
\lambda_1! \cdots \lambda_{\ell}! \mu_1! \cdots \mu_m!}`::
|
|
148
|
+
|
|
149
|
+
sage: TM.dimension() == (2^sum(la) * factorial(4)
|
|
150
|
+
....: / prod(factorial(lai) for lai in la)
|
|
151
|
+
....: / prod(factorial(mui) for mui in mu))
|
|
152
|
+
True
|
|
153
|
+
|
|
154
|
+
We can see that the tabloid module is not symmetric with swapping
|
|
155
|
+
`\lambda \leftrightarrow \mu`::
|
|
156
|
+
|
|
157
|
+
sage: TMp = B4.tabloid_module([mu, la], GF(3))
|
|
158
|
+
sage: TMp.dimension()
|
|
159
|
+
96
|
|
160
|
+
sage: TMp.dimension() == (2^sum(mu) * factorial(4)
|
|
161
|
+
....: / prod(factorial(mui) for mui in mu)
|
|
162
|
+
....: / prod(factorial(lai) for lai in la))
|
|
163
|
+
True
|
|
164
|
+
|
|
165
|
+
REFERENCES:
|
|
166
|
+
|
|
167
|
+
- [Morris1981]_
|
|
168
|
+
"""
|
|
169
|
+
@staticmethod
|
|
170
|
+
def __classcall_private__(cls, G, base_ring, diagram):
|
|
171
|
+
r"""
|
|
172
|
+
Normalize input to ensure a unique representation.
|
|
173
|
+
|
|
174
|
+
EXAMPLES::
|
|
175
|
+
|
|
176
|
+
sage: from sage.combinat.colored_permutations_representations import TabloidModule
|
|
177
|
+
sage: B4 = SignedPermutations(4)
|
|
178
|
+
sage: TM1 = TabloidModule(B4, QQ, [[], [2,2]])
|
|
179
|
+
sage: TM2 = TabloidModule(B4, QQ, PartitionTuple([[], [2, 2]]))
|
|
180
|
+
sage: TM1 is TM2
|
|
181
|
+
True
|
|
182
|
+
|
|
183
|
+
sage: TabloidModule(B4, QQ, [[], [2,1]])
|
|
184
|
+
Traceback (most recent call last):
|
|
185
|
+
...
|
|
186
|
+
ValueError: [[], [2, 1]] is not a Partition tuples of level 2 and size 4
|
|
187
|
+
"""
|
|
188
|
+
diagram = PartitionTuples(2, G._n)(diagram)
|
|
189
|
+
return super().__classcall__(cls, G, base_ring, diagram)
|
|
190
|
+
|
|
191
|
+
def __init__(self, G, base_ring, diagram):
|
|
192
|
+
r"""
|
|
193
|
+
Initialize ``self``.
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: B5 = SignedPermutations(5)
|
|
198
|
+
sage: TM = B5.tabloid_module([[1],[2,2]], GF(5))
|
|
199
|
+
sage: TestSuite(TM).run()
|
|
200
|
+
"""
|
|
201
|
+
self._diagram = diagram
|
|
202
|
+
from sage.categories.modules_with_basis import ModulesWithBasis
|
|
203
|
+
cat = ModulesWithBasis(base_ring).FiniteDimensional()
|
|
204
|
+
|
|
205
|
+
# Build the tabloids
|
|
206
|
+
from sage.sets.disjoint_union_enumerated_sets import DisjointUnionEnumeratedSets
|
|
207
|
+
from sage.combinat.set_partition_ordered import OrderedSetPartitions
|
|
208
|
+
from sage.categories.sets_cat import cartesian_product
|
|
209
|
+
from itertools import product
|
|
210
|
+
la, mu = self._diagram
|
|
211
|
+
data = [cartesian_product([OrderedSetPartitions([val * x for x, val in zip(sorted(X), signs)], la),
|
|
212
|
+
OrderedSetPartitions(sorted(Y), mu)])
|
|
213
|
+
for (X, Y) in OrderedSetPartitions(G._n, [sum(la), sum(mu)])
|
|
214
|
+
for signs in product([1,-1], repeat=sum(la))]
|
|
215
|
+
tabloids = DisjointUnionEnumeratedSets(data)
|
|
216
|
+
tabloids.rename(f"Tabloids of shape {self._diagram}")
|
|
217
|
+
|
|
218
|
+
CombinatorialFreeModule.__init__(self, base_ring, tabloids,
|
|
219
|
+
category=cat, prefix='T', bracket='')
|
|
220
|
+
Representation_abstract.__init__(self, G, "left")
|
|
221
|
+
|
|
222
|
+
def _repr_(self):
|
|
223
|
+
r"""
|
|
224
|
+
Return a string representation of ``self``.
|
|
225
|
+
|
|
226
|
+
EXAMPLES::
|
|
227
|
+
|
|
228
|
+
sage: B7 = SignedPermutations(7)
|
|
229
|
+
sage: B7.tabloid_module([[3,1],[2,1]], GF(3))
|
|
230
|
+
Tabloid module of ([3, 1], [2, 1]) over Finite Field of size 3
|
|
231
|
+
"""
|
|
232
|
+
return f"Tabloid module of {self._diagram} over {self.base_ring()}"
|
|
233
|
+
|
|
234
|
+
def _latex_(self):
|
|
235
|
+
r"""
|
|
236
|
+
Return a latex representation of ``self``.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: B4 = SignedPermutations(4)
|
|
241
|
+
sage: TM = B4.tabloid_module([[2,1],[1]], GF(3))
|
|
242
|
+
sage: latex(TM)
|
|
243
|
+
T^{{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
244
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
245
|
+
\lr{\phantom{x}}&\lr{\phantom{x}}\\\cline{1-2}
|
|
246
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
247
|
+
\end{array}$}
|
|
248
|
+
},{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
249
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
250
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
251
|
+
\end{array}$}
|
|
252
|
+
}}
|
|
253
|
+
"""
|
|
254
|
+
from sage.misc.latex import latex
|
|
255
|
+
return "T^{" + ",".join(latex(la) for la in self._diagram) + "}"
|
|
256
|
+
|
|
257
|
+
def _ascii_art_term(self, TP):
|
|
258
|
+
r"""
|
|
259
|
+
Return an ascii art representation of the term indexed by ``T``.
|
|
260
|
+
|
|
261
|
+
EXAMPLES::
|
|
262
|
+
|
|
263
|
+
sage: B5 = SignedPermutations(5)
|
|
264
|
+
sage: TM = B5.tabloid_module([[2,1], [1,1]], QQ)
|
|
265
|
+
sage: ascii_art(TM.an_element()) # indirect doctest
|
|
266
|
+
2*T + 2*T + 3*T
|
|
267
|
+
{1, 2} {4} {1, 2} {5} {1, 3} {4}
|
|
268
|
+
{3} , {5} {3} , {4} {2} , {5}
|
|
269
|
+
"""
|
|
270
|
+
# This is basically copied from CombinatorialFreeModule._ascii_art_term
|
|
271
|
+
from sage.typeset.ascii_art import AsciiArt, ascii_art
|
|
272
|
+
pref = AsciiArt([self.prefix()])
|
|
273
|
+
data = []
|
|
274
|
+
for T in TP:
|
|
275
|
+
tab = "\n".join("{" + ", ".join(str(val) for val in sorted(row)) + "}" for row in T)
|
|
276
|
+
if not tab:
|
|
277
|
+
tab = '-'
|
|
278
|
+
data.append(tab)
|
|
279
|
+
r = pref * (AsciiArt([" " * len(pref)]) + ascii_art(data[0]) + ascii_art(', ') + ascii_art(data[1]))
|
|
280
|
+
r._baseline = r._h - 1
|
|
281
|
+
return r
|
|
282
|
+
|
|
283
|
+
def _unicode_art_term(self, T):
|
|
284
|
+
r"""
|
|
285
|
+
Return a unicode art representation of the term indexed by ``T``.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: B5 = SignedPermutations(5)
|
|
290
|
+
sage: TM = B5.tabloid_module([[2,1], [1,1]], QQ)
|
|
291
|
+
sage: unicode_art(TM.an_element()) # indirect doctest
|
|
292
|
+
2*T + 2*T + 3*T
|
|
293
|
+
{1, 2} {4} {1, 2} {5} {1, 3} {4}
|
|
294
|
+
{3} , {5} {3} , {4} {2} , {5}
|
|
295
|
+
"""
|
|
296
|
+
from sage.typeset.unicode_art import unicode_art
|
|
297
|
+
r = unicode_art(repr(self._ascii_art_term(T)))
|
|
298
|
+
r._baseline = r._h - 1
|
|
299
|
+
return r
|
|
300
|
+
|
|
301
|
+
def _latex_term(self, TP):
|
|
302
|
+
r"""
|
|
303
|
+
Return a latex representation of the term indexed by ``T``.
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: B5 = SignedPermutations(5)
|
|
308
|
+
sage: TM = B5.tabloid_module([[2,1], [1,1]], QQ)
|
|
309
|
+
sage: latex(TM.an_element()) # indirect doctest
|
|
310
|
+
2 T_{{\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
311
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
312
|
+
\lr{1}&\lr{2}\\\cline{1-2}
|
|
313
|
+
\lr{3}\\\cline{1-1}
|
|
314
|
+
\end{array}$}
|
|
315
|
+
}, {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
316
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
317
|
+
\lr{4}\\\cline{1-1}
|
|
318
|
+
\lr{5}\\\cline{1-1}
|
|
319
|
+
\end{array}$}
|
|
320
|
+
}} + 2 T_{{\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
321
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
322
|
+
\lr{1}&\lr{2}\\\cline{1-2}
|
|
323
|
+
\lr{3}\\\cline{1-1}
|
|
324
|
+
\end{array}$}
|
|
325
|
+
}, {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
326
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
327
|
+
\lr{5}\\\cline{1-1}
|
|
328
|
+
\lr{4}\\\cline{1-1}
|
|
329
|
+
\end{array}$}
|
|
330
|
+
}} + 3 T_{{\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
331
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
332
|
+
\lr{1}&\lr{3}\\\cline{1-2}
|
|
333
|
+
\lr{2}\\\cline{1-1}
|
|
334
|
+
\end{array}$}
|
|
335
|
+
}, {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{-.3ex}{$#1$}}}
|
|
336
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
337
|
+
\lr{4}\\\cline{1-1}
|
|
338
|
+
\lr{5}\\\cline{1-1}
|
|
339
|
+
\end{array}$}
|
|
340
|
+
}}
|
|
341
|
+
"""
|
|
342
|
+
data = []
|
|
343
|
+
import re
|
|
344
|
+
for T in TP:
|
|
345
|
+
if not T:
|
|
346
|
+
tab = "\\emptyset"
|
|
347
|
+
else:
|
|
348
|
+
from sage.combinat.output import tex_from_array
|
|
349
|
+
A = list(map(sorted, T))
|
|
350
|
+
tab = str(tex_from_array(A))
|
|
351
|
+
tab = tab.replace("|", "")
|
|
352
|
+
# Replace -i with \overline{i} in boxes
|
|
353
|
+
tab = re.sub(r"\\lr{-([0-9]+)}", r"\\lr{\\overline{\1}}", tab)
|
|
354
|
+
data.append(tab)
|
|
355
|
+
return f"{self.prefix()}_{{{data[0]}, {data[1]}}}"
|
|
356
|
+
|
|
357
|
+
def _semigroup_basis_action(self, g, T):
|
|
358
|
+
"""
|
|
359
|
+
Return the action of the symmetric group element ``g`` on the
|
|
360
|
+
tabloid ``T``.
|
|
361
|
+
|
|
362
|
+
EXAMPLES::
|
|
363
|
+
|
|
364
|
+
sage: B5 = SignedPermutations(5)
|
|
365
|
+
sage: TM = B5.tabloid_module([[2,1], [1,1]], QQ)
|
|
366
|
+
sage: tab = TM._indices([[[1,4],[3]], [[5],[2]]])
|
|
367
|
+
sage: g = B5.an_element(); g
|
|
368
|
+
[-5, 1, 2, 3, 4]
|
|
369
|
+
sage: TM._semigroup_basis_action(g, tab)
|
|
370
|
+
([{-5, 3}, {2}], [{4}, {1}])
|
|
371
|
+
"""
|
|
372
|
+
P = self._indices
|
|
373
|
+
U = [[g(val) for val in row] for row in T[0]]
|
|
374
|
+
V = [[abs(g(val)) for val in row] for row in T[1]]
|
|
375
|
+
return P([U, V])
|
|
376
|
+
|
|
377
|
+
def _semigroup_action(self, g, vec, vec_on_left):
|
|
378
|
+
r"""
|
|
379
|
+
Return the action of the symmetric group element ``g`` on the
|
|
380
|
+
vector ``vec``.
|
|
381
|
+
|
|
382
|
+
EXAMPLES::
|
|
383
|
+
|
|
384
|
+
sage: B5 = SignedPermutations(5)
|
|
385
|
+
sage: TM = B5.tabloid_module([[2,1], [1,1]], QQ)
|
|
386
|
+
sage: vec = TM.an_element(); vec
|
|
387
|
+
2*T([{1, 2}, {3}], [{4}, {5}]) + 2*T([{1, 2}, {3}], [{5}, {4}])
|
|
388
|
+
+ 3*T([{1, 3}, {2}], [{4}, {5}])
|
|
389
|
+
sage: g = prod(B5.gens()); g
|
|
390
|
+
[-5, 1, 2, 3, 4]
|
|
391
|
+
sage: TM._semigroup_action(g, vec, True)
|
|
392
|
+
2*T([{2, 3}, {4}], [{5}, {1}]) + 2*T([{2, 3}, {4}], [{1}, {5}])
|
|
393
|
+
+ 3*T([{2, 4}, {3}], [{5}, {1}])
|
|
394
|
+
sage: TM._semigroup_action(g, vec, False)
|
|
395
|
+
2*T([{-5, 1}, {2}], [{3}, {4}]) + 2*T([{-5, 1}, {2}], [{4}, {3}])
|
|
396
|
+
+ 3*T([{-5, 2}, {1}], [{3}, {4}])
|
|
397
|
+
"""
|
|
398
|
+
if self._left_repr == vec_on_left:
|
|
399
|
+
g = ~g
|
|
400
|
+
return self.sum_of_terms((self._semigroup_basis_action(g, T), c)
|
|
401
|
+
for T, c in vec._monomial_coefficients.items())
|
|
402
|
+
|
|
403
|
+
def specht_module(self):
|
|
404
|
+
r"""
|
|
405
|
+
Return the Specht submodule of ``self``.
|
|
406
|
+
|
|
407
|
+
EXAMPLES::
|
|
408
|
+
|
|
409
|
+
sage: B5 = SignedPermutations(5)
|
|
410
|
+
sage: TM = B5.tabloid_module([[2], [2,1]], QQ)
|
|
411
|
+
sage: TM.specht_module() is B5.specht_module([[2], [2,1]], QQ)
|
|
412
|
+
True
|
|
413
|
+
"""
|
|
414
|
+
return SpechtModule(self)
|
|
415
|
+
|
|
416
|
+
def bilinear_form(self, u, v):
|
|
417
|
+
r"""
|
|
418
|
+
Return the natural bilinear form of ``self`` applied to ``u`` and ``v``.
|
|
419
|
+
|
|
420
|
+
The natural bilinear form is given by defining the tabloid basis
|
|
421
|
+
to be orthonormal.
|
|
422
|
+
|
|
423
|
+
EXAMPLES::
|
|
424
|
+
|
|
425
|
+
sage: B4 = SignedPermutations(4)
|
|
426
|
+
sage: TM = B4.tabloid_module([[2], [1,1]], QQ)
|
|
427
|
+
sage: u = TM.an_element(); u
|
|
428
|
+
2*T([{1, 2}], [{3}, {4}]) + 2*T([{1, 2}], [{4}, {3}])
|
|
429
|
+
+ 3*T([{-2, 1}], [{3}, {4}])
|
|
430
|
+
sage: v = sum(TM.basis())
|
|
431
|
+
sage: TM.bilinear_form(u, v)
|
|
432
|
+
7
|
|
433
|
+
sage: TM.bilinear_form(u, TM.zero())
|
|
434
|
+
0
|
|
435
|
+
"""
|
|
436
|
+
if len(v) < len(u):
|
|
437
|
+
u, v = v, u
|
|
438
|
+
R = self.base_ring()
|
|
439
|
+
return R.sum(c * v[T] for T, c in u)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
class SpechtModule(Representation_abstract, SubmoduleWithBasis):
|
|
443
|
+
r"""
|
|
444
|
+
A Specht module of a type `B_n` Coxeter group in the classical standard
|
|
445
|
+
tableau pair basis.
|
|
446
|
+
|
|
447
|
+
This is constructed as a `B_n`-submodule of the :class:`TabloidModule`
|
|
448
|
+
(also referred to as the standard module) using the polytabloid elements
|
|
449
|
+
associated to the standard tableaux of shape `(\lambda, \mu)`.
|
|
450
|
+
|
|
451
|
+
We verify the set of 2-regular partitions for `n = 4`::
|
|
452
|
+
|
|
453
|
+
sage: B4 = SignedPermutations(4)
|
|
454
|
+
sage: for la in PartitionTuples(2, 4): # long time
|
|
455
|
+
....: SM = B4.specht_module(la, GF(3))
|
|
456
|
+
....: if SM.gram_matrix():
|
|
457
|
+
....: print(la)
|
|
458
|
+
([4], [])
|
|
459
|
+
([3, 1], [])
|
|
460
|
+
([2, 2], [])
|
|
461
|
+
([2, 1, 1], [])
|
|
462
|
+
([3], [1])
|
|
463
|
+
([2, 1], [1])
|
|
464
|
+
([2], [2])
|
|
465
|
+
([2], [1, 1])
|
|
466
|
+
([1, 1], [2])
|
|
467
|
+
([1, 1], [1, 1])
|
|
468
|
+
([1], [3])
|
|
469
|
+
([1], [2, 1])
|
|
470
|
+
([], [4])
|
|
471
|
+
([], [3, 1])
|
|
472
|
+
([], [2, 2])
|
|
473
|
+
([], [2, 1, 1])
|
|
474
|
+
sage: for la in PartitionTuples(2, 4): # long time
|
|
475
|
+
....: SM = B4.specht_module(la, GF(2))
|
|
476
|
+
....: if SM.gram_matrix():
|
|
477
|
+
....: print(la)
|
|
478
|
+
([], [4])
|
|
479
|
+
([], [3, 1])
|
|
480
|
+
|
|
481
|
+
REFERENCES:
|
|
482
|
+
|
|
483
|
+
- [Morris1981]_
|
|
484
|
+
"""
|
|
485
|
+
def __init__(self, ambient):
|
|
486
|
+
r"""
|
|
487
|
+
Initialize ``self``.
|
|
488
|
+
|
|
489
|
+
EXAMPLES::
|
|
490
|
+
|
|
491
|
+
sage: B5 = SignedPermutations(5)
|
|
492
|
+
sage: SM = B5.specht_module([[1,1], [2,1]], GF(3))
|
|
493
|
+
sage: TestSuite(SM).run()
|
|
494
|
+
sage: SM = B5.specht_module([[2], [2,1]], QQ)
|
|
495
|
+
sage: TestSuite(SM).run()
|
|
496
|
+
"""
|
|
497
|
+
Representation_abstract.__init__(self, ambient._semigroup, ambient._side,
|
|
498
|
+
algebra=ambient._semigroup_algebra)
|
|
499
|
+
self._diagram = ambient._diagram
|
|
500
|
+
|
|
501
|
+
ambient_basis = ambient.basis()
|
|
502
|
+
tabloids = ambient_basis.keys()
|
|
503
|
+
support_order = list(tabloids)
|
|
504
|
+
from itertools import product
|
|
505
|
+
|
|
506
|
+
def elt(T):
|
|
507
|
+
tab = tabloids(list(T))
|
|
508
|
+
|
|
509
|
+
def group_elements(sigma):
|
|
510
|
+
mu_vals = set(sum((row for row in T[1]), ()))
|
|
511
|
+
n = T.size()
|
|
512
|
+
for sigma in T.column_stabilizer():
|
|
513
|
+
sigma = sigma.tuple()
|
|
514
|
+
for signs in product(*[[1,-1] if i not in mu_vals else [1]
|
|
515
|
+
for i in range(1,n+1)]):
|
|
516
|
+
yield self._semigroup([s * val for s, val in zip(signs, sigma)])
|
|
517
|
+
|
|
518
|
+
return ambient.sum_of_terms((ambient._semigroup_basis_action(elt, tab),
|
|
519
|
+
1 - 2*(elt.length() % 2)) # == (-1)**elt.length()
|
|
520
|
+
for elt in group_elements(T))
|
|
521
|
+
|
|
522
|
+
from sage.sets.family import Family
|
|
523
|
+
basis = Family({T: elt(T)
|
|
524
|
+
for T in self._diagram.standard_tableaux()})
|
|
525
|
+
cat = ambient.category().Subobjects()
|
|
526
|
+
SubmoduleWithBasis.__init__(self, basis, support_order, ambient=ambient,
|
|
527
|
+
unitriangular=False, category=cat,
|
|
528
|
+
prefix='S', bracket='')
|
|
529
|
+
|
|
530
|
+
def _repr_(self):
|
|
531
|
+
"""
|
|
532
|
+
Return a string representation of ``self``.
|
|
533
|
+
|
|
534
|
+
EXAMPLES::
|
|
535
|
+
|
|
536
|
+
sage: B5 = SignedPermutations(5)
|
|
537
|
+
sage: B5.specht_module([[1,1], [2,1]], GF(3))
|
|
538
|
+
Specht module of shape ([1, 1], [2, 1]) over Finite Field of size 3
|
|
539
|
+
"""
|
|
540
|
+
return "Specht module of shape {} over {}".format(self._diagram, self.base_ring())
|
|
541
|
+
|
|
542
|
+
def _latex_(self):
|
|
543
|
+
r"""
|
|
544
|
+
Return a latex representation of ``self``.
|
|
545
|
+
|
|
546
|
+
EXAMPLES::
|
|
547
|
+
|
|
548
|
+
sage: B4 = SignedPermutations(4)
|
|
549
|
+
sage: latex(B4.specht_module([[2,1],[1]], GF(3)))
|
|
550
|
+
S^{{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
551
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
552
|
+
\lr{\phantom{x}}&\lr{\phantom{x}}\\\cline{1-2}
|
|
553
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
554
|
+
\end{array}$}
|
|
555
|
+
},{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
556
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
557
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
558
|
+
\end{array}$}
|
|
559
|
+
}}
|
|
560
|
+
"""
|
|
561
|
+
from sage.misc.latex import latex
|
|
562
|
+
return "S^{" + ",".join(latex(la) for la in self._diagram) + "}"
|
|
563
|
+
|
|
564
|
+
@lazy_attribute
|
|
565
|
+
def lift(self):
|
|
566
|
+
r"""
|
|
567
|
+
The lift (embedding) map from ``self`` to the ambient space.
|
|
568
|
+
|
|
569
|
+
EXAMPLES::
|
|
570
|
+
|
|
571
|
+
sage: B4 = SignedPermutations(4)
|
|
572
|
+
sage: SM = B4.specht_module([[1], [2,1]], QQ)
|
|
573
|
+
sage: SM.lift
|
|
574
|
+
Generic morphism:
|
|
575
|
+
From: Specht module of shape ([1], [2, 1]) over Rational Field
|
|
576
|
+
To: Tabloid module of ([1], [2, 1]) over Rational Field
|
|
577
|
+
"""
|
|
578
|
+
return self.module_morphism(self.lift_on_basis, codomain=self.ambient())
|
|
579
|
+
|
|
580
|
+
@lazy_attribute
|
|
581
|
+
def retract(self):
|
|
582
|
+
r"""
|
|
583
|
+
The retract map from the ambient space.
|
|
584
|
+
|
|
585
|
+
EXAMPLES::
|
|
586
|
+
|
|
587
|
+
sage: B5 = SignedPermutations(5)
|
|
588
|
+
sage: X = B5.tabloid_module([[2,1], [2]], QQ)
|
|
589
|
+
sage: Y = X.specht_module()
|
|
590
|
+
sage: Y.retract
|
|
591
|
+
Generic morphism:
|
|
592
|
+
From: Tabloid module of ([2, 1], [2]) over Rational Field
|
|
593
|
+
To: Specht module of shape ([2, 1], [2]) over Rational Field
|
|
594
|
+
sage: all(Y.retract(u.lift()) == u for u in Y.basis())
|
|
595
|
+
True
|
|
596
|
+
|
|
597
|
+
sage: Y.retract(X.zero())
|
|
598
|
+
0
|
|
599
|
+
sage: Y.retract(sum(X.basis()))
|
|
600
|
+
Traceback (most recent call last):
|
|
601
|
+
...
|
|
602
|
+
ValueError: ... is not in the image
|
|
603
|
+
"""
|
|
604
|
+
B = self.basis()
|
|
605
|
+
COB = matrix([b.lift().to_vector() for b in B]).T
|
|
606
|
+
P, L, U = COB.LU()
|
|
607
|
+
# Since U is upper triangular, the nonzero entriesm must be in the
|
|
608
|
+
# upper square portiion of the matrix
|
|
609
|
+
n = len(B)
|
|
610
|
+
|
|
611
|
+
Uinv = U.matrix_from_rows(range(n)).inverse()
|
|
612
|
+
# This is a slight abuse as the codomain should be a module with a different
|
|
613
|
+
# S_n action, but we only use it internally, so there isn't any problems
|
|
614
|
+
PLinv = (P*L).inverse()
|
|
615
|
+
|
|
616
|
+
def retraction(elt):
|
|
617
|
+
vec = PLinv * elt.to_vector(order=self._support_order)
|
|
618
|
+
if not vec:
|
|
619
|
+
return self.zero()
|
|
620
|
+
# vec is now in the image of self under U, which is
|
|
621
|
+
if max(vec.support()) >= n:
|
|
622
|
+
raise ValueError(f"{elt} is not in the image")
|
|
623
|
+
return self._from_dict(dict(zip(B.keys(), Uinv * vec[:n])))
|
|
624
|
+
|
|
625
|
+
return self._ambient.module_morphism(function=retraction, codomain=self)
|
|
626
|
+
|
|
627
|
+
def bilinear_form(self, u, v):
|
|
628
|
+
r"""
|
|
629
|
+
Return the natural bilinear form of ``self`` applied to ``u`` and ``v``.
|
|
630
|
+
|
|
631
|
+
The natural bilinear form is given by the pullback of the natural
|
|
632
|
+
bilinear form on the tabloid module (where the tabloid basis is an
|
|
633
|
+
orthonormal basis).
|
|
634
|
+
|
|
635
|
+
EXAMPLES::
|
|
636
|
+
|
|
637
|
+
sage: B5 = SignedPermutations(5)
|
|
638
|
+
sage: SM = B5.specht_module([[1], [2,2]], QQ)
|
|
639
|
+
sage: u = SM.an_element(); u
|
|
640
|
+
2*S([[1]], [[2, 3], [4, 5]]) + 2*S([[2]], [[1, 3], [4, 5]])
|
|
641
|
+
+ 3*S([[3]], [[1, 2], [4, 5]])
|
|
642
|
+
sage: v = sum(SM.basis())
|
|
643
|
+
sage: SM.bilinear_form(u, v)
|
|
644
|
+
84
|
|
645
|
+
"""
|
|
646
|
+
TM = self._ambient
|
|
647
|
+
return TM.bilinear_form(u.lift(), v.lift())
|
|
648
|
+
|
|
649
|
+
@cached_method
|
|
650
|
+
def gram_matrix(self):
|
|
651
|
+
r"""
|
|
652
|
+
Return the Gram matrix of the natural bilinear form of ``self``.
|
|
653
|
+
|
|
654
|
+
EXAMPLES::
|
|
655
|
+
|
|
656
|
+
sage: B4 = SignedPermutations(4)
|
|
657
|
+
sage: SM = B4.specht_module([[2,1], [1]], QQ)
|
|
658
|
+
sage: M = SM.gram_matrix(); M
|
|
659
|
+
[16 8 0 0 0 0 0 0]
|
|
660
|
+
[ 8 16 0 0 0 0 0 0]
|
|
661
|
+
[ 0 0 16 0 0 8 0 0]
|
|
662
|
+
[ 0 0 0 16 0 0 8 0]
|
|
663
|
+
[ 0 0 0 0 16 0 0 8]
|
|
664
|
+
[ 0 0 8 0 0 16 0 0]
|
|
665
|
+
[ 0 0 0 8 0 0 16 0]
|
|
666
|
+
[ 0 0 0 0 8 0 0 16]
|
|
667
|
+
sage: M.det() != 0
|
|
668
|
+
True
|
|
669
|
+
"""
|
|
670
|
+
B = self.basis()
|
|
671
|
+
M = matrix([[self.bilinear_form(b, bp) for bp in B] for b in B])
|
|
672
|
+
M.set_immutable()
|
|
673
|
+
return M
|
|
674
|
+
|
|
675
|
+
def maximal_submodule(self):
|
|
676
|
+
"""
|
|
677
|
+
Return the maximal submodule of ``self``.
|
|
678
|
+
|
|
679
|
+
EXAMPLES::
|
|
680
|
+
|
|
681
|
+
sage: B4 = SignedPermutations(4)
|
|
682
|
+
sage: SM = B4.specht_module([[1], [2,1]], GF(3))
|
|
683
|
+
sage: SM.dimension()
|
|
684
|
+
8
|
|
685
|
+
sage: U = SM.maximal_submodule()
|
|
686
|
+
sage: U.dimension()
|
|
687
|
+
4
|
|
688
|
+
"""
|
|
689
|
+
return MaximalSpechtSubmodule(self)
|
|
690
|
+
|
|
691
|
+
def simple_module(self):
|
|
692
|
+
r"""
|
|
693
|
+
Return the simple (or irreducible) `S_n`-submodule of ``self``.
|
|
694
|
+
|
|
695
|
+
.. SEEALSO::
|
|
696
|
+
|
|
697
|
+
:class:`~sage.combinat.specht_module.SimpleModule`
|
|
698
|
+
|
|
699
|
+
EXAMPLES::
|
|
700
|
+
|
|
701
|
+
sage: B4 = SignedPermutations(4)
|
|
702
|
+
sage: SM = B4.specht_module([[2,1], [1]], GF(3))
|
|
703
|
+
sage: L = SM.simple_module()
|
|
704
|
+
sage: L.dimension()
|
|
705
|
+
4
|
|
706
|
+
|
|
707
|
+
sage: SM = B4.specht_module([[2,1], [1]], QQ)
|
|
708
|
+
sage: SM.simple_module() is SM
|
|
709
|
+
True
|
|
710
|
+
"""
|
|
711
|
+
if self.base_ring().characteristic() == 0:
|
|
712
|
+
return self
|
|
713
|
+
return SimpleModule(self)
|
|
714
|
+
|
|
715
|
+
Element = SymGroupSpechtModule.Element
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
class MaximalSpechtSubmodule(Representation_abstract, SubmoduleWithBasis):
|
|
719
|
+
r"""
|
|
720
|
+
The maximal submodule `U^{\lambda, \mu}` of the type `B_n` Specht
|
|
721
|
+
module `S^{\lambda, \mu}`.
|
|
722
|
+
|
|
723
|
+
ALGORITHM:
|
|
724
|
+
|
|
725
|
+
We construct `U^{(\lambda,\mu)}` as the intersection `S \cap S^{\perp}`,
|
|
726
|
+
where `S^{\perp}` is the orthogonal complement of the Specht module `S`
|
|
727
|
+
inside of the tabloid module `T` (with respect to the natural
|
|
728
|
+
bilinear form on `T`).
|
|
729
|
+
|
|
730
|
+
EXAMPLES::
|
|
731
|
+
|
|
732
|
+
sage: B4 = SignedPermutations(4)
|
|
733
|
+
sage: SM = B4.specht_module([[1], [2,1]], GF(3))
|
|
734
|
+
sage: U = SM.maximal_submodule()
|
|
735
|
+
sage: u = U.an_element(); u
|
|
736
|
+
2*U[0] + 2*U[1]
|
|
737
|
+
sage: [p * u for p in list(B4)[:4]]
|
|
738
|
+
[2*U[0] + 2*U[1], 2*U[0] + 2*U[1], 2*U[0] + 2*U[1], 2*U[0] + 2*U[1]]
|
|
739
|
+
sage: sum(U.semigroup_algebra().basis()) * u # long time
|
|
740
|
+
0
|
|
741
|
+
"""
|
|
742
|
+
def __init__(self, specht_module):
|
|
743
|
+
r"""
|
|
744
|
+
Initialize ``self``.
|
|
745
|
+
|
|
746
|
+
EXAMPLES::
|
|
747
|
+
|
|
748
|
+
sage: B4 = SignedPermutations(4)
|
|
749
|
+
sage: SM = B4.specht_module([[1], [2,1]], GF(3))
|
|
750
|
+
sage: U = SM.maximal_submodule()
|
|
751
|
+
sage: TestSuite(U).run()
|
|
752
|
+
|
|
753
|
+
sage: SM = B4.specht_module([[1,1,1], [1]], GF(3))
|
|
754
|
+
sage: U = SM.maximal_submodule()
|
|
755
|
+
sage: TestSuite(U).run()
|
|
756
|
+
|
|
757
|
+
sage: SM = B4.specht_module([[1], [2,1]], QQ)
|
|
758
|
+
sage: U = SM.maximal_submodule()
|
|
759
|
+
sage: TestSuite(U).run()
|
|
760
|
+
sage: U.dimension()
|
|
761
|
+
0
|
|
762
|
+
"""
|
|
763
|
+
Representation_abstract.__init__(self, specht_module._semigroup, specht_module._side,
|
|
764
|
+
algebra=specht_module._semigroup_algebra)
|
|
765
|
+
self._diagram = specht_module._diagram
|
|
766
|
+
|
|
767
|
+
from sage.sets.family import Family
|
|
768
|
+
p = specht_module.base_ring().characteristic()
|
|
769
|
+
if p == 0:
|
|
770
|
+
basis = Family([])
|
|
771
|
+
else:
|
|
772
|
+
TM = specht_module._ambient
|
|
773
|
+
if not all(la.is_regular(p) for la in TM._diagram) or (p == 2 and TM._diagram[0]):
|
|
774
|
+
basis = specht_module.basis()
|
|
775
|
+
else:
|
|
776
|
+
TV = TM._dense_free_module()
|
|
777
|
+
SV = TV.submodule(specht_module.lift.matrix().columns())
|
|
778
|
+
basis = (SV & SV.complement()).basis()
|
|
779
|
+
basis = [specht_module.retract(TM.from_vector(b)) for b in basis]
|
|
780
|
+
basis = Family(specht_module.echelon_form(basis))
|
|
781
|
+
|
|
782
|
+
unitriangular = all(b.leading_support() == 1 for b in basis)
|
|
783
|
+
support_order = list(specht_module.basis().keys())
|
|
784
|
+
cat = specht_module.category().Subobjects()
|
|
785
|
+
SubmoduleWithBasis.__init__(self, basis, support_order, ambient=specht_module,
|
|
786
|
+
unitriangular=unitriangular, category=cat,
|
|
787
|
+
prefix='U')
|
|
788
|
+
|
|
789
|
+
def _repr_(self):
|
|
790
|
+
r"""
|
|
791
|
+
Return a string representation of ``self``.
|
|
792
|
+
|
|
793
|
+
EXAMPLES::
|
|
794
|
+
|
|
795
|
+
sage: B4 = SignedPermutations(4)
|
|
796
|
+
sage: SM = B4.specht_module([[1], [2,1]], GF(3))
|
|
797
|
+
sage: SM.maximal_submodule()
|
|
798
|
+
Maximal submodule of Specht module of shape ([1], [2, 1])
|
|
799
|
+
over Finite Field of size 3
|
|
800
|
+
"""
|
|
801
|
+
return f"Maximal submodule of {self._ambient}"
|
|
802
|
+
|
|
803
|
+
def _latex_(self):
|
|
804
|
+
r"""
|
|
805
|
+
Return a latex representation of ``self``.
|
|
806
|
+
|
|
807
|
+
EXAMPLES::
|
|
808
|
+
|
|
809
|
+
sage: B4 = SignedPermutations(4)
|
|
810
|
+
sage: latex(B4.specht_module([[2,1], [1]], GF(3)).maximal_submodule())
|
|
811
|
+
U^{{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
812
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
813
|
+
\lr{\phantom{x}}&\lr{\phantom{x}}\\\cline{1-2}
|
|
814
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
815
|
+
\end{array}$}
|
|
816
|
+
},{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
817
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
818
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
819
|
+
\end{array}$}
|
|
820
|
+
}}
|
|
821
|
+
"""
|
|
822
|
+
from sage.misc.latex import latex
|
|
823
|
+
return "U^{" + ",".join(latex(la) for la in self._diagram) + "}"
|
|
824
|
+
|
|
825
|
+
Element = SymGroupSpechtModule.Element
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
class SimpleModule(Representation_abstract, QuotientModuleWithBasis):
|
|
829
|
+
r"""
|
|
830
|
+
The simple `B_n`-module associated with a partition pair `(\lambda, \mu)`.
|
|
831
|
+
|
|
832
|
+
The simple module `D^{\lambda, \mu}` is the quotient of the
|
|
833
|
+
Specht module `S^{\lambda, \mu}` by its
|
|
834
|
+
:class:`maximal submodule <MaximalSpechtSubmodule>` `U^{\lambda, \mu}`.
|
|
835
|
+
|
|
836
|
+
For `p \neq 2`, a partition pair `(\lambda, \mu)` is `p`-*regular*
|
|
837
|
+
if `\lambda` and `\mu` are `p`-regular partitions. It is `2`-regular
|
|
838
|
+
if `\lambda = \emptyset` and `\mu` is `2`-regular.
|
|
839
|
+
|
|
840
|
+
EXAMPLES::
|
|
841
|
+
|
|
842
|
+
sage: B5 = SignedPermutations(5)
|
|
843
|
+
sage: SM = B5.specht_module([[1,1], [2,1]], GF(3))
|
|
844
|
+
sage: D = SM.simple_module()
|
|
845
|
+
sage: v = D.an_element(); v
|
|
846
|
+
2*D([[1], [2]], [[3, 5], [4]]) + 2*D([[1], [3]], [[2, 5], [4]])
|
|
847
|
+
sage: B5.an_element() * v
|
|
848
|
+
2*D([[1], [5]], [[2, 4], [3]]) + 2*D([[2], [5]], [[1, 4], [3]])
|
|
849
|
+
|
|
850
|
+
An example of a simple module for `n = 4` coming from the tabloid module::
|
|
851
|
+
|
|
852
|
+
sage: B4 = SignedPermutations(4)
|
|
853
|
+
sage: TM = B4.tabloid_module([[1], [2,1]], GF(3))
|
|
854
|
+
sage: SM = TM.specht_module()
|
|
855
|
+
sage: SM.dimension()
|
|
856
|
+
8
|
|
857
|
+
sage: SM.maximal_submodule().dimension()
|
|
858
|
+
4
|
|
859
|
+
sage: D = SM.simple_module()
|
|
860
|
+
sage: D
|
|
861
|
+
Simple module of ([1], [2, 1]) over Finite Field of size 3
|
|
862
|
+
sage: D.dimension()
|
|
863
|
+
4
|
|
864
|
+
|
|
865
|
+
We give an example on how to construct the decomposition matrix
|
|
866
|
+
(the Specht modules are a complete set of irreducible projective
|
|
867
|
+
modules) and the Cartan matrix of a symmetric group algebra::
|
|
868
|
+
|
|
869
|
+
sage: B3 = SignedPermutations(3)
|
|
870
|
+
sage: BM = matrix(B3.simple_module(la, GF(3)).brauer_character()
|
|
871
|
+
....: for la in PartitionTuples(2, 3, regular=3))
|
|
872
|
+
sage: SBT = matrix(B3.specht_module(la, GF(3)).brauer_character()
|
|
873
|
+
....: for la in PartitionTuples(2, 3))
|
|
874
|
+
sage: D = SBT * ~BM; D
|
|
875
|
+
[1 0 0 0 0 0 0 0]
|
|
876
|
+
[1 1 0 0 0 0 0 0]
|
|
877
|
+
[0 1 0 0 0 0 0 0]
|
|
878
|
+
[0 0 1 0 0 0 0 0]
|
|
879
|
+
[0 0 0 1 0 0 0 0]
|
|
880
|
+
[0 0 0 0 1 0 0 0]
|
|
881
|
+
[0 0 0 0 0 1 0 0]
|
|
882
|
+
[0 0 0 0 0 0 1 0]
|
|
883
|
+
[0 0 0 0 0 0 1 1]
|
|
884
|
+
[0 0 0 0 0 0 0 1]
|
|
885
|
+
sage: D.transpose() * D
|
|
886
|
+
[2 1 0 0 0 0 0 0]
|
|
887
|
+
[1 2 0 0 0 0 0 0]
|
|
888
|
+
[0 0 1 0 0 0 0 0]
|
|
889
|
+
[0 0 0 1 0 0 0 0]
|
|
890
|
+
[0 0 0 0 1 0 0 0]
|
|
891
|
+
[0 0 0 0 0 1 0 0]
|
|
892
|
+
[0 0 0 0 0 0 2 1]
|
|
893
|
+
[0 0 0 0 0 0 1 2]
|
|
894
|
+
|
|
895
|
+
We verify this against the direct computation (up to reindexing the
|
|
896
|
+
rows and columns)::
|
|
897
|
+
|
|
898
|
+
sage: B3A = B3.algebra(GF(3))
|
|
899
|
+
sage: B3A.cartan_invariants_matrix() # not tested (~2 min)
|
|
900
|
+
[2 1 0 0 0 0 0 0]
|
|
901
|
+
[1 2 0 0 0 0 0 0]
|
|
902
|
+
[0 0 2 1 0 0 0 0]
|
|
903
|
+
[0 0 1 2 0 0 0 0]
|
|
904
|
+
[0 0 0 0 1 0 0 0]
|
|
905
|
+
[0 0 0 0 0 1 0 0]
|
|
906
|
+
[0 0 0 0 0 0 1 0]
|
|
907
|
+
[0 0 0 0 0 0 0 1]
|
|
908
|
+
"""
|
|
909
|
+
def __init__(self, specht_module):
|
|
910
|
+
r"""
|
|
911
|
+
Initialize ``self``.
|
|
912
|
+
|
|
913
|
+
EXAMPLES::
|
|
914
|
+
|
|
915
|
+
sage: B4 = SignedPermutations(4)
|
|
916
|
+
sage: D = B4.simple_module([[2,1], [1]], GF(3))
|
|
917
|
+
sage: TestSuite(D).run()
|
|
918
|
+
"""
|
|
919
|
+
self._diagram = specht_module._diagram
|
|
920
|
+
p = specht_module.base_ring().characteristic()
|
|
921
|
+
if (not all(la.is_regular(p) for la in specht_module._diagram)
|
|
922
|
+
or (p == 2 and specht_module._diagram[0])):
|
|
923
|
+
raise ValueError(f"the partition must be {p}-regular")
|
|
924
|
+
Representation_abstract.__init__(self, specht_module._semigroup, specht_module._side,
|
|
925
|
+
algebra=specht_module._semigroup_algebra)
|
|
926
|
+
cat = specht_module.category()
|
|
927
|
+
QuotientModuleWithBasis.__init__(self, specht_module.maximal_submodule(),
|
|
928
|
+
cat, prefix='D', bracket='')
|
|
929
|
+
|
|
930
|
+
def _repr_(self):
|
|
931
|
+
r"""
|
|
932
|
+
Return a string representation of ``self``.
|
|
933
|
+
|
|
934
|
+
EXAMPLES::
|
|
935
|
+
|
|
936
|
+
sage: B4 = SignedPermutations(4)
|
|
937
|
+
sage: B4.simple_module([[1], [3]], GF(3))
|
|
938
|
+
Simple module of ([1], [3]) over Finite Field of size 3
|
|
939
|
+
"""
|
|
940
|
+
return f"Simple module of {self._diagram} over {self.base_ring()}"
|
|
941
|
+
|
|
942
|
+
def _latex_(self):
|
|
943
|
+
r"""
|
|
944
|
+
Return a latex representation of ``self``.
|
|
945
|
+
|
|
946
|
+
EXAMPLES::
|
|
947
|
+
|
|
948
|
+
sage: B4 = SignedPermutations(4)
|
|
949
|
+
sage: latex(B4.simple_module([[2,1],[1]], GF(3)))
|
|
950
|
+
D^{{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
951
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{2}c}\cline{1-2}
|
|
952
|
+
\lr{\phantom{x}}&\lr{\phantom{x}}\\\cline{1-2}
|
|
953
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
954
|
+
\end{array}$}
|
|
955
|
+
},{\def\lr#1{\multicolumn{1}{|@{\hspace{.6ex}}c@{\hspace{.6ex}}|}{\raisebox{-.3ex}{$#1$}}}
|
|
956
|
+
\raisebox{-.6ex}{$\begin{array}[b]{*{1}c}\cline{1-1}
|
|
957
|
+
\lr{\phantom{x}}\\\cline{1-1}
|
|
958
|
+
\end{array}$}
|
|
959
|
+
}}
|
|
960
|
+
"""
|
|
961
|
+
from sage.misc.latex import latex
|
|
962
|
+
return "D^{" + ",".join(latex(la) for la in self._diagram) + "}"
|
|
963
|
+
|
|
964
|
+
Element = SymGroupSpechtModule.Element
|