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.
Files changed (400) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  3. passagemath_combinat-10.6.42.dist-info/RECORD +400 -0
  4. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  5. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  6. passagemath_combinat.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  7. passagemath_combinat.libs/libsymmetrica-81fe8739.so.3.0.0 +0 -0
  8. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  9. sage/algebras/all.py +24 -0
  10. sage/algebras/all__sagemath_combinat.py +35 -0
  11. sage/algebras/askey_wilson.py +935 -0
  12. sage/algebras/associated_graded.py +345 -0
  13. sage/algebras/cellular_basis.py +350 -0
  14. sage/algebras/cluster_algebra.py +2766 -0
  15. sage/algebras/down_up_algebra.py +860 -0
  16. sage/algebras/free_algebra.py +1698 -0
  17. sage/algebras/free_algebra_element.py +345 -0
  18. sage/algebras/free_algebra_quotient.py +405 -0
  19. sage/algebras/free_algebra_quotient_element.py +295 -0
  20. sage/algebras/free_zinbiel_algebra.py +885 -0
  21. sage/algebras/hall_algebra.py +783 -0
  22. sage/algebras/hecke_algebras/all.py +4 -0
  23. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  24. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  25. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  28. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  29. sage/algebras/jordan_algebra.py +1773 -0
  30. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  31. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  32. sage/algebras/lie_conformal_algebras/all.py +18 -0
  33. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  34. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  35. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  36. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  37. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  38. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  39. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  40. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  41. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  45. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  46. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  47. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  48. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  49. sage/algebras/nil_coxeter_algebra.py +191 -0
  50. sage/algebras/q_commuting_polynomials.py +673 -0
  51. sage/algebras/q_system.py +608 -0
  52. sage/algebras/quantum_clifford.py +959 -0
  53. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  54. sage/algebras/quantum_groups/all.py +9 -0
  55. sage/algebras/quantum_groups/fock_space.py +2219 -0
  56. sage/algebras/quantum_groups/q_numbers.py +207 -0
  57. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  58. sage/algebras/quantum_groups/representations.py +591 -0
  59. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  60. sage/algebras/quantum_oscillator.py +623 -0
  61. sage/algebras/quaternion_algebra.py +20 -0
  62. sage/algebras/quaternion_algebra_element.py +55 -0
  63. sage/algebras/rational_cherednik_algebra.py +525 -0
  64. sage/algebras/schur_algebra.py +670 -0
  65. sage/algebras/shuffle_algebra.py +1011 -0
  66. sage/algebras/splitting_algebra.py +779 -0
  67. sage/algebras/tensor_algebra.py +709 -0
  68. sage/algebras/yangian.py +1082 -0
  69. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  70. sage/all__sagemath_combinat.py +35 -0
  71. sage/combinat/SJT.py +255 -0
  72. sage/combinat/affine_permutation.py +2405 -0
  73. sage/combinat/algebraic_combinatorics.py +55 -0
  74. sage/combinat/all.py +53 -0
  75. sage/combinat/all__sagemath_combinat.py +195 -0
  76. sage/combinat/alternating_sign_matrix.py +2063 -0
  77. sage/combinat/baxter_permutations.py +346 -0
  78. sage/combinat/bijectionist.py +3220 -0
  79. sage/combinat/binary_recurrence_sequences.py +1180 -0
  80. sage/combinat/blob_algebra.py +685 -0
  81. sage/combinat/catalog_partitions.py +27 -0
  82. sage/combinat/chas/all.py +23 -0
  83. sage/combinat/chas/fsym.py +1180 -0
  84. sage/combinat/chas/wqsym.py +2601 -0
  85. sage/combinat/cluster_complex.py +326 -0
  86. sage/combinat/colored_permutations.py +2039 -0
  87. sage/combinat/colored_permutations_representations.py +964 -0
  88. sage/combinat/composition_signed.py +142 -0
  89. sage/combinat/composition_tableau.py +855 -0
  90. sage/combinat/constellation.py +1729 -0
  91. sage/combinat/core.py +751 -0
  92. sage/combinat/counting.py +12 -0
  93. sage/combinat/crystals/affine.py +742 -0
  94. sage/combinat/crystals/affine_factorization.py +518 -0
  95. sage/combinat/crystals/affinization.py +331 -0
  96. sage/combinat/crystals/alcove_path.py +2013 -0
  97. sage/combinat/crystals/all.py +22 -0
  98. sage/combinat/crystals/bkk_crystals.py +141 -0
  99. sage/combinat/crystals/catalog.py +115 -0
  100. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  101. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  102. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  103. sage/combinat/crystals/crystals.py +257 -0
  104. sage/combinat/crystals/direct_sum.py +260 -0
  105. sage/combinat/crystals/elementary_crystals.py +1251 -0
  106. sage/combinat/crystals/fast_crystals.py +441 -0
  107. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  108. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  109. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  110. sage/combinat/crystals/induced_structure.py +695 -0
  111. sage/combinat/crystals/infinity_crystals.py +730 -0
  112. sage/combinat/crystals/kac_modules.py +863 -0
  113. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  114. sage/combinat/crystals/kyoto_path_model.py +497 -0
  115. sage/combinat/crystals/letters.cpython-314-x86_64-linux-musl.so +0 -0
  116. sage/combinat/crystals/letters.pxd +79 -0
  117. sage/combinat/crystals/letters.pyx +3056 -0
  118. sage/combinat/crystals/littelmann_path.py +1518 -0
  119. sage/combinat/crystals/monomial_crystals.py +1262 -0
  120. sage/combinat/crystals/multisegments.py +462 -0
  121. sage/combinat/crystals/mv_polytopes.py +467 -0
  122. sage/combinat/crystals/pbw_crystal.py +511 -0
  123. sage/combinat/crystals/pbw_datum.cpython-314-x86_64-linux-musl.so +0 -0
  124. sage/combinat/crystals/pbw_datum.pxd +4 -0
  125. sage/combinat/crystals/pbw_datum.pyx +487 -0
  126. sage/combinat/crystals/polyhedral_realization.py +372 -0
  127. sage/combinat/crystals/spins.cpython-314-x86_64-linux-musl.so +0 -0
  128. sage/combinat/crystals/spins.pxd +21 -0
  129. sage/combinat/crystals/spins.pyx +756 -0
  130. sage/combinat/crystals/star_crystal.py +290 -0
  131. sage/combinat/crystals/subcrystal.py +464 -0
  132. sage/combinat/crystals/tensor_product.py +1177 -0
  133. sage/combinat/crystals/tensor_product_element.cpython-314-x86_64-linux-musl.so +0 -0
  134. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  135. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  136. sage/combinat/crystals/virtual_crystal.py +420 -0
  137. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  138. sage/combinat/debruijn_sequence.cpython-314-x86_64-linux-musl.so +0 -0
  139. sage/combinat/debruijn_sequence.pyx +355 -0
  140. sage/combinat/decorated_permutation.py +270 -0
  141. sage/combinat/degree_sequences.cpython-314-x86_64-linux-musl.so +0 -0
  142. sage/combinat/degree_sequences.pyx +588 -0
  143. sage/combinat/derangements.py +527 -0
  144. sage/combinat/descent_algebra.py +1008 -0
  145. sage/combinat/diagram.py +1551 -0
  146. sage/combinat/diagram_algebras.py +5886 -0
  147. sage/combinat/dyck_word.py +4349 -0
  148. sage/combinat/e_one_star.py +1623 -0
  149. sage/combinat/enumerated_sets.py +123 -0
  150. sage/combinat/expnums.cpython-314-x86_64-linux-musl.so +0 -0
  151. sage/combinat/expnums.pyx +148 -0
  152. sage/combinat/fast_vector_partitions.cpython-314-x86_64-linux-musl.so +0 -0
  153. sage/combinat/fast_vector_partitions.pyx +346 -0
  154. sage/combinat/fqsym.py +1977 -0
  155. sage/combinat/free_dendriform_algebra.py +954 -0
  156. sage/combinat/free_prelie_algebra.py +1141 -0
  157. sage/combinat/fully_commutative_elements.py +1077 -0
  158. sage/combinat/fully_packed_loop.py +1523 -0
  159. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  160. sage/combinat/gray_codes.py +311 -0
  161. sage/combinat/grossman_larson_algebras.py +667 -0
  162. sage/combinat/growth.py +4352 -0
  163. sage/combinat/hall_polynomial.py +188 -0
  164. sage/combinat/hillman_grassl.py +866 -0
  165. sage/combinat/integer_matrices.py +329 -0
  166. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  167. sage/combinat/k_tableau.py +4564 -0
  168. sage/combinat/kazhdan_lusztig.py +215 -0
  169. sage/combinat/key_polynomial.py +885 -0
  170. sage/combinat/knutson_tao_puzzles.py +2286 -0
  171. sage/combinat/lr_tableau.py +311 -0
  172. sage/combinat/matrices/all.py +24 -0
  173. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  174. sage/combinat/matrices/latin.py +2912 -0
  175. sage/combinat/misc.py +401 -0
  176. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  177. sage/combinat/ncsf_qsym/all.py +21 -0
  178. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  179. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  180. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  181. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  182. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  183. sage/combinat/ncsym/all.py +21 -0
  184. sage/combinat/ncsym/bases.py +855 -0
  185. sage/combinat/ncsym/dual.py +593 -0
  186. sage/combinat/ncsym/ncsym.py +2076 -0
  187. sage/combinat/necklace.py +551 -0
  188. sage/combinat/non_decreasing_parking_function.py +634 -0
  189. sage/combinat/nu_dyck_word.py +1474 -0
  190. sage/combinat/output.py +861 -0
  191. sage/combinat/parallelogram_polyomino.py +4326 -0
  192. sage/combinat/parking_functions.py +1602 -0
  193. sage/combinat/partition_algebra.py +1998 -0
  194. sage/combinat/partition_kleshchev.py +1982 -0
  195. sage/combinat/partition_shifting_algebras.py +584 -0
  196. sage/combinat/partition_tuple.py +3114 -0
  197. sage/combinat/path_tableaux/all.py +13 -0
  198. sage/combinat/path_tableaux/catalog.py +29 -0
  199. sage/combinat/path_tableaux/dyck_path.py +380 -0
  200. sage/combinat/path_tableaux/frieze.py +476 -0
  201. sage/combinat/path_tableaux/path_tableau.py +728 -0
  202. sage/combinat/path_tableaux/semistandard.py +510 -0
  203. sage/combinat/perfect_matching.py +779 -0
  204. sage/combinat/plane_partition.py +3300 -0
  205. sage/combinat/q_bernoulli.cpython-314-x86_64-linux-musl.so +0 -0
  206. sage/combinat/q_bernoulli.pyx +128 -0
  207. sage/combinat/quickref.py +81 -0
  208. sage/combinat/recognizable_series.py +2051 -0
  209. sage/combinat/regular_sequence.py +4316 -0
  210. sage/combinat/regular_sequence_bounded.py +543 -0
  211. sage/combinat/restricted_growth.py +81 -0
  212. sage/combinat/ribbon.py +20 -0
  213. sage/combinat/ribbon_shaped_tableau.py +489 -0
  214. sage/combinat/ribbon_tableau.py +1180 -0
  215. sage/combinat/rigged_configurations/all.py +46 -0
  216. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  217. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  218. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  219. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  222. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  223. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  224. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  225. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  226. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  227. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  228. sage/combinat/rigged_configurations/bijection.py +143 -0
  229. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  230. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  231. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  232. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  233. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  234. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  235. sage/combinat/rigged_configurations/rigged_partition.cpython-314-x86_64-linux-musl.so +0 -0
  236. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  238. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  240. sage/combinat/rsk.py +3438 -0
  241. sage/combinat/schubert_polynomial.py +508 -0
  242. sage/combinat/set_partition.py +3318 -0
  243. sage/combinat/set_partition_iterator.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/combinat/set_partition_iterator.pyx +136 -0
  245. sage/combinat/set_partition_ordered.py +1590 -0
  246. sage/combinat/sf/abreu_nigro.py +346 -0
  247. sage/combinat/sf/all.py +52 -0
  248. sage/combinat/sf/character.py +576 -0
  249. sage/combinat/sf/classical.py +319 -0
  250. sage/combinat/sf/dual.py +996 -0
  251. sage/combinat/sf/elementary.py +549 -0
  252. sage/combinat/sf/hall_littlewood.py +1028 -0
  253. sage/combinat/sf/hecke.py +336 -0
  254. sage/combinat/sf/homogeneous.py +464 -0
  255. sage/combinat/sf/jack.py +1428 -0
  256. sage/combinat/sf/k_dual.py +1458 -0
  257. sage/combinat/sf/kfpoly.py +447 -0
  258. sage/combinat/sf/llt.py +789 -0
  259. sage/combinat/sf/macdonald.py +2019 -0
  260. sage/combinat/sf/monomial.py +525 -0
  261. sage/combinat/sf/multiplicative.py +113 -0
  262. sage/combinat/sf/new_kschur.py +1786 -0
  263. sage/combinat/sf/ns_macdonald.py +964 -0
  264. sage/combinat/sf/orthogonal.py +246 -0
  265. sage/combinat/sf/orthotriang.py +355 -0
  266. sage/combinat/sf/powersum.py +963 -0
  267. sage/combinat/sf/schur.py +880 -0
  268. sage/combinat/sf/sf.py +1653 -0
  269. sage/combinat/sf/sfa.py +7053 -0
  270. sage/combinat/sf/symplectic.py +253 -0
  271. sage/combinat/sf/witt.py +721 -0
  272. sage/combinat/shifted_primed_tableau.py +2735 -0
  273. sage/combinat/shuffle.py +830 -0
  274. sage/combinat/sidon_sets.py +146 -0
  275. sage/combinat/similarity_class_type.py +1721 -0
  276. sage/combinat/sine_gordon.py +618 -0
  277. sage/combinat/six_vertex_model.py +784 -0
  278. sage/combinat/skew_partition.py +2053 -0
  279. sage/combinat/skew_tableau.py +2989 -0
  280. sage/combinat/sloane_functions.py +8935 -0
  281. sage/combinat/specht_module.py +1403 -0
  282. sage/combinat/species/all.py +48 -0
  283. sage/combinat/species/characteristic_species.py +321 -0
  284. sage/combinat/species/composition_species.py +273 -0
  285. sage/combinat/species/cycle_species.py +284 -0
  286. sage/combinat/species/empty_species.py +155 -0
  287. sage/combinat/species/functorial_composition_species.py +148 -0
  288. sage/combinat/species/generating_series.py +673 -0
  289. sage/combinat/species/library.py +148 -0
  290. sage/combinat/species/linear_order_species.py +169 -0
  291. sage/combinat/species/misc.py +83 -0
  292. sage/combinat/species/partition_species.py +290 -0
  293. sage/combinat/species/permutation_species.py +268 -0
  294. sage/combinat/species/product_species.py +423 -0
  295. sage/combinat/species/recursive_species.py +476 -0
  296. sage/combinat/species/set_species.py +192 -0
  297. sage/combinat/species/species.py +820 -0
  298. sage/combinat/species/structure.py +539 -0
  299. sage/combinat/species/subset_species.py +243 -0
  300. sage/combinat/species/sum_species.py +225 -0
  301. sage/combinat/subword.py +564 -0
  302. sage/combinat/subword_complex.py +2122 -0
  303. sage/combinat/subword_complex_c.cpython-314-x86_64-linux-musl.so +0 -0
  304. sage/combinat/subword_complex_c.pyx +119 -0
  305. sage/combinat/super_tableau.py +821 -0
  306. sage/combinat/superpartition.py +1154 -0
  307. sage/combinat/symmetric_group_algebra.py +3774 -0
  308. sage/combinat/symmetric_group_representations.py +1830 -0
  309. sage/combinat/t_sequences.py +877 -0
  310. sage/combinat/tableau.py +9506 -0
  311. sage/combinat/tableau_residues.py +860 -0
  312. sage/combinat/tableau_tuple.py +5353 -0
  313. sage/combinat/tiling.py +2432 -0
  314. sage/combinat/triangles_FHM.py +777 -0
  315. sage/combinat/tutorial.py +1857 -0
  316. sage/combinat/vector_partition.py +337 -0
  317. sage/combinat/words/abstract_word.py +1722 -0
  318. sage/combinat/words/all.py +59 -0
  319. sage/combinat/words/alphabet.py +268 -0
  320. sage/combinat/words/finite_word.py +7201 -0
  321. sage/combinat/words/infinite_word.py +113 -0
  322. sage/combinat/words/lyndon_word.py +652 -0
  323. sage/combinat/words/morphic.py +351 -0
  324. sage/combinat/words/morphism.py +3878 -0
  325. sage/combinat/words/paths.py +2932 -0
  326. sage/combinat/words/shuffle_product.py +278 -0
  327. sage/combinat/words/suffix_trees.py +1873 -0
  328. sage/combinat/words/word.py +769 -0
  329. sage/combinat/words/word_char.cpython-314-x86_64-linux-musl.so +0 -0
  330. sage/combinat/words/word_char.pyx +847 -0
  331. sage/combinat/words/word_datatypes.cpython-314-x86_64-linux-musl.so +0 -0
  332. sage/combinat/words/word_datatypes.pxd +4 -0
  333. sage/combinat/words/word_datatypes.pyx +1067 -0
  334. sage/combinat/words/word_generators.py +2026 -0
  335. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  336. sage/combinat/words/word_options.py +99 -0
  337. sage/combinat/words/words.py +2396 -0
  338. sage/data_structures/all__sagemath_combinat.py +1 -0
  339. sage/databases/all__sagemath_combinat.py +13 -0
  340. sage/databases/findstat.py +4897 -0
  341. sage/databases/oeis.py +2058 -0
  342. sage/databases/sloane.py +393 -0
  343. sage/dynamics/all__sagemath_combinat.py +14 -0
  344. sage/dynamics/cellular_automata/all.py +7 -0
  345. sage/dynamics/cellular_automata/catalog.py +34 -0
  346. sage/dynamics/cellular_automata/elementary.py +612 -0
  347. sage/dynamics/cellular_automata/glca.py +477 -0
  348. sage/dynamics/cellular_automata/solitons.py +1463 -0
  349. sage/dynamics/finite_dynamical_system.py +1249 -0
  350. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  351. sage/games/all.py +7 -0
  352. sage/games/hexad.py +704 -0
  353. sage/games/quantumino.py +591 -0
  354. sage/games/sudoku.py +889 -0
  355. sage/games/sudoku_backtrack.cpython-314-x86_64-linux-musl.so +0 -0
  356. sage/games/sudoku_backtrack.pyx +189 -0
  357. sage/groups/all__sagemath_combinat.py +1 -0
  358. sage/groups/indexed_free_group.py +489 -0
  359. sage/libs/all__sagemath_combinat.py +6 -0
  360. sage/libs/lrcalc/__init__.py +1 -0
  361. sage/libs/lrcalc/lrcalc.py +525 -0
  362. sage/libs/symmetrica/__init__.py +7 -0
  363. sage/libs/symmetrica/all.py +101 -0
  364. sage/libs/symmetrica/kostka.pxi +168 -0
  365. sage/libs/symmetrica/part.pxi +193 -0
  366. sage/libs/symmetrica/plet.pxi +42 -0
  367. sage/libs/symmetrica/sab.pxi +196 -0
  368. sage/libs/symmetrica/sb.pxi +332 -0
  369. sage/libs/symmetrica/sc.pxi +192 -0
  370. sage/libs/symmetrica/schur.pxi +956 -0
  371. sage/libs/symmetrica/symmetrica.cpython-314-x86_64-linux-musl.so +0 -0
  372. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  373. sage/libs/symmetrica/symmetrica.pyx +39 -0
  374. sage/monoids/all.py +13 -0
  375. sage/monoids/automatic_semigroup.py +1054 -0
  376. sage/monoids/free_abelian_monoid.py +315 -0
  377. sage/monoids/free_abelian_monoid_element.cpython-314-x86_64-linux-musl.so +0 -0
  378. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  379. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  380. sage/monoids/free_monoid.py +335 -0
  381. sage/monoids/free_monoid_element.py +431 -0
  382. sage/monoids/hecke_monoid.py +65 -0
  383. sage/monoids/string_monoid.py +817 -0
  384. sage/monoids/string_monoid_element.py +547 -0
  385. sage/monoids/string_ops.py +143 -0
  386. sage/monoids/trace_monoid.py +972 -0
  387. sage/rings/all__sagemath_combinat.py +2 -0
  388. sage/sat/all.py +4 -0
  389. sage/sat/boolean_polynomials.py +405 -0
  390. sage/sat/converters/__init__.py +6 -0
  391. sage/sat/converters/anf2cnf.py +14 -0
  392. sage/sat/converters/polybori.py +611 -0
  393. sage/sat/solvers/__init__.py +5 -0
  394. sage/sat/solvers/cryptominisat.py +287 -0
  395. sage/sat/solvers/dimacs.py +783 -0
  396. sage/sat/solvers/picosat.py +228 -0
  397. sage/sat/solvers/sat_lp.py +156 -0
  398. sage/sat/solvers/satsolver.cpython-314-x86_64-linux-musl.so +0 -0
  399. sage/sat/solvers/satsolver.pxd +3 -0
  400. 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