passagemath-combinat 10.6.42__cp314-cp314t-win_amd64.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 (401) hide show
  1. passagemath_combinat/__init__.py +3 -0
  2. passagemath_combinat-10.6.42.dist-info/DELVEWHEEL +2 -0
  3. passagemath_combinat-10.6.42.dist-info/METADATA +160 -0
  4. passagemath_combinat-10.6.42.dist-info/RECORD +401 -0
  5. passagemath_combinat-10.6.42.dist-info/WHEEL +5 -0
  6. passagemath_combinat-10.6.42.dist-info/top_level.txt +3 -0
  7. passagemath_combinat.libs/libgmp-10-3a5f019e2510aeaad918cab2b57a689d.dll +0 -0
  8. passagemath_combinat.libs/libsymmetrica-3-7dcf900932804d0df5fd0919b4668720.dll +0 -0
  9. sage/algebras/affine_nil_temperley_lieb.py +263 -0
  10. sage/algebras/all.py +24 -0
  11. sage/algebras/all__sagemath_combinat.py +35 -0
  12. sage/algebras/askey_wilson.py +935 -0
  13. sage/algebras/associated_graded.py +345 -0
  14. sage/algebras/cellular_basis.py +350 -0
  15. sage/algebras/cluster_algebra.py +2766 -0
  16. sage/algebras/down_up_algebra.py +860 -0
  17. sage/algebras/free_algebra.py +1698 -0
  18. sage/algebras/free_algebra_element.py +345 -0
  19. sage/algebras/free_algebra_quotient.py +405 -0
  20. sage/algebras/free_algebra_quotient_element.py +295 -0
  21. sage/algebras/free_zinbiel_algebra.py +885 -0
  22. sage/algebras/hall_algebra.py +783 -0
  23. sage/algebras/hecke_algebras/all.py +4 -0
  24. sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
  25. sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
  26. sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
  27. sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
  28. sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
  29. sage/algebras/iwahori_hecke_algebra.py +3095 -0
  30. sage/algebras/jordan_algebra.py +1773 -0
  31. sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
  32. sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
  33. sage/algebras/lie_conformal_algebras/all.py +18 -0
  34. sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
  35. sage/algebras/lie_conformal_algebras/examples.py +43 -0
  36. sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
  37. sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
  38. sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
  39. sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
  40. sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
  41. sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
  42. sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
  43. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
  44. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
  45. sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
  46. sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
  47. sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
  48. sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
  49. sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
  50. sage/algebras/nil_coxeter_algebra.py +191 -0
  51. sage/algebras/q_commuting_polynomials.py +673 -0
  52. sage/algebras/q_system.py +608 -0
  53. sage/algebras/quantum_clifford.py +959 -0
  54. sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
  55. sage/algebras/quantum_groups/all.py +9 -0
  56. sage/algebras/quantum_groups/fock_space.py +2219 -0
  57. sage/algebras/quantum_groups/q_numbers.py +207 -0
  58. sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
  59. sage/algebras/quantum_groups/representations.py +591 -0
  60. sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
  61. sage/algebras/quantum_oscillator.py +623 -0
  62. sage/algebras/quaternion_algebra.py +20 -0
  63. sage/algebras/quaternion_algebra_element.py +55 -0
  64. sage/algebras/rational_cherednik_algebra.py +525 -0
  65. sage/algebras/schur_algebra.py +670 -0
  66. sage/algebras/shuffle_algebra.py +1011 -0
  67. sage/algebras/splitting_algebra.py +779 -0
  68. sage/algebras/tensor_algebra.py +709 -0
  69. sage/algebras/yangian.py +1082 -0
  70. sage/algebras/yokonuma_hecke_algebra.py +1018 -0
  71. sage/all__sagemath_combinat.py +44 -0
  72. sage/combinat/SJT.py +255 -0
  73. sage/combinat/affine_permutation.py +2405 -0
  74. sage/combinat/algebraic_combinatorics.py +55 -0
  75. sage/combinat/all.py +53 -0
  76. sage/combinat/all__sagemath_combinat.py +195 -0
  77. sage/combinat/alternating_sign_matrix.py +2063 -0
  78. sage/combinat/baxter_permutations.py +346 -0
  79. sage/combinat/bijectionist.py +3220 -0
  80. sage/combinat/binary_recurrence_sequences.py +1180 -0
  81. sage/combinat/blob_algebra.py +685 -0
  82. sage/combinat/catalog_partitions.py +27 -0
  83. sage/combinat/chas/all.py +23 -0
  84. sage/combinat/chas/fsym.py +1180 -0
  85. sage/combinat/chas/wqsym.py +2601 -0
  86. sage/combinat/cluster_complex.py +326 -0
  87. sage/combinat/colored_permutations.py +2039 -0
  88. sage/combinat/colored_permutations_representations.py +964 -0
  89. sage/combinat/composition_signed.py +142 -0
  90. sage/combinat/composition_tableau.py +855 -0
  91. sage/combinat/constellation.py +1729 -0
  92. sage/combinat/core.py +751 -0
  93. sage/combinat/counting.py +12 -0
  94. sage/combinat/crystals/affine.py +742 -0
  95. sage/combinat/crystals/affine_factorization.py +518 -0
  96. sage/combinat/crystals/affinization.py +331 -0
  97. sage/combinat/crystals/alcove_path.py +2013 -0
  98. sage/combinat/crystals/all.py +22 -0
  99. sage/combinat/crystals/bkk_crystals.py +141 -0
  100. sage/combinat/crystals/catalog.py +115 -0
  101. sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
  102. sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
  103. sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
  104. sage/combinat/crystals/crystals.py +257 -0
  105. sage/combinat/crystals/direct_sum.py +260 -0
  106. sage/combinat/crystals/elementary_crystals.py +1251 -0
  107. sage/combinat/crystals/fast_crystals.py +441 -0
  108. sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
  109. sage/combinat/crystals/generalized_young_walls.py +1076 -0
  110. sage/combinat/crystals/highest_weight_crystals.py +436 -0
  111. sage/combinat/crystals/induced_structure.py +695 -0
  112. sage/combinat/crystals/infinity_crystals.py +730 -0
  113. sage/combinat/crystals/kac_modules.py +863 -0
  114. sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
  115. sage/combinat/crystals/kyoto_path_model.py +497 -0
  116. sage/combinat/crystals/letters.cp314t-win_amd64.pyd +0 -0
  117. sage/combinat/crystals/letters.pxd +79 -0
  118. sage/combinat/crystals/letters.pyx +3056 -0
  119. sage/combinat/crystals/littelmann_path.py +1518 -0
  120. sage/combinat/crystals/monomial_crystals.py +1262 -0
  121. sage/combinat/crystals/multisegments.py +462 -0
  122. sage/combinat/crystals/mv_polytopes.py +467 -0
  123. sage/combinat/crystals/pbw_crystal.py +511 -0
  124. sage/combinat/crystals/pbw_datum.cp314t-win_amd64.pyd +0 -0
  125. sage/combinat/crystals/pbw_datum.pxd +4 -0
  126. sage/combinat/crystals/pbw_datum.pyx +487 -0
  127. sage/combinat/crystals/polyhedral_realization.py +372 -0
  128. sage/combinat/crystals/spins.cp314t-win_amd64.pyd +0 -0
  129. sage/combinat/crystals/spins.pxd +21 -0
  130. sage/combinat/crystals/spins.pyx +756 -0
  131. sage/combinat/crystals/star_crystal.py +290 -0
  132. sage/combinat/crystals/subcrystal.py +464 -0
  133. sage/combinat/crystals/tensor_product.py +1177 -0
  134. sage/combinat/crystals/tensor_product_element.cp314t-win_amd64.pyd +0 -0
  135. sage/combinat/crystals/tensor_product_element.pxd +35 -0
  136. sage/combinat/crystals/tensor_product_element.pyx +1870 -0
  137. sage/combinat/crystals/virtual_crystal.py +420 -0
  138. sage/combinat/cyclic_sieving_phenomenon.py +204 -0
  139. sage/combinat/debruijn_sequence.cp314t-win_amd64.pyd +0 -0
  140. sage/combinat/debruijn_sequence.pyx +355 -0
  141. sage/combinat/decorated_permutation.py +270 -0
  142. sage/combinat/degree_sequences.cp314t-win_amd64.pyd +0 -0
  143. sage/combinat/degree_sequences.pyx +588 -0
  144. sage/combinat/derangements.py +527 -0
  145. sage/combinat/descent_algebra.py +1008 -0
  146. sage/combinat/diagram.py +1551 -0
  147. sage/combinat/diagram_algebras.py +5886 -0
  148. sage/combinat/dyck_word.py +4349 -0
  149. sage/combinat/e_one_star.py +1623 -0
  150. sage/combinat/enumerated_sets.py +123 -0
  151. sage/combinat/expnums.cp314t-win_amd64.pyd +0 -0
  152. sage/combinat/expnums.pyx +148 -0
  153. sage/combinat/fast_vector_partitions.cp314t-win_amd64.pyd +0 -0
  154. sage/combinat/fast_vector_partitions.pyx +346 -0
  155. sage/combinat/fqsym.py +1977 -0
  156. sage/combinat/free_dendriform_algebra.py +954 -0
  157. sage/combinat/free_prelie_algebra.py +1141 -0
  158. sage/combinat/fully_commutative_elements.py +1077 -0
  159. sage/combinat/fully_packed_loop.py +1523 -0
  160. sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
  161. sage/combinat/gray_codes.py +311 -0
  162. sage/combinat/grossman_larson_algebras.py +667 -0
  163. sage/combinat/growth.py +4352 -0
  164. sage/combinat/hall_polynomial.py +188 -0
  165. sage/combinat/hillman_grassl.py +866 -0
  166. sage/combinat/integer_matrices.py +329 -0
  167. sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
  168. sage/combinat/k_tableau.py +4564 -0
  169. sage/combinat/kazhdan_lusztig.py +215 -0
  170. sage/combinat/key_polynomial.py +885 -0
  171. sage/combinat/knutson_tao_puzzles.py +2286 -0
  172. sage/combinat/lr_tableau.py +311 -0
  173. sage/combinat/matrices/all.py +24 -0
  174. sage/combinat/matrices/hadamard_matrix.py +3790 -0
  175. sage/combinat/matrices/latin.py +2912 -0
  176. sage/combinat/misc.py +401 -0
  177. sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
  178. sage/combinat/ncsf_qsym/all.py +21 -0
  179. sage/combinat/ncsf_qsym/combinatorics.py +317 -0
  180. sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
  181. sage/combinat/ncsf_qsym/ncsf.py +5637 -0
  182. sage/combinat/ncsf_qsym/qsym.py +4053 -0
  183. sage/combinat/ncsf_qsym/tutorial.py +447 -0
  184. sage/combinat/ncsym/all.py +21 -0
  185. sage/combinat/ncsym/bases.py +855 -0
  186. sage/combinat/ncsym/dual.py +593 -0
  187. sage/combinat/ncsym/ncsym.py +2076 -0
  188. sage/combinat/necklace.py +551 -0
  189. sage/combinat/non_decreasing_parking_function.py +634 -0
  190. sage/combinat/nu_dyck_word.py +1474 -0
  191. sage/combinat/output.py +861 -0
  192. sage/combinat/parallelogram_polyomino.py +4326 -0
  193. sage/combinat/parking_functions.py +1602 -0
  194. sage/combinat/partition_algebra.py +1998 -0
  195. sage/combinat/partition_kleshchev.py +1982 -0
  196. sage/combinat/partition_shifting_algebras.py +584 -0
  197. sage/combinat/partition_tuple.py +3114 -0
  198. sage/combinat/path_tableaux/all.py +13 -0
  199. sage/combinat/path_tableaux/catalog.py +29 -0
  200. sage/combinat/path_tableaux/dyck_path.py +380 -0
  201. sage/combinat/path_tableaux/frieze.py +476 -0
  202. sage/combinat/path_tableaux/path_tableau.py +728 -0
  203. sage/combinat/path_tableaux/semistandard.py +510 -0
  204. sage/combinat/perfect_matching.py +779 -0
  205. sage/combinat/plane_partition.py +3300 -0
  206. sage/combinat/q_bernoulli.cp314t-win_amd64.pyd +0 -0
  207. sage/combinat/q_bernoulli.pyx +128 -0
  208. sage/combinat/quickref.py +81 -0
  209. sage/combinat/recognizable_series.py +2051 -0
  210. sage/combinat/regular_sequence.py +4316 -0
  211. sage/combinat/regular_sequence_bounded.py +543 -0
  212. sage/combinat/restricted_growth.py +81 -0
  213. sage/combinat/ribbon.py +20 -0
  214. sage/combinat/ribbon_shaped_tableau.py +489 -0
  215. sage/combinat/ribbon_tableau.py +1180 -0
  216. sage/combinat/rigged_configurations/all.py +46 -0
  217. sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
  218. sage/combinat/rigged_configurations/bij_infinity.py +370 -0
  219. sage/combinat/rigged_configurations/bij_type_A.py +163 -0
  220. sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
  221. sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
  222. sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
  223. sage/combinat/rigged_configurations/bij_type_B.py +900 -0
  224. sage/combinat/rigged_configurations/bij_type_C.py +267 -0
  225. sage/combinat/rigged_configurations/bij_type_D.py +771 -0
  226. sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
  227. sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
  228. sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
  229. sage/combinat/rigged_configurations/bijection.py +143 -0
  230. sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
  231. sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
  232. sage/combinat/rigged_configurations/rc_crystal.py +461 -0
  233. sage/combinat/rigged_configurations/rc_infinity.py +540 -0
  234. sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
  235. sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
  236. sage/combinat/rigged_configurations/rigged_partition.cp314t-win_amd64.pyd +0 -0
  237. sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
  238. sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
  239. sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
  240. sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
  241. sage/combinat/rsk.py +3438 -0
  242. sage/combinat/schubert_polynomial.py +508 -0
  243. sage/combinat/set_partition.py +3318 -0
  244. sage/combinat/set_partition_iterator.cp314t-win_amd64.pyd +0 -0
  245. sage/combinat/set_partition_iterator.pyx +136 -0
  246. sage/combinat/set_partition_ordered.py +1590 -0
  247. sage/combinat/sf/abreu_nigro.py +346 -0
  248. sage/combinat/sf/all.py +52 -0
  249. sage/combinat/sf/character.py +576 -0
  250. sage/combinat/sf/classical.py +319 -0
  251. sage/combinat/sf/dual.py +996 -0
  252. sage/combinat/sf/elementary.py +549 -0
  253. sage/combinat/sf/hall_littlewood.py +1028 -0
  254. sage/combinat/sf/hecke.py +336 -0
  255. sage/combinat/sf/homogeneous.py +464 -0
  256. sage/combinat/sf/jack.py +1428 -0
  257. sage/combinat/sf/k_dual.py +1458 -0
  258. sage/combinat/sf/kfpoly.py +447 -0
  259. sage/combinat/sf/llt.py +789 -0
  260. sage/combinat/sf/macdonald.py +2019 -0
  261. sage/combinat/sf/monomial.py +525 -0
  262. sage/combinat/sf/multiplicative.py +113 -0
  263. sage/combinat/sf/new_kschur.py +1786 -0
  264. sage/combinat/sf/ns_macdonald.py +964 -0
  265. sage/combinat/sf/orthogonal.py +246 -0
  266. sage/combinat/sf/orthotriang.py +355 -0
  267. sage/combinat/sf/powersum.py +963 -0
  268. sage/combinat/sf/schur.py +880 -0
  269. sage/combinat/sf/sf.py +1653 -0
  270. sage/combinat/sf/sfa.py +7053 -0
  271. sage/combinat/sf/symplectic.py +253 -0
  272. sage/combinat/sf/witt.py +721 -0
  273. sage/combinat/shifted_primed_tableau.py +2735 -0
  274. sage/combinat/shuffle.py +830 -0
  275. sage/combinat/sidon_sets.py +146 -0
  276. sage/combinat/similarity_class_type.py +1721 -0
  277. sage/combinat/sine_gordon.py +618 -0
  278. sage/combinat/six_vertex_model.py +784 -0
  279. sage/combinat/skew_partition.py +2053 -0
  280. sage/combinat/skew_tableau.py +2989 -0
  281. sage/combinat/sloane_functions.py +8935 -0
  282. sage/combinat/specht_module.py +1403 -0
  283. sage/combinat/species/all.py +48 -0
  284. sage/combinat/species/characteristic_species.py +321 -0
  285. sage/combinat/species/composition_species.py +273 -0
  286. sage/combinat/species/cycle_species.py +284 -0
  287. sage/combinat/species/empty_species.py +155 -0
  288. sage/combinat/species/functorial_composition_species.py +148 -0
  289. sage/combinat/species/generating_series.py +673 -0
  290. sage/combinat/species/library.py +148 -0
  291. sage/combinat/species/linear_order_species.py +169 -0
  292. sage/combinat/species/misc.py +83 -0
  293. sage/combinat/species/partition_species.py +290 -0
  294. sage/combinat/species/permutation_species.py +268 -0
  295. sage/combinat/species/product_species.py +423 -0
  296. sage/combinat/species/recursive_species.py +476 -0
  297. sage/combinat/species/set_species.py +192 -0
  298. sage/combinat/species/species.py +820 -0
  299. sage/combinat/species/structure.py +539 -0
  300. sage/combinat/species/subset_species.py +243 -0
  301. sage/combinat/species/sum_species.py +225 -0
  302. sage/combinat/subword.py +564 -0
  303. sage/combinat/subword_complex.py +2122 -0
  304. sage/combinat/subword_complex_c.cp314t-win_amd64.pyd +0 -0
  305. sage/combinat/subword_complex_c.pyx +119 -0
  306. sage/combinat/super_tableau.py +821 -0
  307. sage/combinat/superpartition.py +1154 -0
  308. sage/combinat/symmetric_group_algebra.py +3774 -0
  309. sage/combinat/symmetric_group_representations.py +1830 -0
  310. sage/combinat/t_sequences.py +877 -0
  311. sage/combinat/tableau.py +9506 -0
  312. sage/combinat/tableau_residues.py +860 -0
  313. sage/combinat/tableau_tuple.py +5353 -0
  314. sage/combinat/tiling.py +2432 -0
  315. sage/combinat/triangles_FHM.py +777 -0
  316. sage/combinat/tutorial.py +1857 -0
  317. sage/combinat/vector_partition.py +337 -0
  318. sage/combinat/words/abstract_word.py +1722 -0
  319. sage/combinat/words/all.py +59 -0
  320. sage/combinat/words/alphabet.py +268 -0
  321. sage/combinat/words/finite_word.py +7201 -0
  322. sage/combinat/words/infinite_word.py +113 -0
  323. sage/combinat/words/lyndon_word.py +652 -0
  324. sage/combinat/words/morphic.py +351 -0
  325. sage/combinat/words/morphism.py +3878 -0
  326. sage/combinat/words/paths.py +2932 -0
  327. sage/combinat/words/shuffle_product.py +278 -0
  328. sage/combinat/words/suffix_trees.py +1873 -0
  329. sage/combinat/words/word.py +769 -0
  330. sage/combinat/words/word_char.cp314t-win_amd64.pyd +0 -0
  331. sage/combinat/words/word_char.pyx +847 -0
  332. sage/combinat/words/word_datatypes.cp314t-win_amd64.pyd +0 -0
  333. sage/combinat/words/word_datatypes.pxd +4 -0
  334. sage/combinat/words/word_datatypes.pyx +1067 -0
  335. sage/combinat/words/word_generators.py +2026 -0
  336. sage/combinat/words/word_infinite_datatypes.py +1218 -0
  337. sage/combinat/words/word_options.py +99 -0
  338. sage/combinat/words/words.py +2396 -0
  339. sage/data_structures/all__sagemath_combinat.py +1 -0
  340. sage/databases/all__sagemath_combinat.py +13 -0
  341. sage/databases/findstat.py +4897 -0
  342. sage/databases/oeis.py +2058 -0
  343. sage/databases/sloane.py +393 -0
  344. sage/dynamics/all__sagemath_combinat.py +14 -0
  345. sage/dynamics/cellular_automata/all.py +7 -0
  346. sage/dynamics/cellular_automata/catalog.py +34 -0
  347. sage/dynamics/cellular_automata/elementary.py +612 -0
  348. sage/dynamics/cellular_automata/glca.py +477 -0
  349. sage/dynamics/cellular_automata/solitons.py +1463 -0
  350. sage/dynamics/finite_dynamical_system.py +1249 -0
  351. sage/dynamics/finite_dynamical_system_catalog.py +382 -0
  352. sage/games/all.py +7 -0
  353. sage/games/hexad.py +704 -0
  354. sage/games/quantumino.py +591 -0
  355. sage/games/sudoku.py +889 -0
  356. sage/games/sudoku_backtrack.cp314t-win_amd64.pyd +0 -0
  357. sage/games/sudoku_backtrack.pyx +189 -0
  358. sage/groups/all__sagemath_combinat.py +1 -0
  359. sage/groups/indexed_free_group.py +489 -0
  360. sage/libs/all__sagemath_combinat.py +6 -0
  361. sage/libs/lrcalc/__init__.py +1 -0
  362. sage/libs/lrcalc/lrcalc.py +525 -0
  363. sage/libs/symmetrica/__init__.py +7 -0
  364. sage/libs/symmetrica/all.py +101 -0
  365. sage/libs/symmetrica/kostka.pxi +168 -0
  366. sage/libs/symmetrica/part.pxi +193 -0
  367. sage/libs/symmetrica/plet.pxi +42 -0
  368. sage/libs/symmetrica/sab.pxi +196 -0
  369. sage/libs/symmetrica/sb.pxi +332 -0
  370. sage/libs/symmetrica/sc.pxi +192 -0
  371. sage/libs/symmetrica/schur.pxi +956 -0
  372. sage/libs/symmetrica/symmetrica.cp314t-win_amd64.pyd +0 -0
  373. sage/libs/symmetrica/symmetrica.pxi +1172 -0
  374. sage/libs/symmetrica/symmetrica.pyx +39 -0
  375. sage/monoids/all.py +13 -0
  376. sage/monoids/automatic_semigroup.py +1054 -0
  377. sage/monoids/free_abelian_monoid.py +315 -0
  378. sage/monoids/free_abelian_monoid_element.cp314t-win_amd64.pyd +0 -0
  379. sage/monoids/free_abelian_monoid_element.pxd +16 -0
  380. sage/monoids/free_abelian_monoid_element.pyx +397 -0
  381. sage/monoids/free_monoid.py +335 -0
  382. sage/monoids/free_monoid_element.py +431 -0
  383. sage/monoids/hecke_monoid.py +65 -0
  384. sage/monoids/string_monoid.py +817 -0
  385. sage/monoids/string_monoid_element.py +547 -0
  386. sage/monoids/string_ops.py +143 -0
  387. sage/monoids/trace_monoid.py +972 -0
  388. sage/rings/all__sagemath_combinat.py +2 -0
  389. sage/sat/all.py +4 -0
  390. sage/sat/boolean_polynomials.py +405 -0
  391. sage/sat/converters/__init__.py +6 -0
  392. sage/sat/converters/anf2cnf.py +14 -0
  393. sage/sat/converters/polybori.py +611 -0
  394. sage/sat/solvers/__init__.py +5 -0
  395. sage/sat/solvers/cryptominisat.py +287 -0
  396. sage/sat/solvers/dimacs.py +783 -0
  397. sage/sat/solvers/picosat.py +228 -0
  398. sage/sat/solvers/sat_lp.py +156 -0
  399. sage/sat/solvers/satsolver.cp314t-win_amd64.pyd +0 -0
  400. sage/sat/solvers/satsolver.pxd +3 -0
  401. sage/sat/solvers/satsolver.pyx +405 -0
@@ -0,0 +1,1018 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.groups sage.modules
3
+ """
4
+ Yokonuma-Hecke Algebras
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2015-11): initial version
9
+ - Travis Scrimshaw (2025-03): general type version
10
+ """
11
+
12
+ # ****************************************************************************
13
+ # Copyright (C) 2015-2025 Travis Scrimshaw <tcscrims at gmail.com>
14
+ #
15
+ # This program is free software: you can redistribute it and/or modify
16
+ # it under the terms of the GNU General Public License as published by
17
+ # the Free Software Foundation, either version 2 of the License, or
18
+ # (at your option) any later version.
19
+ # https://www.gnu.org/licenses/
20
+ # ****************************************************************************
21
+
22
+ from sage.misc.cachefunc import cached_method
23
+ from sage.rings.integer_ring import ZZ
24
+ from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
25
+ from sage.rings.rational_field import QQ
26
+ from sage.categories.algebras import Algebras
27
+ from sage.categories.rings import Rings
28
+ from sage.combinat.free_module import CombinatorialFreeModule
29
+ from sage.combinat.permutation import Permutations
30
+ from sage.sets.family import Family
31
+
32
+
33
+ class YokonumaHeckeAlgebra(CombinatorialFreeModule):
34
+ r"""
35
+ Abstract base class for Yokonuma-Hecke algebras that
36
+ implements common features.
37
+
38
+ .. TODO::
39
+
40
+ Factor out the near-common features.
41
+ """
42
+ @staticmethod
43
+ def __classcall_private__(cls, d, n, q=None, R=None):
44
+ r"""
45
+ Standardize input to ensure a unique representation and dispatch
46
+ to the correct implementation.
47
+
48
+ TESTS::
49
+
50
+ sage: Y1 = algebras.YokonumaHecke(5, 3)
51
+ sage: q = LaurentPolynomialRing(QQ, 'q').gen()
52
+ sage: Y2 = algebras.YokonumaHecke(5, 3, q)
53
+ sage: Y3 = algebras.YokonumaHecke(5, 3, q, q.parent())
54
+ sage: Y1 is Y2 and Y2 is Y3
55
+ True
56
+ """
57
+ if q is None:
58
+ q = LaurentPolynomialRing(QQ, 'q').gen()
59
+ if R is None:
60
+ R = q.parent()
61
+ q = R(q)
62
+ if R not in Rings().Commutative():
63
+ raise TypeError("base ring must be a commutative ring")
64
+ if n not in ZZ:
65
+ from sage.combinat.root_system.cartan_type import CartanType
66
+ n = CartanType(n)
67
+ return YokonumaHeckeAlgebraWeyl(d, n, q, R)
68
+ return YokonumaHeckeAlgebraGL(d, n, q, R)
69
+
70
+ def __init__(self, d, W, q, R, indices, category=None):
71
+ """
72
+ Initialize ``self``.
73
+
74
+ EXAMPLES::
75
+
76
+ sage: Y = algebras.YokonumaHecke(5, 3)
77
+ sage: elts = Y.some_elements() + list(Y.algebra_generators())
78
+ sage: TestSuite(Y).run(elements=elts)
79
+ """
80
+ self._d = d
81
+ self._W = W
82
+ self._cartan_type = W.cartan_type()
83
+ self._q = q
84
+ cat = Algebras(R).WithBasis().or_subcategory(category)
85
+ CombinatorialFreeModule.__init__(self, R, indices, prefix='Y',
86
+ category=cat)
87
+ self._assign_names(self.algebra_generators().keys())
88
+
89
+ def cartan_type(self):
90
+ r"""
91
+ Return the Cartan type of ``self``.
92
+
93
+ EXAMPLES::
94
+
95
+ sage: Y = algebras.YokonumaHecke(4, ['F',4])
96
+ sage: Y.cartan_type()
97
+ ['F', 4]
98
+ """
99
+ return self._cartan_type
100
+
101
+ def index_set(self):
102
+ r"""
103
+ Return the index set of ``self``, which is the index set of
104
+ the Cartan type of ``self``.
105
+
106
+ EXAMPLES::
107
+
108
+ sage: Y = algebras.YokonumaHecke(4, ['F',4])
109
+ sage: Y.index_set() == Y.cartan_type().index_set()
110
+ True
111
+ """
112
+ return self._cartan_type.index_set()
113
+
114
+ def q(self):
115
+ r"""
116
+ Return the parameter `q` of ``self``.
117
+
118
+ EXAMPLES::
119
+
120
+ sage: Y = algebras.YokonumaHecke(4, ['F',4])
121
+ sage: Y.q()
122
+ q
123
+ sage: Y.q().parent() is Y.base_ring()
124
+ True
125
+ """
126
+ return self._q
127
+
128
+ def g(self, i=None):
129
+ """
130
+ Return the generator(s) `g_i`.
131
+
132
+ INPUT:
133
+
134
+ - ``i`` -- (default: ``None``) the generator `g_i` or if ``None``,
135
+ then the family of all generators `g_i`
136
+
137
+ EXAMPLES::
138
+
139
+ sage: Y = algebras.YokonumaHecke(8, 3)
140
+ sage: Y.g(1)
141
+ g[1]
142
+ sage: list(Y.g())
143
+ [g[1], g[2]]
144
+
145
+ sage: Y = algebras.YokonumaHecke(8, ['G',2])
146
+ sage: Y.g(1)
147
+ g[1]
148
+ sage: Y.g()
149
+ Finite family {1: g[1], 2: g[2]}
150
+ """
151
+ G = self.algebra_generators()
152
+ if i is None:
153
+ I = self._W.index_set()
154
+ d = {i: G['g%s' % i] for i in I}
155
+ return Family(I, d.__getitem__)
156
+ return G['g%s' % i]
157
+
158
+ @cached_method
159
+ def gens(self) -> tuple:
160
+ """
161
+ Return the generators of ``self``.
162
+
163
+ EXAMPLES::
164
+
165
+ sage: Y = algebras.YokonumaHecke(5, 3)
166
+ sage: Y.gens()
167
+ (g[1], g[2], t1, t2, t3)
168
+
169
+ sage: Y = algebras.YokonumaHecke(5, ['B',2])
170
+ sage: Y.gens()
171
+ (g[1], g[2], h1, h2)
172
+ """
173
+ return tuple(self.algebra_generators())
174
+
175
+
176
+ class YokonumaHeckeAlgebraGL(YokonumaHeckeAlgebra):
177
+ r"""
178
+ The Yokonuma-Hecke algebra `Y_{d,n}(q)` for `GL_n(\GF{d})`.
179
+
180
+ Let `R` be a commutative ring and `q` be a unit in `R`. The
181
+ *Yokonuma-Hecke algebra* `Y_{d,n}(q)` is the associative, unital
182
+ `R`-algebra generated by `t_1, t_2, \ldots, t_n, g_1, g_2, \ldots,
183
+ g_{n-1}` and subject to the relations:
184
+
185
+ - `g_i g_j = g_j g_i` for all `|i - j| > 1`,
186
+ - `g_i g_{i+1} g_i = g_{i+1} g_i g_{i+1}`,
187
+ - `t_i t_j = t_j t_i`,
188
+ - `t_j g_i = g_i t_{j s_i}`, and
189
+ - `t_j^d = 1`,
190
+
191
+ where `s_i` is the simple transposition `(i, i+1)`, along with
192
+ the quadratic relation
193
+
194
+ .. MATH::
195
+
196
+ g_i^2 = 1 + \frac{(q - q^{-1})}{d} \left( \sum_{s=0}^{d-1}
197
+ t_i^s t_{i+1}^{-s} \right) g_i.
198
+
199
+ Thus the Yokonuma-Hecke algebra can be considered a quotient of
200
+ the framed braid group `(\ZZ / d\ZZ) \wr B_n`, where `B_n` is the
201
+ classical braid group on `n` strands, by the quadratic relations.
202
+ Moreover, all of the algebra generators are invertible. In
203
+ particular, we have
204
+
205
+ .. MATH::
206
+
207
+ g_i^{-1} = g_i - (q - q^{-1}) e_i.
208
+
209
+ When we specialize `q = \pm 1`, we obtain the group algebra of
210
+ the complex reflection group `G(d, 1, n) = (\ZZ / d\ZZ) \wr S_n`.
211
+ Moreover for `d = 1`, the Yokonuma-Hecke algebra is equal to the
212
+ :class:`Iwahori-Hecke <IwahoriHeckeAlgebra>` of type `A_{n-1}`.
213
+
214
+ This was considered for more general Chevalley groups (Lie groups
215
+ over finite fields); see :class:`YokonumaHeckeAlgebraWeyl`.
216
+
217
+ INPUT:
218
+
219
+ - ``d`` -- the maximum power of `t`
220
+ - ``n`` -- the number of generators or a Cartan type
221
+ - ``q`` -- (optional) an invertible element in a commutative ring;
222
+ the default is `q \in \QQ[q,q^{-1}]`
223
+ - ``R`` -- (optional) a commutative ring containing ``q``; the
224
+ default is the parent of `q`
225
+
226
+ EXAMPLES:
227
+
228
+ We construct `Y_{4,3}` and do some computations::
229
+
230
+ sage: Y = algebras.YokonumaHecke(4, 3)
231
+ sage: g1, g2, t1, t2, t3 = Y.algebra_generators()
232
+ sage: g1 * g2
233
+ g[1,2]
234
+ sage: t1 * g1
235
+ t1*g[1]
236
+ sage: g2 * t2
237
+ t3*g[2]
238
+ sage: g2 * t3
239
+ t2*g[2]
240
+ sage: (g2 + t1) * (g1 + t2*t3)
241
+ g[2,1] + t2*t3*g[2] + t1*g[1] + t1*t2*t3
242
+ sage: g1 * g1
243
+ 1 - (1/4*q^-1-1/4*q)*g[1] - (1/4*q^-1-1/4*q)*t1*t2^3*g[1]
244
+ - (1/4*q^-1-1/4*q)*t1^2*t2^2*g[1] - (1/4*q^-1-1/4*q)*t1^3*t2*g[1]
245
+ sage: g2 * g1 * t1
246
+ t3*g[2,1]
247
+
248
+ We construct the elements `e_i` and show that they are idempotents::
249
+
250
+ sage: e1 = Y.e(1); e1
251
+ 1/4 + 1/4*t1*t2^3 + 1/4*t1^2*t2^2 + 1/4*t1^3*t2
252
+ sage: e1 * e1 == e1
253
+ True
254
+ sage: e2 = Y.e(2); e2
255
+ 1/4 + 1/4*t2*t3^3 + 1/4*t2^2*t3^2 + 1/4*t2^3*t3
256
+ sage: e2 * e2 == e2
257
+ True
258
+
259
+ REFERENCES:
260
+
261
+ - [CL2013]_
262
+ - [CPdA2014]_
263
+ - [ERH2015]_
264
+ - [JPdA15]_
265
+ """
266
+ def __init__(self, d, n, q, R):
267
+ """
268
+ Initialize ``self``.
269
+
270
+ EXAMPLES::
271
+
272
+ sage: Y = algebras.YokonumaHecke(5, 3)
273
+ sage: elts = Y.some_elements() + list(Y.algebra_generators())
274
+ sage: TestSuite(Y).run(elements=elts)
275
+ """
276
+ self._n = n
277
+ W = Permutations(n)
278
+ import itertools
279
+ C = itertools.product(*([range(d)]*n))
280
+ indices = list(itertools.product(C, W))
281
+ YokonumaHeckeAlgebra.__init__(self, d, W, q, R, indices)
282
+
283
+ def _repr_(self):
284
+ """
285
+ Return a string representation of ``self``.
286
+
287
+ EXAMPLES::
288
+
289
+ sage: algebras.YokonumaHecke(5, 2)
290
+ Yokonuma-Hecke algebra of rank 5 and order 2 with q=q
291
+ over Univariate Laurent Polynomial Ring in q over Rational Field
292
+ """
293
+ return "Yokonuma-Hecke algebra of rank {} and order {} with q={} over {}".format(
294
+ self._d, self._n, self._q, self.base_ring())
295
+
296
+ def _latex_(self):
297
+ r"""
298
+ Return a latex representation of ``self``.
299
+
300
+ EXAMPLES::
301
+
302
+ sage: Y = algebras.YokonumaHecke(5, 2)
303
+ sage: latex(Y)
304
+ \mathcal{Y}_{5,2}(q)
305
+ """
306
+ return "\\mathcal{Y}_{%s,%s}(%s)" % (self._d, self._n, self._q)
307
+
308
+ def _repr_term(self, m):
309
+ """
310
+ Return a string representation of the basis element indexed by ``m``.
311
+
312
+ EXAMPLES::
313
+
314
+ sage: Y = algebras.YokonumaHecke(4, 3)
315
+ sage: Y._repr_term( ((1, 0, 2), Permutation([3,2,1])) )
316
+ 't1*t3^2*g[2,1,2]'
317
+ """
318
+ def gen_str(e):
319
+ return '' if e == 1 else '^%s' % e
320
+ lhs = '*'.join('t%s' % (j+1) + gen_str(i) for j,i in enumerate(m[0]) if i > 0)
321
+ redword = m[1].reduced_word()
322
+ if not redword:
323
+ if not lhs:
324
+ return '1'
325
+ return lhs
326
+ rhs = 'g[{}]'.format(','.join(str(i) for i in redword))
327
+ if not lhs:
328
+ return rhs
329
+ return lhs + '*' + rhs
330
+
331
+ def _latex_term(self, m):
332
+ r"""
333
+ Return a latex representation for the basis element indexed by ``m``.
334
+
335
+ EXAMPLES::
336
+
337
+ sage: Y = algebras.YokonumaHecke(4, 3)
338
+ sage: Y._latex_term( ((1, 0, 2), Permutation([3,2,1])) )
339
+ 't_{1} t_{3}^{2} g_{2} g_{1} g_{2}'
340
+ """
341
+ def gen_str(e):
342
+ return '' if e == 1 else '^{%s}' % e
343
+ lhs = ' '.join('t_{%s}' % (j+1) + gen_str(i) for j,i in enumerate(m[0]) if i > 0)
344
+ redword = m[1].reduced_word()
345
+ if not redword:
346
+ if not lhs:
347
+ return '1'
348
+ return lhs
349
+ return lhs + ' ' + ' '.join("g_{%d}" % i for i in redword)
350
+
351
+ @cached_method
352
+ def algebra_generators(self):
353
+ """
354
+ Return the algebra generators of ``self``.
355
+
356
+ EXAMPLES::
357
+
358
+ sage: Y = algebras.YokonumaHecke(5, 3)
359
+ sage: dict(Y.algebra_generators())
360
+ {'g1': g[1], 'g2': g[2], 't1': t1, 't2': t2, 't3': t3}
361
+ """
362
+ one = self._W.one()
363
+ zero = [0] * self._n
364
+ d = {}
365
+ for i in range(self._n):
366
+ r = list(zero) # Make a copy
367
+ r[i] = 1
368
+ d['t%s' % (i+1)] = self.monomial((tuple(r), one))
369
+ G = self._W.group_generators()
370
+ for i in range(1, self._n):
371
+ d['g%s' % i] = self.monomial((tuple(zero), G[i]))
372
+ return Family(sorted(d), lambda i: d[i])
373
+
374
+ @cached_method
375
+ def one_basis(self):
376
+ """
377
+ Return the index of the basis element of `1`.
378
+
379
+ EXAMPLES::
380
+
381
+ sage: Y = algebras.YokonumaHecke(5, 3)
382
+ sage: Y.one_basis()
383
+ ((0, 0, 0), [1, 2, 3])
384
+ """
385
+ one = self._W.one()
386
+ zero = (0,) * self._n
387
+ return (zero, one)
388
+
389
+ @cached_method
390
+ def e(self, i):
391
+ """
392
+ Return the element `e_i`.
393
+
394
+ EXAMPLES::
395
+
396
+ sage: Y = algebras.YokonumaHecke(4, 3)
397
+ sage: Y.e(1)
398
+ 1/4 + 1/4*t1*t2^3 + 1/4*t1^2*t2^2 + 1/4*t1^3*t2
399
+ sage: Y.e(2)
400
+ 1/4 + 1/4*t2*t3^3 + 1/4*t2^2*t3^2 + 1/4*t2^3*t3
401
+ """
402
+ if i < 1 or i >= self._n:
403
+ raise ValueError("invalid index")
404
+ c = ~self.base_ring()(self._d)
405
+ zero = [0]*self._n
406
+ one = self._W.one()
407
+ d = {}
408
+ for s in range(self._d):
409
+ r = list(zero) # Make a copy
410
+ r[i-1] = s
411
+ if s != 0:
412
+ r[i] = self._d - s
413
+ d[(tuple(r), one)] = c
414
+ return self._from_dict(d, remove_zeros=False)
415
+
416
+ def t(self, i=None):
417
+ """
418
+ Return the generator(s) `t_i`.
419
+
420
+ INPUT:
421
+
422
+ - ``i`` -- (default: ``None``) the generator `t_i` or if ``None``,
423
+ then the family of all generators `t_i`
424
+
425
+ EXAMPLES::
426
+
427
+ sage: Y = algebras.YokonumaHecke(8, 3)
428
+ sage: Y.t(2)
429
+ t2
430
+ sage: list(Y.t())
431
+ [t1, t2, t3]
432
+ """
433
+ G = self.algebra_generators()
434
+ if i is None:
435
+ I = tuple(range(1, self._n+1))
436
+ d = {i: G['t%s' % i] for i in I}
437
+ return Family(I, d.__getitem__)
438
+ return G['t%s' % i]
439
+
440
+ def product_on_basis(self, m1, m2):
441
+ """
442
+ Return the product of the basis elements indexed by ``m1`` and ``m2``.
443
+
444
+ EXAMPLES::
445
+
446
+ sage: Y = algebras.YokonumaHecke(4, 3)
447
+ sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
448
+ sage: 4 * Y.product_on_basis(m, m)
449
+ -(q^-1-q)*t2^2*g[1] + 4*t1*t2 - (q^-1-q)*t1*t2*g[1]
450
+ - (q^-1-q)*t1^2*g[1] - (q^-1-q)*t1^3*t2^3*g[1]
451
+
452
+ Check that we apply the permutation correctly on `t_i`::
453
+
454
+ sage: Y = algebras.YokonumaHecke(4, 3)
455
+ sage: g1, g2, t1, t2, t3 = Y.algebra_generators()
456
+ sage: g21 = g2 * g1
457
+ sage: g21 * t1
458
+ t3*g[2,1]
459
+ """
460
+ t1,g1 = m1
461
+ t2,g2 = m2
462
+ # Commute g1 and t2, then multiply t1 and t2
463
+ # ig1 = g1
464
+ t = [(t1[i] + t2[g1.index(i+1)]) % self._d for i in range(self._n)]
465
+ one = self._W.one()
466
+ if g1 == one:
467
+ return self.monomial((tuple(t), g2))
468
+ ret = self.monomial((tuple(t), g1))
469
+ # We have to reverse the reduced word due to Sage's convention
470
+ # for permutation multiplication
471
+ for i in g2.reduced_word():
472
+ ret = self.linear_combination((self._product_by_basis_gen(m, i), c)
473
+ for m,c in ret)
474
+ return ret
475
+
476
+ def _product_by_basis_gen(self, m, i):
477
+ r"""
478
+ Return the product `t g_w g_i`.
479
+
480
+ If the quadratic relation is `g_i^2 = 1 + (q - q^{-1}) e_i g_i`,
481
+ then we have
482
+
483
+ .. MATH::
484
+
485
+ g_w g_i = \begin{cases}
486
+ g_{ws_i} & \text{if } \ell(ws_i) = \ell(w) + 1, \\
487
+ g_{ws_i} + (q - q^{-1}) g_w e_i & \text{if }
488
+ \ell(w s_i) = \ell(w) - 1.
489
+ \end{cases}
490
+
491
+ INPUT:
492
+
493
+ - ``m`` -- a pair ``[t, w]``, where ``t`` encodes the monomial
494
+ and ``w`` is an element of the permutation group
495
+ - ``i`` -- an element of the index set
496
+
497
+ EXAMPLES::
498
+
499
+ sage: Y = algebras.YokonumaHecke(4, 3)
500
+ sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
501
+ sage: 4 * Y._product_by_basis_gen(m, 1)
502
+ -(q^-1-q)*t2*t3^2*g[1] + 4*t1*t3^2 - (q^-1-q)*t1*t3^2*g[1]
503
+ - (q^-1-q)*t1^2*t2^3*t3^2*g[1] - (q^-1-q)*t1^3*t2^2*t3^2*g[1]
504
+ """
505
+ t, w = m
506
+ wi = w.apply_simple_reflection(i, side='right')
507
+ if not w.has_descent(i, side='right'):
508
+ return self.monomial((t, wi))
509
+
510
+ R = self.base_ring()
511
+ c = (self._q - ~self._q) * ~R(self._d)
512
+ d = {(t, wi): R.one()}
513
+ # We commute g_w and e_i and then multiply by t
514
+ for s in range(self._d):
515
+ r = list(t)
516
+ r[w[i-1]-1] = (r[w[i-1]-1] + s) % self._d
517
+ if s != 0:
518
+ r[w[i]-1] = (r[w[i]-1] + self._d - s) % self._d
519
+ d[(tuple(r), w)] = c
520
+ return self._from_dict(d, remove_zeros=False)
521
+
522
+ @cached_method
523
+ def inverse_g(self, i):
524
+ r"""
525
+ Return the inverse of the generator `g_i`.
526
+
527
+ From the quadratic relation, we have
528
+
529
+ .. MATH::
530
+
531
+ g_i^{-1} = g_i - (q - q^{-1}) e_i.
532
+
533
+ INPUT:
534
+
535
+ - ``i`` -- (default: ``None``) the inverse generator `g_i^{-1}` or
536
+ if ``None``, then the family of all inverse generators `g_i^{-1}`
537
+
538
+ EXAMPLES::
539
+
540
+ sage: Y = algebras.YokonumaHecke(2, 4)
541
+ sage: [2*Y.inverse_g(i) for i in range(1, 4)]
542
+ [(q^-1-q) + 2*g[1] + (q^-1-q)*t1*t2,
543
+ (q^-1-q) + 2*g[2] + (q^-1-q)*t2*t3,
544
+ (q^-1-q) + 2*g[3] + (q^-1-q)*t3*t4]
545
+ sage: all(Y.inverse_g(i) * Y.g(i) == Y.one() for i in range(1, 4))
546
+ True
547
+ sage: all(Y.g(i) * Y.inverse_g(i) == Y.one() for i in range(1, 4))
548
+ True
549
+ """
550
+ if i is None:
551
+ I = self._W.index_set()
552
+ d = {i: self.inverse_g(i) for i in I}
553
+ return Family(I, d.__getitem__)
554
+ if i < 1 or i >= self._n:
555
+ raise ValueError("invalid index")
556
+ return self.g(i) + (~self._q - self._q) * self.e(i)
557
+
558
+ class Element(CombinatorialFreeModule.Element):
559
+ def __invert__(self):
560
+ r"""
561
+ Return the inverse if ``self`` is a basis element.
562
+
563
+ EXAMPLES::
564
+
565
+ sage: Y = algebras.YokonumaHecke(3, 3)
566
+ sage: t = prod(Y.t()); t
567
+ t1*t2*t3
568
+ sage: t.inverse() # indirect doctest
569
+ t1^2*t2^2*t3^2
570
+ sage: [3*~(t*g) for g in Y.g()]
571
+ [(q^-1-q)*t2*t3^2 + (q^-1-q)*t1*t3^2
572
+ + (q^-1-q)*t1^2*t2^2*t3^2 + 3*t1^2*t2^2*t3^2*g[1],
573
+ (q^-1-q)*t1^2*t3 + (q^-1-q)*t1^2*t2
574
+ + (q^-1-q)*t1^2*t2^2*t3^2 + 3*t1^2*t2^2*t3^2*g[2]]
575
+ sage: g = prod(Y.g())
576
+ sage: ~g * g == Y.one()
577
+ True
578
+ sage: g * ~g == Y.one()
579
+ True
580
+
581
+ sage: tp = t * Y.t(2)
582
+ sage: all(tp*g * ~(tp*g) == Y.one() for g in Y.g())
583
+ True
584
+
585
+ TESTS:
586
+
587
+ Check that :issue:`26424` is fixed::
588
+
589
+ sage: Y = algebras.YokonumaHecke(3, 3)
590
+ sage: t = 3 * prod(Y.t())
591
+ sage: ~t
592
+ 1/3*t1^2*t2^2*t3^2
593
+
594
+ sage: ~Y.zero()
595
+ Traceback (most recent call last):
596
+ ...
597
+ ZeroDivisionError
598
+ """
599
+ if not self:
600
+ raise ZeroDivisionError
601
+ if len(self) != 1:
602
+ raise NotImplementedError("inverse only implemented for basis elements (monomials in the generators)" % self)
603
+ H = self.parent()
604
+ t, w = self.support_of_term()
605
+ c = ~self.coefficients()[0]
606
+ telt = H.monomial((tuple((H._d - e) % H._d for e in t), H._W.one()))
607
+ return c * H.prod(H.inverse_g(i) for i in reversed(w.reduced_word())) * telt
608
+
609
+
610
+ class YokonumaHeckeAlgebraWeyl(YokonumaHeckeAlgebra):
611
+ r"""
612
+ The Yokonuma-Hecke algebra associated to a Cartan type.
613
+
614
+ Let `R` be a commutative ring and `q` be a unit in `R`. Let
615
+ `W` be the Weyl group acting on a root lattice `Q`. The
616
+ *Yokonuma-Hecke algebra* `Y_{d,W}(q)` is the associative, unital
617
+ `R`-algebra generated by `\{h_i, g_i \mid i \in I\}`, where `I` is
618
+ the index set of simple roots of `Q`, and subject to the relations:
619
+
620
+ - `g_i` and `g_j` satisfy the braid relations of the corresponding
621
+ simple reflections `s_i` and `s_j` in `W`,
622
+ - `h_i h_j = h_j h_i`,
623
+ - `h_j g_i = g_i (s_i \cdot h_j)` with considering `h_j` as the simple
624
+ root `\alpha_j \in Q`, and
625
+ - `h_j^d = 1`,
626
+
627
+ along with the quadratic relation
628
+
629
+ .. MATH::
630
+
631
+ g_i^2 = 1 + (q - 1) e_i (1 + g_i),
632
+ \qquad\qquad
633
+ e_i := \frac{1}{d} \sum_{s=0}^{d-1} h_i^s.
634
+
635
+ In particular, we can identify the subalgebra generated by `\{h_i \mid
636
+ i \in I\}` with `(\ZZ / d \ZZ) \otimes_{\ZZ} Q`. The Yokonuma-Hecke
637
+ algebra, when `d = p^m - 1` for a prime `p` and some `m \geq 1`, can
638
+ be identified with functions invariant under the left *and* right actions
639
+ of the unipotent group `U` on `G(\GF{d})`, the semisimple Chevalley
640
+ (or Lie) group associated with `W`. Moreover, all of the algebra
641
+ generators are invertible. In particular, we have
642
+
643
+ .. MATH::
644
+
645
+ g_i^{-1} = g_i + (q^{-1} - 1) e_i (1 + g_i).
646
+
647
+ For `d = 1`, the Yokonuma-Hecke algebra is equal to the
648
+ :class:`Iwahori-Hecke <IwahoriHeckeAlgebra>` of `W`.
649
+
650
+ INPUT:
651
+
652
+ - ``d`` -- the maximum power of `t`
653
+ - ``ct`` -- the Cartan type
654
+ - ``q`` -- (optional) an invertible element in a commutative ring;
655
+ the default is `q \in \QQ[q,q^{-1}]`
656
+ - ``R`` -- (optional) a commutative ring containing ``q``; the
657
+ default is the parent of `q`
658
+
659
+ .. WARNING::
660
+
661
+ For type `A_n`, this returns the Yokonuma-Hecke algebra associated
662
+ to the Lie (or Chevalley) group `SL_n(\GF{d})`. For the Yokonuma-Hecke
663
+ algebra corresponding to the (reductive) Lie group `GL_n(\GF{d})`, use
664
+ :class:`YokonumaHeckeAlgebraGL`. Additionally, this uses a different
665
+ quadratic relation.
666
+
667
+ REFERENCES:
668
+
669
+ - [Marin2018]_
670
+ """
671
+ def __init__(self, d, ct, q, R):
672
+ r"""
673
+ Initialize ``self``.
674
+
675
+ EXAMPLES::
676
+
677
+ sage: Y = algebras.YokonumaHecke(2, ['F',4])
678
+ sage: TestSuite(Y).run()
679
+ sage: Y = algebras.YokonumaHecke(3, ['G',2])
680
+ sage: elts = list(Y.gens()) + [Y.an_element()] + [sum(Y.gens())]
681
+ sage: TestSuite(Y).run(elements=elts) # long time
682
+ """
683
+ from sage.categories.sets_cat import cartesian_product
684
+ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
685
+
686
+ self._Q = ct.root_system().root_space(IntegerModRing(d))
687
+ self._Qp = ct.root_system().root_lattice()
688
+ W = self._Qp.weyl_group(prefix='s')
689
+ indices = cartesian_product([self._Q, W])
690
+ YokonumaHeckeAlgebra.__init__(self, d, W, q, R, indices)
691
+
692
+ def _repr_(self):
693
+ """
694
+ Return a string representation of ``self``.
695
+
696
+ EXAMPLES::
697
+
698
+ sage: algebras.YokonumaHecke(5, ['E',6])
699
+ Yokonuma-Hecke algebra of rank 5 for ['E', 6] with q=q
700
+ over Univariate Laurent Polynomial Ring in q over Rational Field
701
+ """
702
+ return "Yokonuma-Hecke algebra of rank {} for {} with q={} over {}".format(
703
+ self._d, self._cartan_type, self._q, self.base_ring())
704
+
705
+ def _latex_(self):
706
+ r"""
707
+ Return a latex representation of ``self``.
708
+
709
+ EXAMPLES::
710
+
711
+ sage: Y = algebras.YokonumaHecke(5, ['E',6])
712
+ sage: latex(Y)
713
+ \mathcal{Y}_{5,E_6}(q)
714
+ """
715
+ from sage.misc.latex import latex
716
+ return "\\mathcal{Y}_{%s,%s}(%s)" % (self._d, latex(self._cartan_type), self._q)
717
+
718
+ def _repr_term(self, m):
719
+ """
720
+ Return a string representation of the basis element indexed by ``m``.
721
+
722
+ EXAMPLES::
723
+
724
+ sage: Y = algebras.YokonumaHecke(4, ['E',6])
725
+ sage: al = Y._Q.simple_root(1) + 3*Y._Q.simple_root(5)
726
+ sage: Y._repr_term((al, prod(Y._W.gens())))
727
+ 'h1*h5^3*g[1,3,2,4,5,6]'
728
+ """
729
+ def gen_str(e):
730
+ return '' if e == 1 else '^%s' % e
731
+
732
+ I = self._cartan_type.index_set()
733
+ lhs = '*'.join('h%s' % j + gen_str(m[0][j]) for j in I if m[0][j])
734
+ redword = m[1].reduced_word()
735
+ if not redword:
736
+ if not lhs:
737
+ return '1'
738
+ return lhs
739
+ rhs = 'g[{}]'.format(','.join(str(i) for i in redword))
740
+ if not lhs:
741
+ return rhs
742
+ return lhs + '*' + rhs
743
+
744
+ def _latex_term(self, m):
745
+ r"""
746
+ Return a latex representation for the basis element indexed by ``m``.
747
+
748
+ EXAMPLES::
749
+
750
+ sage: Y = algebras.YokonumaHecke(4, ['E',6])
751
+ sage: al = Y._Q.simple_root(1) + 3*Y._Q.simple_root(5)
752
+ sage: Y._latex_term((al, prod(Y._W.gens())))
753
+ 'h_{1} h_{5}^{3} g_{1} g_{3} g_{2} g_{4} g_{5} g_{6}'
754
+ """
755
+ def gen_str(e):
756
+ return '' if e == 1 else '^{%s}' % e
757
+
758
+ I = self._cartan_type.index_set()
759
+ lhs = ' '.join('h_{%s}' % j + gen_str(m[0][j]) for j in I if m[0][j])
760
+ redword = m[1].reduced_word()
761
+ if not redword:
762
+ if not lhs:
763
+ return '1'
764
+ return lhs
765
+ return lhs + ' ' + ' '.join("g_{%d}" % i for i in redword)
766
+
767
+ @cached_method
768
+ def algebra_generators(self):
769
+ """
770
+ Return the algebra generators of ``self``.
771
+
772
+ EXAMPLES::
773
+
774
+ sage: Y = algebras.YokonumaHecke(5, ['G',2])
775
+ sage: dict(Y.algebra_generators())
776
+ {'g1': g[1], 'g2': g[2], 'h1': h1, 'h2': h2}
777
+ """
778
+ one = self._W.one()
779
+ zero = self._Q.zero()
780
+ d = {}
781
+ for i, al in self._Q.simple_roots().items():
782
+ d['h%s' % i] = self.monomial((al, one))
783
+ for i, g in self._W.simple_reflections().items():
784
+ d['g%s' % i] = self.monomial((zero, g))
785
+ return Family(sorted(d), d.__getitem__)
786
+
787
+ @cached_method
788
+ def one_basis(self):
789
+ """
790
+ Return the index of the basis element of `1`.
791
+
792
+ EXAMPLES::
793
+
794
+ sage: Y = algebras.YokonumaHecke(5, ['D',6])
795
+ sage: Y.one_basis()
796
+ (0, 1)
797
+ """
798
+ return (self._Q.zero(), self._W.one())
799
+
800
+ @cached_method
801
+ def e(self, i=None):
802
+ r"""
803
+ Return the element(s) `e_i`.
804
+
805
+ INPUT:
806
+
807
+ - ``i`` -- (default: ``None``) the element `e_i` or if ``None``,
808
+ then the family of all idempotents `e_i`
809
+
810
+ EXAMPLES::
811
+
812
+ sage: Y = algebras.YokonumaHecke(4, ['B',3])
813
+ sage: Y.e(1)
814
+ 1/4 + 1/4*h1 + 1/4*h1^2 + 1/4*h1^3
815
+ sage: Y.e(2)
816
+ 1/4 + 1/4*h2 + 1/4*h2^2 + 1/4*h2^3
817
+
818
+ We verify that they are idempotents::
819
+
820
+ sage: all(Y.e(i)^2 == Y.e(i) for i in Y.index_set())
821
+ True
822
+
823
+ Another example::
824
+
825
+ sage: Y = algebras.YokonumaHecke(3, ['G',2])
826
+ sage: e = Y.e()
827
+ sage: all(e[i]^2 == e[i] for i in Y.index_set())
828
+ True
829
+ """
830
+ if i is None:
831
+ I = self._W.index_set()
832
+ d = {i: self.e(i) for i in I}
833
+ return Family(I, d.__getitem__)
834
+ if i not in self._W.index_set():
835
+ raise ValueError("invalid index")
836
+ c = ~self.base_ring()(self._d)
837
+ al = self._Q.simple_root(i)
838
+ one = self._W.one()
839
+ d = {(k*al, one): c for k in self._Q.base_ring()}
840
+ return self._from_dict(d, remove_zeros=False)
841
+
842
+ def h(self, i=None):
843
+ r"""
844
+ Return the generator(s) `h_i`.
845
+
846
+ INPUT:
847
+
848
+ - ``i`` -- (default: ``None``) the generator `h_i` or if ``None``,
849
+ then the family of all generators `h_i`
850
+
851
+ EXAMPLES::
852
+
853
+ sage: Y = algebras.YokonumaHecke(8, ['B',3])
854
+ sage: Y.h(2)
855
+ h2
856
+ sage: Y.h()
857
+ Finite family {1: h1, 2: h2, 3: h3}
858
+ """
859
+ G = self.algebra_generators()
860
+ if i is None:
861
+ I = self._W.index_set()
862
+ d = {i: G['h%s' % i] for i in I}
863
+ return Family(I, d.__getitem__)
864
+ return G['h%s' % i]
865
+
866
+ @cached_method
867
+ def inverse_g(self, i=None):
868
+ r"""
869
+ Return the inverse of the generator(s) `g_i`.
870
+
871
+ From the quadratic relation, we have
872
+
873
+ .. MATH::
874
+
875
+ g_i^{-1} = g_i + (q^{-1} - 1) e_i (1 + g_i).
876
+
877
+ INPUT:
878
+
879
+ - ``i`` -- (default: ``None``) the inverse generator `g_i^{-1}` or
880
+ if ``None``, then the family of all inverse generators `g_i^{-1}`
881
+
882
+ EXAMPLES::
883
+
884
+ sage: Y = algebras.YokonumaHecke(2, ['B',3])
885
+ sage: [2*Y.inverse_g(i) for i in Y.index_set()]
886
+ [(q^-1+1)*g[1] + (q^-1-1) + (q^-1-1)*h1*g[1] + (q^-1-1)*h1,
887
+ (q^-1-1) + (q^-1+1)*g[2] + (q^-1-1)*h2 + (q^-1-1)*h2*g[2],
888
+ (q^-1-1) + (q^-1+1)*g[3] + (q^-1-1)*h3 + (q^-1-1)*h3*g[3]]
889
+ sage: all(Y.inverse_g(i) * Y.g(i) == Y.one() for i in range(1, 4))
890
+ True
891
+ sage: all(Y.g(i) * Y.inverse_g(i) == Y.one() for i in range(1, 4))
892
+ True
893
+
894
+ sage: Y = algebras.YokonumaHecke(3, ['G',2])
895
+ sage: ginv = Y.inverse_g()
896
+ sage: all(Y.g(i) * ginv[i] == Y.one() for i in Y.index_set())
897
+ True
898
+ sage: all(ginv[i] * Y.g(i) == Y.one() for i in Y.index_set())
899
+ True
900
+ """
901
+ if i is None:
902
+ I = self._W.index_set()
903
+ d = {i: self.inverse_g(i) for i in I}
904
+ return Family(I, d.__getitem__)
905
+ if i not in self._W.index_set():
906
+ raise ValueError("invalid index")
907
+ return self.g(i) + (~self._q - 1) * self.e(i) * (self.one() + self.g(i))
908
+
909
+ def product_on_basis(self, m1, m2):
910
+ r"""
911
+ Return the product of the basis elements indexed by ``m1`` and ``m2``.
912
+
913
+ EXAMPLES::
914
+
915
+ sage: Y = algebras.YokonumaHecke(4, ['C',3])
916
+ sage: al = Y._Q.simple_root(1) + 2*Y._Q.simple_root(3)
917
+ sage: w = Y._W.from_reduced_word([3,2,1,2]); w.length()
918
+ 4
919
+ sage: Y.product_on_basis((Y._Q.zero(), w), (al, Y._W.one()))
920
+ h2^3*h3*g[3,1,2,1]
921
+ sage: Y.product_on_basis((al, w), (al, Y._W.one()))
922
+ h1*h2^3*h3^3*g[3,1,2,1]
923
+ sage: Y.product_on_basis((al, Y._W.one()), (al, w))
924
+ h1^2*g[3,1,2,1]
925
+ sage: 4 * Y.product_on_basis((al, w), (al, w))
926
+ -(1-q)*h1*g[3,1,2,3,2,1] - (1-q)*h1*g[3,1,2,3,1,2,1]
927
+ - (1-q)*h1*h2*h3*g[3,1,2,3,2,1] - (1-q)*h1*h2*h3*g[3,1,2,3,1,2,1]
928
+ - (1-q)*h1*h2^2*h3^2*g[3,1,2,3,2,1] - (1-q)*h1*h2^2*h3^2*g[3,1,2,3,1,2,1]
929
+ + (3+q)*h1*h2^3*h3^3*g[3,1,2,3,2,1] - (1-q)*h1*h2^3*h3^3*g[3,1,2,3,1,2,1]
930
+
931
+ Check that we apply the permutation correctly on `h_i`::
932
+
933
+ sage: Y = algebras.YokonumaHecke(4, ['B',3])
934
+ sage: g1, g2, g3, h1, h2, h3 = Y.algebra_generators()
935
+ sage: (g2 * g1) * h1
936
+ h1^3*h2^3*g[2,1]
937
+ sage: g2 * (g1 * h1)
938
+ h1^3*h2^3*g[2,1]
939
+ """
940
+ h1, g1 = m1
941
+ h2, g2 = m2
942
+ # Commute g1 and t2, then multiply h1 and h2
943
+ # ig1 = g1
944
+ h = h1 + h2.weyl_action(g1)
945
+ one = self._W.one()
946
+ if g1 == one:
947
+ return self.monomial((h, g2))
948
+ ret = self.monomial((h, g1))
949
+ for i in g2.reduced_word():
950
+ ret = self.linear_combination((self._product_by_basis_gen(m, i), c)
951
+ for m, c in ret)
952
+ return ret
953
+
954
+ def _product_by_basis_gen(self, m, i):
955
+ r"""
956
+ Return the product `t g_w g_i`.
957
+
958
+ If the quadratic relation is `g_i^2 = 1 + (q - 1) (1 + g_i) e_i`,
959
+ then we have
960
+
961
+ .. MATH::
962
+
963
+ g_w g_i = \begin{cases}
964
+ g_{ws_i} & \text{if } \ell(ws_i) = \ell(w) + 1, \\
965
+ g_{ws_i} + (q-1) (g_{ws_i} + g_w) e_i & \text{if }
966
+ \ell(w s_i) = \ell(w) - 1.
967
+ \end{cases}
968
+
969
+ INPUT:
970
+
971
+ - ``m`` -- a pair ``[h, w]``, where ``h`` encodes the monomial
972
+ and ``w`` is an element of the Weyl group
973
+ - ``i`` -- an element of the index set
974
+
975
+ EXAMPLES::
976
+
977
+ sage: Y = algebras.YokonumaHecke(4, ['D',4])
978
+ sage: m = ((1, 0, 2), Permutations(3)([2,1,3]))
979
+ sage: 4 * Y._product_by_basis_gen(m, 1) # not tested
980
+ -(q^-1-q)*t2*t3^2*g[1] + 4*t1*t3^2 - (q^-1-q)*t1*t3^2*g[1]
981
+ - (q^-1-q)*t1^2*t2^3*t3^2*g[1] - (q^-1-q)*t1^3*t2^2*t3^2*g[1]
982
+ """
983
+ h, w = m
984
+ wi = w.apply_simple_reflection(i, side='right')
985
+ if not w.has_descent(i, side='right'):
986
+ return self.monomial((h, wi))
987
+
988
+ q = self._q
989
+ mon = self.monomial((h, wi))
990
+ # TODO: Optimize this by computing an explicit expression
991
+ # for the commutation of w with ei.
992
+ one = self.base_ring().one()
993
+ binomial = self.element_class(self, {(h,wi): one, (h,w): one})
994
+ return mon + (q-1) * binomial * self.e(i)
995
+
996
+ class Element(CombinatorialFreeModule.Element):
997
+ def __invert__(self):
998
+ r"""
999
+ Return the inverse if ``self`` is a basis element.
1000
+
1001
+ EXAMPLES::
1002
+
1003
+ sage: Y = algebras.YokonumaHecke(3, ['B',3])
1004
+ sage: all(g * ~g == Y.one() for g in Y.g())
1005
+ True
1006
+ sage: h = prod(Y.h()) * Y.h(2)
1007
+ sage: all(h*g * ~(h*g) == Y.one() for g in Y.g())
1008
+ True
1009
+ """
1010
+ if not self:
1011
+ raise ZeroDivisionError
1012
+ if len(self) != 1:
1013
+ raise NotImplementedError("inverse only implemented for basis elements (monomials in the generators)" % self)
1014
+ H = self.parent()
1015
+ t, w = self.support_of_term()
1016
+ c = ~self.coefficients()[0]
1017
+ telt = H.monomial((-t, H._W.one()))
1018
+ return c * H.prod(H.inverse_g(i) for i in reversed(w.reduced_word())) * telt