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,608 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Q-Systems
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2013-10-08): Initial version
9
+ - Travis Scrimshaw (2017-12-08): Added twisted Q-systems
10
+ """
11
+
12
+ #*****************************************************************************
13
+ # Copyright (C) 2013,2017 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
+ # http://www.gnu.org/licenses/
20
+ #*****************************************************************************
21
+
22
+ import itertools
23
+ from sage.misc.cachefunc import cached_method
24
+ from sage.misc.misc_c import prod
25
+
26
+ from sage.categories.algebras import Algebras
27
+ from sage.rings.integer_ring import ZZ
28
+ from sage.rings.infinity import infinity
29
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
30
+ from sage.sets.family import Family
31
+ from sage.combinat.free_module import CombinatorialFreeModule
32
+ from sage.monoids.indexed_free_monoid import IndexedFreeAbelianMonoid
33
+ from sage.combinat.root_system.cartan_type import CartanType
34
+
35
+
36
+ class QSystem(CombinatorialFreeModule):
37
+ r"""
38
+ A Q-system.
39
+
40
+ Let `\mathfrak{g}` be a tamely-laced symmetrizable Kac-Moody algebra
41
+ with index set `I` and Cartan matrix `(C_{ab})_{a,b \in I}` over a
42
+ field `k`. Follow the presentation given in [HKOTY1999]_, an
43
+ unrestricted Q-system is a `k`-algebra in infinitely many variables
44
+ `Q^{(a)}_m`, where `a \in I` and `m \in \ZZ_{>0}`, that satisfies
45
+ the relations
46
+
47
+ .. MATH::
48
+
49
+ \left(Q^{(a)}_m\right)^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1} +
50
+ \prod_{b \sim a} \prod_{k=0}^{-C_{ab} - 1}
51
+ Q^{(b)}_{\left\lfloor \frac{m C_{ba} - k}{C_{ab}} \right\rfloor},
52
+
53
+ with `Q^{(a)}_0 := 1`. Q-systems can be considered as T-systems where
54
+ we forget the spectral parameter `u` and for `\mathfrak{g}` of finite
55
+ type, have a solution given by the characters of Kirillov-Reshetikhin
56
+ modules (again without the spectral parameter) for an affine Kac-Moody
57
+ algebra `\widehat{\mathfrak{g}}` with `\mathfrak{g}` as its classical
58
+ subalgebra. See [KNS2011]_ for more information.
59
+
60
+ Q-systems have a natural bases given by polynomials of the
61
+ fundamental representations `Q^{(a)}_1`, for `a \in I`. As such, we
62
+ consider the Q-system as generated by `\{ Q^{(a)}_1 \}_{a \in I}`.
63
+
64
+ There is also a level `\ell` restricted Q-system (with unit boundary
65
+ condition) given by setting `Q_{d_a \ell}^{(a)} = 1`, where `d_a`
66
+ are the entries of the symmetrizing matrix for the dual type of
67
+ `\mathfrak{g}`.
68
+
69
+ Similarly, for twisted affine types (we omit type `A_{2n}^{(2)}`),
70
+ we can define the *twisted Q-system* by using the relation:
71
+
72
+ .. MATH::
73
+
74
+ (Q^{(a)}_{m})^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1}
75
+ + \prod_{b \neq a} (Q^{(b)}_{m})^{-C_{ba}}.
76
+
77
+ See [Wil2013]_ for more information.
78
+
79
+ EXAMPLES:
80
+
81
+ We begin by constructing a Q-system and doing some basic computations
82
+ in type `A_4`::
83
+
84
+ sage: Q = QSystem(QQ, ['A', 4])
85
+ sage: Q.Q(3,1)
86
+ Q^(3)[1]
87
+ sage: Q.Q(1,2)
88
+ Q^(1)[1]^2 - Q^(2)[1]
89
+ sage: Q.Q(3,3)
90
+ -Q^(1)[1]*Q^(3)[1] + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2
91
+ - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
92
+ sage: x = Q.Q(1,1) + Q.Q(2,1); x
93
+ Q^(1)[1] + Q^(2)[1]
94
+ sage: x * x
95
+ Q^(1)[1]^2 + 2*Q^(1)[1]*Q^(2)[1] + Q^(2)[1]^2
96
+
97
+ Next we do some basic computations in type `C_4`::
98
+
99
+ sage: Q = QSystem(QQ, ['C', 4])
100
+ sage: Q.Q(4,1)
101
+ Q^(4)[1]
102
+ sage: Q.Q(1,2)
103
+ Q^(1)[1]^2 - Q^(2)[1]
104
+ sage: Q.Q(2,3)
105
+ Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1]
106
+ + Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2
107
+ sage: Q.Q(3,3)
108
+ Q^(1)[1]*Q^(4)[1]^2 - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
109
+
110
+ We compare that with the twisted Q-system of type `A_7^{(2)}`::
111
+
112
+ sage: Q = QSystem(QQ, ['A',7,2], twisted=True)
113
+ sage: Q.Q(4,1)
114
+ Q^(4)[1]
115
+ sage: Q.Q(1,2)
116
+ Q^(1)[1]^2 - Q^(2)[1]
117
+ sage: Q.Q(2,3)
118
+ Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1]
119
+ + Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2
120
+ sage: Q.Q(3,3)
121
+ -Q^(1)[1]*Q^(3)[1]^2 + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2*Q^(3)[1]
122
+ - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
123
+
124
+ REFERENCES:
125
+
126
+ - [HKOTY1999]_
127
+ - [KNS2011]_
128
+ """
129
+ @staticmethod
130
+ def __classcall__(cls, base_ring, cartan_type, level=None, twisted=False):
131
+ """
132
+ Normalize arguments to ensure a unique representation.
133
+
134
+ EXAMPLES::
135
+
136
+ sage: Q1 = QSystem(QQ, ['A',4])
137
+ sage: Q2 = QSystem(QQ, 'A4')
138
+ sage: Q1 is Q2
139
+ True
140
+
141
+ Twisted Q-systems are different from untwisted Q-systems::
142
+
143
+ sage: Q1 = QSystem(QQ, ['E',6,2], twisted=True)
144
+ sage: Q2 = QSystem(QQ, ['E',6,2])
145
+ sage: Q1 is Q2
146
+ False
147
+ """
148
+ cartan_type = CartanType(cartan_type)
149
+ if not is_tamely_laced(cartan_type):
150
+ raise ValueError("the Cartan type is not tamely-laced")
151
+ if twisted and not cartan_type.is_affine() and not cartan_type.is_untwisted_affine():
152
+ raise ValueError("the Cartan type must be of twisted type")
153
+ return super().__classcall__(cls, base_ring, cartan_type, level, twisted)
154
+
155
+ def __init__(self, base_ring, cartan_type, level, twisted):
156
+ """
157
+ Initialize ``self``.
158
+
159
+ EXAMPLES::
160
+
161
+ sage: Q = QSystem(QQ, ['A',2])
162
+ sage: TestSuite(Q).run()
163
+
164
+ sage: Q = QSystem(QQ, ['E',6,2], twisted=True)
165
+ sage: TestSuite(Q).run()
166
+ """
167
+ self._cartan_type = cartan_type
168
+ self._level = level
169
+ self._twisted = twisted
170
+ indices = tuple(itertools.product(cartan_type.index_set(), [1]))
171
+ basis = IndexedFreeAbelianMonoid(indices, prefix='Q', bracket=False)
172
+ # This is used to do the reductions
173
+ if self._twisted:
174
+ self._cm = cartan_type.classical().cartan_matrix()
175
+ else:
176
+ self._cm = cartan_type.cartan_matrix()
177
+ self._Irev = {ind: pos for pos,ind in enumerate(self._cm.index_set())}
178
+ self._poly = PolynomialRing(ZZ, ['q'+str(i) for i in self._cm.index_set()])
179
+
180
+ category = Algebras(base_ring).Commutative().WithBasis()
181
+ CombinatorialFreeModule.__init__(self, base_ring, basis,
182
+ prefix='Q', category=category)
183
+
184
+ def _repr_(self):
185
+ r"""
186
+ Return a string representation of ``self``.
187
+
188
+ EXAMPLES::
189
+
190
+ sage: QSystem(QQ, ['A',4])
191
+ Q-system of type ['A', 4] over Rational Field
192
+
193
+ sage: QSystem(QQ, ['A',7,2], twisted=True)
194
+ Twisted Q-system of type ['B', 4, 1]^* over Rational Field
195
+ """
196
+ if self._level is not None:
197
+ res = "Restricted level {} ".format(self._level)
198
+ else:
199
+ res = ''
200
+ if self._twisted:
201
+ res += "Twisted "
202
+ return "{}Q-system of type {} over {}".format(res, self._cartan_type, self.base_ring())
203
+
204
+ def _repr_term(self, t):
205
+ """
206
+ Return a string representation of the basis element indexed by ``t``.
207
+
208
+ EXAMPLES::
209
+
210
+ sage: Q = QSystem(QQ, ['A',4])
211
+ sage: I = Q._indices
212
+ sage: Q._repr_term( I.gen((1,1)) * I.gen((4,1)) )
213
+ 'Q^(1)[1]*Q^(4)[1]'
214
+ """
215
+ if len(t) == 0:
216
+ return '1'
217
+
218
+ def repr_gen(x):
219
+ ret = 'Q^({})[{}]'.format(*(x[0]))
220
+ if x[1] > 1:
221
+ ret += '^{}'.format(x[1])
222
+ return ret
223
+ return '*'.join(repr_gen(x) for x in t._sorted_items())
224
+
225
+ def _latex_term(self, t):
226
+ r"""
227
+ Return a `\LaTeX` representation of the basis element indexed
228
+ by ``t``.
229
+
230
+ EXAMPLES::
231
+
232
+ sage: Q = QSystem(QQ, ['A',4])
233
+ sage: I = Q._indices
234
+ sage: Q._latex_term( I.gen((3,1)) * I.gen((4,1)) )
235
+ 'Q^{(3)}_{1} Q^{(4)}_{1}'
236
+ """
237
+ if len(t) == 0:
238
+ return '1'
239
+
240
+ def repr_gen(x):
241
+ ret = 'Q^{{({})}}_{{{}}}'.format(*(x[0]))
242
+ if x[1] > 1:
243
+ ret = '\\bigl(' + ret + '\\bigr)^{{{}}}'.format(x[1])
244
+ return ret
245
+ return ' '.join(repr_gen(x) for x in t._sorted_items())
246
+
247
+ def _ascii_art_term(self, t):
248
+ """
249
+ Return an ascii art representation of the term indexed by ``t``.
250
+
251
+ TESTS::
252
+
253
+ sage: Q = QSystem(QQ, ['A',4])
254
+ sage: ascii_art(Q.an_element())
255
+ 2 2 3
256
+ (1) ( (1)) ( (2)) ( (3)) (2)
257
+ 1 + 2*Q1 + (Q1 ) *(Q1 ) *(Q1 ) + 3*Q1
258
+ """
259
+ from sage.typeset.ascii_art import AsciiArt
260
+ if t == self.one_basis():
261
+ return AsciiArt(["1"])
262
+ ret = AsciiArt("")
263
+ first = True
264
+ for k, exp in t._sorted_items():
265
+ if not first:
266
+ ret += AsciiArt(['*'], baseline=0)
267
+ else:
268
+ first = False
269
+ a, m = k
270
+ var = AsciiArt([" ({})".format(a),
271
+ "Q{}".format(m)],
272
+ baseline=0)
273
+ if exp > 1:
274
+ var = (AsciiArt(['(', '('], baseline=0) + var
275
+ + AsciiArt([')', ')'], baseline=0))
276
+ var = AsciiArt([" " * len(var) + str(exp)], baseline=-1) * var
277
+ ret += var
278
+ return ret
279
+
280
+ def _unicode_art_term(self, t):
281
+ r"""
282
+ Return a unicode art representation of the term indexed by ``t``.
283
+
284
+ TESTS::
285
+
286
+ sage: Q = QSystem(QQ, ['A',4])
287
+ sage: unicode_art(Q.an_element())
288
+ 1 + 2*Q₁⁽¹⁾ + (Q₁⁽¹⁾)²(Q₁⁽²⁾)²(Q₁⁽³⁾)³ + 3*Q₁⁽²⁾
289
+ """
290
+ from sage.typeset.unicode_art import UnicodeArt, unicode_subscript, unicode_superscript
291
+ if t == self.one_basis():
292
+ return UnicodeArt(["1"])
293
+
294
+ ret = UnicodeArt("")
295
+ for k, exp in t._sorted_items():
296
+ a,m = k
297
+ var = UnicodeArt(["Q" + unicode_subscript(m) + '⁽' + unicode_superscript(a) + '⁾'], baseline=0)
298
+ if exp > 1:
299
+ var = (UnicodeArt(['('], baseline=0) + var
300
+ + UnicodeArt([')' + unicode_superscript(exp)], baseline=0))
301
+ ret += var
302
+ return ret
303
+
304
+ def cartan_type(self):
305
+ """
306
+ Return the Cartan type of ``self``.
307
+
308
+ EXAMPLES::
309
+
310
+ sage: Q = QSystem(QQ, ['A',4])
311
+ sage: Q.cartan_type()
312
+ ['A', 4]
313
+
314
+ sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
315
+ sage: Q.cartan_type()
316
+ ['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1}
317
+ """
318
+ return self._cartan_type
319
+
320
+ def index_set(self):
321
+ """
322
+ Return the index set of ``self``.
323
+
324
+ EXAMPLES::
325
+
326
+ sage: Q = QSystem(QQ, ['A',4])
327
+ sage: Q.index_set()
328
+ (1, 2, 3, 4)
329
+
330
+ sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
331
+ sage: Q.index_set()
332
+ (1, 2)
333
+ """
334
+ return self._cm.index_set()
335
+
336
+ def level(self):
337
+ """
338
+ Return the restriction level of ``self`` or ``None`` if
339
+ the system is unrestricted.
340
+
341
+ EXAMPLES::
342
+
343
+ sage: Q = QSystem(QQ, ['A',4])
344
+ sage: Q.level()
345
+
346
+ sage: Q = QSystem(QQ, ['A',4], 5)
347
+ sage: Q.level()
348
+ 5
349
+ """
350
+ return self._level
351
+
352
+ @cached_method
353
+ def one_basis(self):
354
+ """
355
+ Return the basis element indexing `1`.
356
+
357
+ EXAMPLES::
358
+
359
+ sage: Q = QSystem(QQ, ['A',4])
360
+ sage: Q.one_basis()
361
+ 1
362
+ sage: Q.one_basis().parent() is Q._indices
363
+ True
364
+ """
365
+ return self._indices.one()
366
+
367
+ @cached_method
368
+ def algebra_generators(self):
369
+ """
370
+ Return the algebra generators of ``self``.
371
+
372
+ EXAMPLES::
373
+
374
+ sage: Q = QSystem(QQ, ['A',4])
375
+ sage: Q.algebra_generators()
376
+ Finite family {1: Q^(1)[1], 2: Q^(2)[1], 3: Q^(3)[1], 4: Q^(4)[1]}
377
+
378
+ sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
379
+ sage: Q.algebra_generators()
380
+ Finite family {1: Q^(1)[1], 2: Q^(2)[1]}
381
+ """
382
+ I = self._cm.index_set()
383
+ d = {a: self.Q(a, 1) for a in I}
384
+ return Family(I, d.__getitem__)
385
+
386
+ def gens(self) -> tuple:
387
+ """
388
+ Return the generators of ``self``.
389
+
390
+ EXAMPLES::
391
+
392
+ sage: Q = QSystem(QQ, ['A',4])
393
+ sage: Q.gens()
394
+ (Q^(1)[1], Q^(2)[1], Q^(3)[1], Q^(4)[1])
395
+ """
396
+ return tuple(self.algebra_generators())
397
+
398
+ def dimension(self):
399
+ r"""
400
+ Return the dimension of ``self``, which is `\infty`.
401
+
402
+ EXAMPLES::
403
+
404
+ sage: F = QSystem(QQ, ['A',4])
405
+ sage: F.dimension()
406
+ +Infinity
407
+ """
408
+ return infinity
409
+
410
+ def Q(self, a, m):
411
+ r"""
412
+ Return the generator `Q^{(a)}_m` of ``self``.
413
+
414
+ EXAMPLES::
415
+
416
+ sage: Q = QSystem(QQ, ['A', 8])
417
+ sage: Q.Q(2, 1)
418
+ Q^(2)[1]
419
+ sage: Q.Q(6, 2)
420
+ -Q^(5)[1]*Q^(7)[1] + Q^(6)[1]^2
421
+ sage: Q.Q(7, 3)
422
+ -Q^(5)[1]*Q^(7)[1] + Q^(5)[1]*Q^(8)[1]^2 + Q^(6)[1]^2
423
+ - 2*Q^(6)[1]*Q^(7)[1]*Q^(8)[1] + Q^(7)[1]^3
424
+ sage: Q.Q(1, 0)
425
+ 1
426
+
427
+ Twisted Q-system::
428
+
429
+ sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
430
+ sage: Q.Q(1,2)
431
+ Q^(1)[1]^2 - Q^(2)[1]
432
+ sage: Q.Q(2,2)
433
+ -Q^(1)[1]^3 + Q^(2)[1]^2
434
+ sage: Q.Q(2,3)
435
+ 3*Q^(1)[1]^4 - 2*Q^(1)[1]^3*Q^(2)[1] - 3*Q^(1)[1]^2*Q^(2)[1]
436
+ + Q^(2)[1]^2 + Q^(2)[1]^3
437
+ sage: Q.Q(1,4)
438
+ -2*Q^(1)[1]^2 + 2*Q^(1)[1]^3 + Q^(1)[1]^4
439
+ - 3*Q^(1)[1]^2*Q^(2)[1] + Q^(2)[1] + Q^(2)[1]^2
440
+ """
441
+ if a not in self._cartan_type.index_set():
442
+ raise ValueError("a is not in the index set")
443
+ if m == 0:
444
+ return self.one()
445
+ if self._level:
446
+ t = self._cartan_type.dual().cartan_matrix().symmetrizer()
447
+ if m == t[a] * self._level:
448
+ return self.one()
449
+ if m == 1:
450
+ return self.monomial(self._indices.gen((a,1)))
451
+ #if self._cartan_type.type() == 'A' and self._level is None:
452
+ # return self._jacobi_trudy(a, m)
453
+ I = self._cm.index_set()
454
+ p = self._Q_poly(a, m)
455
+ return p.subs({g: self.Q(I[i], 1) for i,g in enumerate(self._poly.gens())})
456
+
457
+ @cached_method
458
+ def _Q_poly(self, a, m):
459
+ r"""
460
+ Return the element `Q^{(a)}_m` as a polynomial.
461
+
462
+ We start with the relation
463
+
464
+ .. MATH::
465
+
466
+ (Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2} + \mathcal{Q}_{a,m-1},
467
+
468
+ which implies
469
+
470
+ .. MATH::
471
+
472
+ Q^{(a)}_m = \frac{Q^{(a)}_{m-1}^2 - \mathcal{Q}_{a,m-1}}{
473
+ Q^{(a)}_{m-2}}.
474
+
475
+ This becomes our relation used for reducing the Q-system to the
476
+ fundamental representations.
477
+
478
+ For twisted Q-systems, we use
479
+
480
+ .. MATH::
481
+
482
+ (Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2}
483
+ + \prod_{b \neq a} (Q^{(b)}_{m-1})^{-A_{ba}}.
484
+
485
+ .. NOTE::
486
+
487
+ This helper method is defined in order to use the
488
+ division implemented in polynomial rings.
489
+
490
+ EXAMPLES::
491
+
492
+ sage: Q = QSystem(QQ, ['A',8])
493
+ sage: Q._Q_poly(1, 2)
494
+ q1^2 - q2
495
+ sage: Q._Q_poly(3, 2)
496
+ q3^2 - q2*q4
497
+ sage: Q._Q_poly(6, 3)
498
+ q6^3 - 2*q5*q6*q7 + q4*q7^2 + q5^2*q8 - q4*q6*q8
499
+
500
+ Twisted types::
501
+
502
+ sage: Q = QSystem(QQ, ['E',6,2], twisted=True)
503
+ sage: Q._Q_poly(1,2)
504
+ q1^2 - q2
505
+ sage: Q._Q_poly(2,2)
506
+ q2^2 - q1*q3
507
+ sage: Q._Q_poly(3,2)
508
+ -q2^2*q4 + q3^2
509
+ sage: Q._Q_poly(4,2)
510
+ q4^2 - q3
511
+ sage: Q._Q_poly(3,3)
512
+ 2*q1*q2^2*q4^2 - q1^2*q3*q4^2 + q2^4 - 2*q1*q2^2*q3
513
+ + q1^2*q3^2 - 2*q2^2*q3*q4 + q3^3
514
+
515
+ sage: Q = QSystem(QQ, ['D',4,3], twisted=True)
516
+ sage: Q._Q_poly(1,2)
517
+ q1^2 - q2
518
+ sage: Q._Q_poly(2,2)
519
+ -q1^3 + q2^2
520
+ sage: Q._Q_poly(1,3)
521
+ q1^3 + q1^2 - 2*q1*q2
522
+ sage: Q._Q_poly(2,3)
523
+ 3*q1^4 - 2*q1^3*q2 - 3*q1^2*q2 + q2^3 + q2^2
524
+ """
525
+ if m == 0 or m == self._level:
526
+ return self._poly.one()
527
+ if m == 1:
528
+ return self._poly.gen(self._Irev[a])
529
+
530
+ cm = self._cm
531
+ m -= 1 # So we don't have to do it everywhere
532
+
533
+ cur = self._Q_poly(a, m) ** 2
534
+ if self._twisted:
535
+ ret = prod(self._Q_poly(b, m) ** -cm[self._Irev[b],self._Irev[a]]
536
+ for b in self._cm.dynkin_diagram().neighbors(a))
537
+ else:
538
+ ret = self._poly.one()
539
+ i = self._Irev[a]
540
+ for b in self._cm.dynkin_diagram().neighbors(a):
541
+ j = self._Irev[b]
542
+ for k in range(-cm[i,j]):
543
+ ret *= self._Q_poly(b, (m * cm[j,i] - k) // cm[i,j])
544
+ cur -= ret
545
+ if m > 1:
546
+ cur //= self._Q_poly(a, m-1)
547
+ return cur
548
+
549
+ class Element(CombinatorialFreeModule.Element):
550
+ """
551
+ An element of a Q-system.
552
+ """
553
+ def _mul_(self, x):
554
+ """
555
+ Return the product of ``self`` and ``x``.
556
+
557
+ EXAMPLES::
558
+
559
+ sage: Q = QSystem(QQ, ['A',8])
560
+ sage: x = Q.Q(1, 2)
561
+ sage: y = Q.Q(3, 2)
562
+ sage: x * y
563
+ -Q^(1)[1]^2*Q^(2)[1]*Q^(4)[1] + Q^(1)[1]^2*Q^(3)[1]^2
564
+ + Q^(2)[1]^2*Q^(4)[1] - Q^(2)[1]*Q^(3)[1]^2
565
+ """
566
+ return self.parent().sum_of_terms((tl*tr, cl*cr)
567
+ for tl,cl in self for tr,cr in x)
568
+
569
+
570
+ def is_tamely_laced(ct):
571
+ r"""
572
+ Check if the Cartan type ``ct`` is tamely-laced.
573
+
574
+ A (symmetrizable) Cartan type with index set `I` is *tamely-laced*
575
+ if `A_{ij} < -1` implies `d_i = -A_{ji} = 1` for all `i,j \in I`,
576
+ where `(d_i)_{i \in I}` is the diagonal matrix symmetrizing the
577
+ Cartan matrix `(A_{ij})_{i,j \in I}`.
578
+
579
+ EXAMPLES::
580
+
581
+ sage: from sage.algebras.q_system import is_tamely_laced
582
+ sage: all(is_tamely_laced(ct)
583
+ ....: for ct in CartanType.samples(crystallographic=True, finite=True))
584
+ True
585
+ sage: for ct in CartanType.samples(crystallographic=True, affine=True):
586
+ ....: if not is_tamely_laced(ct):
587
+ ....: print(ct)
588
+ ['A', 1, 1]
589
+ ['BC', 1, 2]
590
+ ['BC', 5, 2]
591
+ ['BC', 1, 2]^*
592
+ ['BC', 5, 2]^*
593
+ sage: cm = CartanMatrix([[2,-1,0,0],[-3,2,-2,-2],[0,-1,2,-1],[0,-1,-1,2]])
594
+ sage: is_tamely_laced(cm)
595
+ True
596
+ """
597
+ if ct.is_finite():
598
+ return True
599
+
600
+ if ct.is_affine():
601
+ return not (ct is CartanType(['A',1,1]) or
602
+ (ct.type() == 'BC' or ct.dual().type() == 'BC'))
603
+
604
+ cm = ct.cartan_matrix()
605
+ d = cm.symmetrizer()
606
+ I = ct.index_set()
607
+ return all(-cm[j,i] == 1 and d[i] == 1
608
+ for i in I for j in I if cm[i,j] < -1)