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,783 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ r"""
4
+ Hall Algebras
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2013-10-17): Initial version
9
+ """
10
+ # ****************************************************************************
11
+ # Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
12
+ #
13
+ # Distributed under the terms of the GNU General Public License (GPL)
14
+ # https://www.gnu.org/licenses/
15
+ # ****************************************************************************
16
+
17
+ from sage.misc.misc_c import prod
18
+ from sage.misc.cachefunc import cached_method
19
+ from sage.categories.algebras_with_basis import AlgebrasWithBasis
20
+ from sage.categories.hopf_algebras_with_basis import HopfAlgebrasWithBasis
21
+ from sage.combinat.partition import Partition, Partitions
22
+ from sage.combinat.free_module import CombinatorialFreeModule
23
+ from sage.combinat.hall_polynomial import hall_polynomial
24
+ from sage.combinat.sf.sf import SymmetricFunctions
25
+ from sage.rings.integer_ring import ZZ
26
+ from functools import cmp_to_key, reduce
27
+
28
+
29
+ def transpose_cmp(x, y):
30
+ r"""
31
+ Compare partitions ``x`` and ``y`` in transpose dominance order.
32
+
33
+ We say partitions `\mu` and `\lambda` satisfy `\mu \prec \lambda`
34
+ in transpose dominance order if for all `i \geq 1` we have:
35
+
36
+ .. MATH::
37
+
38
+ l_1 + 2 l_2 + \cdots + (i-1) l_{i-1} + i(l_i + l_{i+1} + \cdots) \leq
39
+ m_1 + 2 m_2 + \cdots + (i-1) m_{i-1} + i(m_i + m_{i+1} + \cdots),
40
+
41
+ where `l_k` denotes the number of appearances of `k` in
42
+ `\lambda`, and `m_k` denotes the number of appearances of `k`
43
+ in `\mu`.
44
+
45
+ Equivalently, `\mu \prec \lambda` if the conjugate of the
46
+ partition `\mu` dominates the conjugate of the partition
47
+ `\lambda`.
48
+
49
+ Since this is a partial ordering, we fallback to lex ordering
50
+ `\mu <_L \lambda` if we cannot compare in the transpose order.
51
+
52
+ EXAMPLES::
53
+
54
+ sage: from sage.algebras.hall_algebra import transpose_cmp
55
+ sage: transpose_cmp(Partition([4,3,1]), Partition([3,2,2,1]))
56
+ -1
57
+ sage: transpose_cmp(Partition([2,2,1]), Partition([3,2]))
58
+ 1
59
+ sage: transpose_cmp(Partition([4,1,1]), Partition([4,1,1]))
60
+ 0
61
+ """
62
+ if x == y:
63
+ return 0
64
+ xexp = x.to_exp()
65
+ yexp = y.to_exp()
66
+ n = min(len(xexp), len(yexp))
67
+
68
+ def check(m, l):
69
+ s1 = 0
70
+ s2 = 0
71
+ for i in range(n):
72
+ s1 += sum(l[i:])
73
+ s2 += sum(m[i:])
74
+ if s1 > s2:
75
+ return False
76
+ return sum(l) <= sum(m)
77
+ if check(xexp, yexp):
78
+ return 1
79
+ if check(yexp, xexp):
80
+ return -1
81
+ if x < y:
82
+ return -1
83
+ return 1
84
+
85
+
86
+ class HallAlgebra(CombinatorialFreeModule):
87
+ r"""
88
+ The (classical) Hall algebra.
89
+
90
+ The *(classical) Hall algebra* over a commutative ring `R` with a
91
+ parameter `q \in R` is defined to be the free `R`-module with
92
+ basis `(I_\lambda)`, where `\lambda` runs over all integer
93
+ partitions. The algebra structure is given by a product defined by
94
+
95
+ .. MATH::
96
+
97
+ I_\mu \cdot I_\lambda = \sum_\nu P^{\nu}_{\mu, \lambda}(q) I_\nu,
98
+
99
+ where `P^{\nu}_{\mu, \lambda}` is a Hall polynomial (see
100
+ :func:`~sage.combinat.hall_polynomial.hall_polynomial`). The
101
+ unity of this algebra is `I_{\emptyset}`.
102
+
103
+ The (classical) Hall algebra is also known as the Hall-Steinitz
104
+ algebra.
105
+
106
+ We can define an `R`-algebra isomorphism `\Phi` from the
107
+ `R`-algebra of symmetric functions (see
108
+ :class:`~sage.combinat.sf.sf.SymmetricFunctions`) to the
109
+ (classical) Hall algebra by sending the `r`-th elementary
110
+ symmetric function `e_r` to `q^{r(r-1)/2} I_{(1^r)}` for every
111
+ positive integer `r`. This isomorphism used to transport the
112
+ Hopf algebra structure from the `R`-algebra of symmetric functions
113
+ to the Hall algebra, thus making the latter a connected graded
114
+ Hopf algebra. If `\lambda` is a partition, then the preimage
115
+ of the basis element `I_{\lambda}` under this isomorphism is
116
+ `q^{n(\lambda)} P_{\lambda}(x; q^{-1})`, where `P_{\lambda}` denotes
117
+ the `\lambda`-th Hall-Littlewood `P`-function, and where
118
+ `n(\lambda) = \sum_i (i - 1) \lambda_i`.
119
+
120
+ See section 2.3 in [Sch2006]_, and sections II.2 and III.3
121
+ in [Mac1995]_ (where our `I_{\lambda}` is called `u_{\lambda}`).
122
+
123
+ EXAMPLES::
124
+
125
+ sage: R.<q> = ZZ[]
126
+ sage: H = HallAlgebra(R, q)
127
+ sage: H[2,1]*H[1,1]
128
+ H[3, 2] + (q+1)*H[3, 1, 1] + (q^2+q)*H[2, 2, 1] + (q^4+q^3+q^2)*H[2, 1, 1, 1]
129
+ sage: H[2]*H[2,1]
130
+ H[4, 1] + q*H[3, 2] + (q^2-1)*H[3, 1, 1] + (q^3+q^2)*H[2, 2, 1]
131
+ sage: H[3]*H[1,1]
132
+ H[4, 1] + q^2*H[3, 1, 1]
133
+ sage: H[3]*H[2,1]
134
+ H[5, 1] + q*H[4, 2] + (q^2-1)*H[4, 1, 1] + q^3*H[3, 2, 1]
135
+
136
+ We can rewrite the Hall algebra in terms of monomials of
137
+ the elements `I_{(1^r)}`::
138
+
139
+ sage: I = H.monomial_basis()
140
+ sage: H(I[2,1,1])
141
+ H[3, 1] + (q+1)*H[2, 2] + (2*q^2+2*q+1)*H[2, 1, 1]
142
+ + (q^5+2*q^4+3*q^3+3*q^2+2*q+1)*H[1, 1, 1, 1]
143
+ sage: I(H[2,1,1])
144
+ I[3, 1] + (-q^3-q^2-q-1)*I[4]
145
+
146
+ The isomorphism between the Hall algebra and the symmetric
147
+ functions described above is implemented as a coercion::
148
+
149
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
150
+ sage: q = R.gen()
151
+ sage: H = HallAlgebra(R, q)
152
+ sage: e = SymmetricFunctions(R).e()
153
+ sage: e(H[1,1,1])
154
+ 1/q^3*e[3]
155
+
156
+ We can also do computations with any special value of ``q``,
157
+ such as `0` or `1` or (most commonly) a prime power. Here
158
+ is an example using a prime::
159
+
160
+ sage: H = HallAlgebra(ZZ, 2)
161
+ sage: H[2,1]*H[1,1]
162
+ H[3, 2] + 3*H[3, 1, 1] + 6*H[2, 2, 1] + 28*H[2, 1, 1, 1]
163
+ sage: H[3,1]*H[2]
164
+ H[5, 1] + H[4, 2] + 6*H[3, 3] + 3*H[4, 1, 1] + 8*H[3, 2, 1]
165
+ sage: H[2,1,1]*H[3,1]
166
+ H[5, 2, 1] + 2*H[4, 3, 1] + 6*H[4, 2, 2] + 7*H[5, 1, 1, 1]
167
+ + 19*H[4, 2, 1, 1] + 24*H[3, 3, 1, 1] + 48*H[3, 2, 2, 1]
168
+ + 105*H[4, 1, 1, 1, 1] + 224*H[3, 2, 1, 1, 1]
169
+ sage: I = H.monomial_basis()
170
+ sage: H(I[2,1,1])
171
+ H[3, 1] + 3*H[2, 2] + 13*H[2, 1, 1] + 105*H[1, 1, 1, 1]
172
+ sage: I(H[2,1,1])
173
+ I[3, 1] - 15*I[4]
174
+
175
+ If `q` is set to `1`, the coercion to the symmetric functions
176
+ sends `I_{\lambda}` to `m_{\lambda}`::
177
+
178
+ sage: H = HallAlgebra(QQ, 1)
179
+ sage: H[2,1] * H[2,1]
180
+ H[4, 2] + 2*H[3, 3] + 2*H[4, 1, 1] + 2*H[3, 2, 1] + 6*H[2, 2, 2] + 4*H[2, 2, 1, 1]
181
+ sage: m = SymmetricFunctions(QQ).m()
182
+ sage: m[2,1] * m[2,1]
183
+ 4*m[2, 2, 1, 1] + 6*m[2, 2, 2] + 2*m[3, 2, 1] + 2*m[3, 3] + 2*m[4, 1, 1] + m[4, 2]
184
+ sage: m(H[3,1])
185
+ m[3, 1]
186
+
187
+ We can set `q` to `0` (but should keep in mind that we don't get
188
+ the Schur functions this way)::
189
+
190
+ sage: H = HallAlgebra(QQ, 0)
191
+ sage: H[2,1] * H[2,1]
192
+ H[4, 2] + H[3, 3] + H[4, 1, 1] - H[3, 2, 1] - H[3, 1, 1, 1]
193
+
194
+ TESTS:
195
+
196
+ The coefficients are actually Laurent polynomials in general, so we don't
197
+ have to work over the fraction field of `\ZZ[q]`. This didn't work before
198
+ :issue:`15345`::
199
+
200
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
201
+ sage: H = HallAlgebra(R, q)
202
+ sage: I = H.monomial_basis()
203
+ sage: hi = H(I[2,1]); hi
204
+ H[2, 1] + (1+q+q^2)*H[1, 1, 1]
205
+ sage: hi.parent() is H
206
+ True
207
+ sage: h22 = H[2]*H[2]; h22
208
+ H[4] - (1-q)*H[3, 1] + (q+q^2)*H[2, 2]
209
+ sage: h22.parent() is H
210
+ True
211
+ sage: e = SymmetricFunctions(R).e()
212
+ sage: e(H[1,1,1])
213
+ (q^-3)*e[3]
214
+ """
215
+ def __init__(self, base_ring, q, prefix='H'):
216
+ """
217
+ Initialize ``self``.
218
+
219
+ EXAMPLES::
220
+
221
+ sage: R.<q> = ZZ[]
222
+ sage: H = HallAlgebra(R, q)
223
+ sage: TestSuite(H).run()
224
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
225
+ sage: q = R.gen()
226
+ sage: H = HallAlgebra(R, q)
227
+ sage: TestSuite(H).run() # long time
228
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
229
+ sage: H = HallAlgebra(R, q)
230
+ sage: TestSuite(H).run() # long time
231
+ """
232
+ self._q = q
233
+ try:
234
+ q_inverse = q**-1
235
+ if q_inverse not in base_ring:
236
+ hopf_structure = False
237
+ else:
238
+ hopf_structure = True
239
+ except Exception:
240
+ hopf_structure = False
241
+ if hopf_structure:
242
+ category = HopfAlgebrasWithBasis(base_ring)
243
+ else:
244
+ category = AlgebrasWithBasis(base_ring)
245
+ CombinatorialFreeModule.__init__(self, base_ring, Partitions(),
246
+ prefix=prefix, bracket=False,
247
+ sorting_key=cmp_to_key(transpose_cmp),
248
+ category=category)
249
+
250
+ # Coercions
251
+ I = self.monomial_basis()
252
+ M = I.module_morphism(I._to_natural_on_basis, codomain=self,
253
+ triangular='upper', unitriangular=True,
254
+ inverse_on_support=lambda x: x.conjugate(),
255
+ invertible=True)
256
+ M.register_as_coercion()
257
+ (~M).register_as_coercion()
258
+
259
+ def _repr_(self):
260
+ """
261
+ Return a string representation of ``self``.
262
+
263
+ EXAMPLES::
264
+
265
+ sage: R.<q> = ZZ[]
266
+ sage: HallAlgebra(R, q)
267
+ Hall algebra with q=q over Univariate Polynomial Ring in q over Integer Ring
268
+ """
269
+ return "Hall algebra with q={} over {}".format(self._q, self.base_ring())
270
+
271
+ def one_basis(self):
272
+ """
273
+ Return the index of the basis element `1`.
274
+
275
+ EXAMPLES::
276
+
277
+ sage: R.<q> = ZZ[]
278
+ sage: H = HallAlgebra(R, q)
279
+ sage: H.one_basis()
280
+ []
281
+ """
282
+ return Partition([])
283
+
284
+ def product_on_basis(self, mu, la):
285
+ """
286
+ Return the product of the two basis elements indexed by ``mu``
287
+ and ``la``.
288
+
289
+ EXAMPLES::
290
+
291
+ sage: R.<q> = ZZ[]
292
+ sage: H = HallAlgebra(R, q)
293
+ sage: H.product_on_basis(Partition([1,1]), Partition([1]))
294
+ H[2, 1] + (q^2+q+1)*H[1, 1, 1]
295
+ sage: H.product_on_basis(Partition([2,1]), Partition([1,1]))
296
+ H[3, 2] + (q+1)*H[3, 1, 1] + (q^2+q)*H[2, 2, 1] + (q^4+q^3+q^2)*H[2, 1, 1, 1]
297
+ sage: H.product_on_basis(Partition([3,2]), Partition([2,1]))
298
+ H[5, 3] + (q+1)*H[4, 4] + q*H[5, 2, 1] + (2*q^2-1)*H[4, 3, 1]
299
+ + (q^3+q^2)*H[4, 2, 2] + (q^4+q^3)*H[3, 3, 2]
300
+ + (q^4-q^2)*H[4, 2, 1, 1] + (q^5+q^4-q^3-q^2)*H[3, 3, 1, 1]
301
+ + (q^6+q^5)*H[3, 2, 2, 1]
302
+ sage: H.product_on_basis(Partition([3,1,1]), Partition([2,1]))
303
+ H[5, 2, 1] + q*H[4, 3, 1] + (q^2-1)*H[4, 2, 2]
304
+ + (q^3+q^2)*H[3, 3, 2] + (q^2+q+1)*H[5, 1, 1, 1]
305
+ + (2*q^3+q^2-q-1)*H[4, 2, 1, 1] + (q^4+2*q^3+q^2)*H[3, 3, 1, 1]
306
+ + (q^5+q^4)*H[3, 2, 2, 1] + (q^6+q^5+q^4-q^2-q-1)*H[4, 1, 1, 1, 1]
307
+ + (q^7+q^6+q^5)*H[3, 2, 1, 1, 1]
308
+ """
309
+ # Check conditions for multiplying by 1
310
+ if len(mu) == 0:
311
+ return self.monomial(la)
312
+ if len(la) == 0:
313
+ return self.monomial(mu)
314
+
315
+ if all(x == 1 for x in la):
316
+ return self.sum_of_terms([(p, hall_polynomial(p, mu, la, self._q))
317
+ for p in Partitions(sum(mu) + len(la))],
318
+ distinct=True)
319
+
320
+ I = HallAlgebraMonomials(self.base_ring(), self._q)
321
+ mu = self.monomial(mu)
322
+ la = self.monomial(la)
323
+ return self(I(mu) * I(la))
324
+
325
+ def coproduct_on_basis(self, la):
326
+ """
327
+ Return the coproduct of the basis element indexed by ``la``.
328
+
329
+ EXAMPLES::
330
+
331
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
332
+ sage: q = R.gen()
333
+ sage: H = HallAlgebra(R, q)
334
+ sage: H.coproduct_on_basis(Partition([1,1]))
335
+ H[] # H[1, 1] + 1/q*H[1] # H[1] + H[1, 1] # H[]
336
+ sage: H.coproduct_on_basis(Partition([2]))
337
+ H[] # H[2] + ((q-1)/q)*H[1] # H[1] + H[2] # H[]
338
+ sage: H.coproduct_on_basis(Partition([2,1]))
339
+ H[] # H[2, 1] + ((q^2-1)/q^2)*H[1] # H[1, 1] + 1/q*H[1] # H[2]
340
+ + ((q^2-1)/q^2)*H[1, 1] # H[1] + 1/q*H[2] # H[1] + H[2, 1] # H[]
341
+
342
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
343
+ sage: H = HallAlgebra(R, q)
344
+ sage: H.coproduct_on_basis(Partition([2]))
345
+ H[] # H[2] - (q^-1-1)*H[1] # H[1] + H[2] # H[]
346
+ sage: H.coproduct_on_basis(Partition([2,1]))
347
+ H[] # H[2, 1] - (q^-2-1)*H[1] # H[1, 1] + (q^-1)*H[1] # H[2]
348
+ - (q^-2-1)*H[1, 1] # H[1] + (q^-1)*H[2] # H[1] + H[2, 1] # H[]
349
+ """
350
+ S = self.tensor_square()
351
+ if all(x == 1 for x in la):
352
+ n = len(la)
353
+ return S.sum_of_terms([((Partition([1]*r), Partition([1]*(n-r))), self._q**(-r*(n-r)))
354
+ for r in range(n+1)], distinct=True)
355
+
356
+ I = HallAlgebraMonomials(self.base_ring(), self._q)
357
+ la = self.monomial(la)
358
+ return S(I(la).coproduct())
359
+
360
+ def antipode_on_basis(self, la):
361
+ """
362
+ Return the antipode of the basis element indexed by ``la``.
363
+
364
+ EXAMPLES::
365
+
366
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
367
+ sage: q = R.gen()
368
+ sage: H = HallAlgebra(R, q)
369
+ sage: H.antipode_on_basis(Partition([1,1]))
370
+ 1/q*H[2] + 1/q*H[1, 1]
371
+ sage: H.antipode_on_basis(Partition([2]))
372
+ -1/q*H[2] + ((q^2-1)/q)*H[1, 1]
373
+
374
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
375
+ sage: H = HallAlgebra(R, q)
376
+ sage: H.antipode_on_basis(Partition([1,1]))
377
+ (q^-1)*H[2] + (q^-1)*H[1, 1]
378
+ sage: H.antipode_on_basis(Partition([2]))
379
+ -(q^-1)*H[2] - (q^-1-q)*H[1, 1]
380
+ """
381
+ if all(x == 1 for x in la):
382
+ r = len(la)
383
+ q = (-1) ** r * self._q ** (-(r * (r - 1)) // 2)
384
+ return self._from_dict({p: q for p in Partitions(r)})
385
+
386
+ I = HallAlgebraMonomials(self.base_ring(), self._q)
387
+ return self(I(self.monomial(la)).antipode())
388
+
389
+ def counit(self, x):
390
+ """
391
+ Return the counit of the element ``x``.
392
+
393
+ EXAMPLES::
394
+
395
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
396
+ sage: q = R.gen()
397
+ sage: H = HallAlgebra(R, q)
398
+ sage: H.counit(H.an_element())
399
+ 2
400
+ """
401
+ return x.coefficient(self.one_basis())
402
+
403
+ def monomial_basis(self):
404
+ """
405
+ Return the basis of the Hall algebra given by monomials in the
406
+ `I_{(1^r)}`.
407
+
408
+ EXAMPLES::
409
+
410
+ sage: R.<q> = ZZ[]
411
+ sage: H = HallAlgebra(R, q)
412
+ sage: H.monomial_basis()
413
+ Hall algebra with q=q over Univariate Polynomial Ring in q over
414
+ Integer Ring in the monomial basis
415
+ """
416
+ return HallAlgebraMonomials(self.base_ring(), self._q)
417
+
418
+ def __getitem__(self, la):
419
+ """
420
+ Return the basis element indexed by ``la``.
421
+
422
+ EXAMPLES::
423
+
424
+ sage: R.<q> = ZZ[]
425
+ sage: H = HallAlgebra(R, q)
426
+ sage: H[[]]
427
+ H[]
428
+ sage: H[2]
429
+ H[2]
430
+ sage: H[[2]]
431
+ H[2]
432
+ sage: H[2,1]
433
+ H[2, 1]
434
+ sage: H[Partition([2,1])]
435
+ H[2, 1]
436
+ sage: H[(2,1)]
437
+ H[2, 1]
438
+ """
439
+ if la in ZZ:
440
+ return self.monomial(Partition([la]))
441
+ return self.monomial(Partition(la))
442
+
443
+ class Element(CombinatorialFreeModule.Element):
444
+ def scalar(self, y):
445
+ r"""
446
+ Return the scalar product of ``self`` and ``y``.
447
+
448
+ The scalar product is given by
449
+
450
+ .. MATH::
451
+
452
+ (I_{\lambda}, I_{\mu}) = \delta_{\lambda,\mu}
453
+ \frac{1}{a_{\lambda}},
454
+
455
+ where `a_{\lambda}` is given by
456
+
457
+ .. MATH::
458
+
459
+ a_{\lambda} = q^{|\lambda| + 2 n(\lambda)} \prod_k
460
+ \prod_{i=1}^{l_k} (1 - q^{-i})
461
+
462
+ where `n(\lambda) = \sum_i (i - 1) \lambda_i` and
463
+ `\lambda = (1^{l_1}, 2^{l_2}, \ldots, m^{l_m})`.
464
+
465
+ Note that `a_{\lambda}` can be interpreted as the number
466
+ of automorphisms of a certain object in a category
467
+ corresponding to `\lambda`. See Lemma 2.8 in [Sch2006]_
468
+ for details.
469
+
470
+ EXAMPLES::
471
+
472
+ sage: R.<q> = ZZ[]
473
+ sage: H = HallAlgebra(R, q)
474
+ sage: H[1].scalar(H[1])
475
+ 1/(q - 1)
476
+ sage: H[2].scalar(H[2])
477
+ 1/(q^2 - q)
478
+ sage: H[2,1].scalar(H[2,1])
479
+ 1/(q^5 - 2*q^4 + q^3)
480
+ sage: H[1,1,1,1].scalar(H[1,1,1,1])
481
+ 1/(q^16 - q^15 - q^14 + 2*q^11 - q^8 - q^7 + q^6)
482
+ sage: H.an_element().scalar(H.an_element())
483
+ (4*q^2 + 9)/(q^2 - q)
484
+ """
485
+ q = self.parent()._q
486
+ f = lambda la: ~(q**(sum(la) + 2*la.weighted_size())
487
+ * prod(prod((1 - q**-i) for i in range(1,k+1))
488
+ for k in la.to_exp()))
489
+ y = self.parent()(y)
490
+ ret = q.parent().zero()
491
+ for mx, cx in self:
492
+ cy = y.coefficient(mx)
493
+ if cy != 0:
494
+ ret += cx * cy * f(mx)
495
+ return ret
496
+
497
+
498
+ class HallAlgebraMonomials(CombinatorialFreeModule):
499
+ r"""
500
+ The classical Hall algebra given in terms of monomials in the
501
+ `I_{(1^r)}`.
502
+
503
+ We first associate a monomial `I_{(1^{r_1})} I_{(1^{r_2})} \cdots
504
+ I_{(1^{r_k})}` with the composition `(r_1, r_2, \ldots, r_k)`. However
505
+ since `I_{(1^r)}` commutes with `I_{(1^s)}`, the basis is indexed
506
+ by partitions.
507
+
508
+ EXAMPLES:
509
+
510
+ We use the fraction field of `\ZZ[q]` for our initial example::
511
+
512
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
513
+ sage: q = R.gen()
514
+ sage: H = HallAlgebra(R, q)
515
+ sage: I = H.monomial_basis()
516
+
517
+ We check that the basis conversions are mutually inverse::
518
+
519
+ sage: all(H(I(H[p])) == H[p] for i in range(7) for p in Partitions(i))
520
+ True
521
+ sage: all(I(H(I[p])) == I[p] for i in range(7) for p in Partitions(i))
522
+ True
523
+
524
+ Since Laurent polynomials are sufficient, we run the same check with
525
+ the Laurent polynomial ring `\ZZ[q, q^{-1}]`::
526
+
527
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
528
+ sage: H = HallAlgebra(R, q)
529
+ sage: I = H.monomial_basis()
530
+ sage: all(H(I(H[p])) == H[p] for i in range(6) for p in Partitions(i)) # long time
531
+ True
532
+ sage: all(I(H(I[p])) == I[p] for i in range(6) for p in Partitions(i)) # long time
533
+ True
534
+
535
+ We can also convert to the symmetric functions. The natural basis
536
+ corresponds to the Hall-Littlewood basis (up to a renormalization and
537
+ an inversion of the `q` parameter), and this basis corresponds
538
+ to the elementary basis (up to a renormalization)::
539
+
540
+ sage: Sym = SymmetricFunctions(R)
541
+ sage: e = Sym.e()
542
+ sage: e(I[2,1])
543
+ (q^-1)*e[2, 1]
544
+ sage: e(I[4,2,2,1])
545
+ (q^-8)*e[4, 2, 2, 1]
546
+ sage: HLP = Sym.hall_littlewood(q).P()
547
+ sage: H(I[2,1])
548
+ H[2, 1] + (1+q+q^2)*H[1, 1, 1]
549
+ sage: HLP(e[2,1])
550
+ (1+q+q^2)*HLP[1, 1, 1] + HLP[2, 1]
551
+ sage: all( e(H[lam]) == q**-sum([i * x for i, x in enumerate(lam)])
552
+ ....: * e(HLP[lam]).map_coefficients(lambda p: p(q**(-1)))
553
+ ....: for lam in Partitions(4) )
554
+ True
555
+
556
+ We can also do computations using a prime power::
557
+
558
+ sage: H = HallAlgebra(ZZ, 3)
559
+ sage: I = H.monomial_basis()
560
+ sage: i_elt = I[2,1]*I[1,1]; i_elt
561
+ I[2, 1, 1, 1]
562
+ sage: H(i_elt)
563
+ H[4, 1] + 7*H[3, 2] + 37*H[3, 1, 1] + 136*H[2, 2, 1]
564
+ + 1495*H[2, 1, 1, 1] + 62920*H[1, 1, 1, 1, 1]
565
+ """
566
+ def __init__(self, base_ring, q, prefix='I'):
567
+ """
568
+ Initialize ``self``.
569
+
570
+ EXAMPLES::
571
+
572
+ sage: R.<q> = ZZ[]
573
+ sage: I = HallAlgebra(R, q).monomial_basis()
574
+ sage: TestSuite(I).run()
575
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
576
+ sage: q = R.gen()
577
+ sage: I = HallAlgebra(R, q).monomial_basis()
578
+ sage: TestSuite(I).run()
579
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
580
+ sage: I = HallAlgebra(R, q).monomial_basis()
581
+ sage: TestSuite(I).run()
582
+ """
583
+ self._q = q
584
+ try:
585
+ q_inverse = q**-1
586
+ if q_inverse not in base_ring:
587
+ hopf_structure = False
588
+ else:
589
+ hopf_structure = True
590
+ except Exception:
591
+ hopf_structure = False
592
+ if hopf_structure:
593
+ category = HopfAlgebrasWithBasis(base_ring)
594
+ else:
595
+ category = AlgebrasWithBasis(base_ring)
596
+ CombinatorialFreeModule.__init__(self, base_ring, Partitions(),
597
+ prefix=prefix, bracket=False,
598
+ category=category)
599
+
600
+ # Coercions
601
+ if hopf_structure:
602
+ e = SymmetricFunctions(base_ring).e()
603
+ f = lambda la: q ** sum(-((r * (r - 1)) // 2) for r in la)
604
+ M = self.module_morphism(diagonal=f, codomain=e)
605
+ M.register_as_coercion()
606
+ (~M).register_as_coercion()
607
+
608
+ @cached_method
609
+ def _to_natural_on_basis(self, a):
610
+ """
611
+ Return the basis element indexed by ``a`` converted into
612
+ the partition basis.
613
+
614
+ EXAMPLES::
615
+
616
+ sage: R.<q> = ZZ[]
617
+ sage: I = HallAlgebra(R, q).monomial_basis()
618
+ sage: I._to_natural_on_basis(Partition([3]))
619
+ H[1, 1, 1]
620
+ sage: I._to_natural_on_basis(Partition([2,1,1]))
621
+ H[3, 1] + (q+1)*H[2, 2] + (2*q^2+2*q+1)*H[2, 1, 1]
622
+ + (q^5+2*q^4+3*q^3+3*q^2+2*q+1)*H[1, 1, 1, 1]
623
+ """
624
+ H = HallAlgebra(self.base_ring(), self._q)
625
+ return reduce(lambda cur,r: cur * H.monomial(Partition([1]*r)), a, H.one())
626
+
627
+ def _repr_(self):
628
+ """
629
+ Return a string representation of ``self``.
630
+
631
+ EXAMPLES::
632
+
633
+ sage: R.<q> = ZZ[]
634
+ sage: HallAlgebra(R, q).monomial_basis()
635
+ Hall algebra with q=q over Univariate Polynomial Ring in q over
636
+ Integer Ring in the monomial basis
637
+ """
638
+ return "Hall algebra with q={} over {} in the monomial basis".format(self._q, self.base_ring())
639
+
640
+ def one_basis(self):
641
+ """
642
+ Return the index of the basis element `1`.
643
+
644
+ EXAMPLES::
645
+
646
+ sage: R.<q> = ZZ[]
647
+ sage: I = HallAlgebra(R, q).monomial_basis()
648
+ sage: I.one_basis()
649
+ []
650
+ """
651
+ return Partition([])
652
+
653
+ def product_on_basis(self, a, b):
654
+ """
655
+ Return the product of the two basis elements indexed by ``a``
656
+ and ``b``.
657
+
658
+ EXAMPLES::
659
+
660
+ sage: R.<q> = ZZ[]
661
+ sage: I = HallAlgebra(R, q).monomial_basis()
662
+ sage: I.product_on_basis(Partition([4,2,1]), Partition([3,2,1]))
663
+ I[4, 3, 2, 2, 1, 1]
664
+ """
665
+ return self.monomial(Partition(sorted(list(a) + list(b), reverse=True)))
666
+
667
+ def coproduct_on_basis(self, a):
668
+ """
669
+ Return the coproduct of the basis element indexed by ``a``.
670
+
671
+ EXAMPLES::
672
+
673
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
674
+ sage: q = R.gen()
675
+ sage: I = HallAlgebra(R, q).monomial_basis()
676
+ sage: I.coproduct_on_basis(Partition([1]))
677
+ I[] # I[1] + I[1] # I[]
678
+ sage: I.coproduct_on_basis(Partition([2]))
679
+ I[] # I[2] + 1/q*I[1] # I[1] + I[2] # I[]
680
+ sage: I.coproduct_on_basis(Partition([2,1]))
681
+ I[] # I[2, 1] + 1/q*I[1] # I[1, 1] + I[1] # I[2]
682
+ + 1/q*I[1, 1] # I[1] + I[2] # I[1] + I[2, 1] # I[]
683
+
684
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
685
+ sage: I = HallAlgebra(R, q).monomial_basis()
686
+ sage: I.coproduct_on_basis(Partition([2,1]))
687
+ I[] # I[2, 1] + (q^-1)*I[1] # I[1, 1] + I[1] # I[2]
688
+ + (q^-1)*I[1, 1] # I[1] + I[2] # I[1] + I[2, 1] # I[]
689
+ """
690
+ S = self.tensor_square()
691
+ return S.prod(S.sum_of_terms([((Partition([r]), Partition([n-r])), self._q**(-r*(n-r)))
692
+ for r in range(n+1)], distinct=True) for n in a)
693
+
694
+ def antipode_on_basis(self, a):
695
+ """
696
+ Return the antipode of the basis element indexed by ``a``.
697
+
698
+ EXAMPLES::
699
+
700
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
701
+ sage: q = R.gen()
702
+ sage: I = HallAlgebra(R, q).monomial_basis()
703
+ sage: I.antipode_on_basis(Partition([1]))
704
+ -I[1]
705
+ sage: I.antipode_on_basis(Partition([2]))
706
+ 1/q*I[1, 1] - I[2]
707
+ sage: I.antipode_on_basis(Partition([2,1]))
708
+ -1/q*I[1, 1, 1] + I[2, 1]
709
+
710
+ sage: R.<q> = LaurentPolynomialRing(ZZ)
711
+ sage: I = HallAlgebra(R, q).monomial_basis()
712
+ sage: I.antipode_on_basis(Partition([2,1]))
713
+ -(q^-1)*I[1, 1, 1] + I[2, 1]
714
+ """
715
+ H = HallAlgebra(self.base_ring(), self._q)
716
+ cur = self.one()
717
+ for r in a:
718
+ q = (-1) ** r * self._q ** (-(r * (r - 1)) // 2)
719
+ cur *= self(H._from_dict({p: q for p in Partitions(r)}))
720
+ return cur
721
+
722
+ def counit(self, x):
723
+ """
724
+ Return the counit of the element ``x``.
725
+
726
+ EXAMPLES::
727
+
728
+ sage: R = PolynomialRing(ZZ, 'q').fraction_field()
729
+ sage: q = R.gen()
730
+ sage: I = HallAlgebra(R, q).monomial_basis()
731
+ sage: I.counit(I.an_element())
732
+ 2
733
+ """
734
+ return x.coefficient(self.one_basis())
735
+
736
+ def __getitem__(self, a):
737
+ """
738
+ Return the basis element indexed by ``a``.
739
+
740
+ EXAMPLES::
741
+
742
+ sage: R.<q> = ZZ[]
743
+ sage: I = HallAlgebra(R, q).monomial_basis()
744
+ sage: I[3,1,1] + 3*I[1,1]
745
+ 3*I[1, 1] + I[3, 1, 1]
746
+ sage: I[Partition([3,2,2])]
747
+ I[3, 2, 2]
748
+ sage: I[2]
749
+ I[2]
750
+ sage: I[[2]]
751
+ I[2]
752
+ sage: I[[]]
753
+ I[]
754
+ """
755
+ if a in ZZ:
756
+ return self.monomial(Partition([a]))
757
+ return self.monomial(Partition(a))
758
+
759
+ class Element(CombinatorialFreeModule.Element):
760
+ def scalar(self, y):
761
+ r"""
762
+ Return the scalar product of ``self`` and ``y``.
763
+
764
+ The scalar product is computed by converting into the
765
+ natural basis.
766
+
767
+ EXAMPLES::
768
+
769
+ sage: R.<q> = ZZ[]
770
+ sage: I = HallAlgebra(R, q).monomial_basis()
771
+ sage: I[1].scalar(I[1])
772
+ 1/(q - 1)
773
+ sage: I[2].scalar(I[2])
774
+ 1/(q^4 - q^3 - q^2 + q)
775
+ sage: I[2,1].scalar(I[2,1])
776
+ (2*q + 1)/(q^6 - 2*q^5 + 2*q^3 - q^2)
777
+ sage: I[1,1,1,1].scalar(I[1,1,1,1])
778
+ 24/(q^4 - 4*q^3 + 6*q^2 - 4*q + 1)
779
+ sage: I.an_element().scalar(I.an_element())
780
+ (4*q^4 - 4*q^2 + 9)/(q^4 - q^3 - q^2 + q)
781
+ """
782
+ H = HallAlgebra(self.parent().base_ring(), self.parent()._q)
783
+ return H(self).scalar(H(y))