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,673 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.groups sage.modules
3
+ r"""
4
+ `q`-Commuting Polynomials
5
+
6
+ AUTHORS:
7
+
8
+ - Travis Scrimshaw (2022-08-23): Initial version
9
+ - Travis Scrimshaw (2023-02-10): Added Laurent polynomials
10
+ """
11
+
12
+ # ****************************************************************************
13
+ # Copyright (C) 2022-2023 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.misc.latex import latex
24
+ from sage.sets.family import Family
25
+ from sage.rings.infinity import infinity
26
+ from sage.rings.integer_ring import ZZ
27
+ from sage.categories.algebras import Algebras
28
+ from sage.categories.commutative_rings import CommutativeRings
29
+ from sage.combinat.free_module import CombinatorialFreeModule
30
+ from sage.monoids.free_abelian_monoid import FreeAbelianMonoid
31
+ from sage.groups.free_group import FreeGroup
32
+ from sage.modules.free_module import FreeModule
33
+ from sage.matrix.constructor import matrix
34
+ from sage.structure.element import Matrix
35
+
36
+
37
+ class qCommutingPolynomials_generic(CombinatorialFreeModule):
38
+ r"""
39
+ Base class for algebra of `q`-commuting (Laurent, etc.) polynomials.
40
+
41
+ Let `R` be a commutative ring, and fix an element `q \in R`. Let
42
+ `B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
43
+ index set `I`. Let `R[I]_{q,B}` denote the polynomial ring in the variables
44
+ `I` such that we have the `q`-*commuting* relation for `x, y \in I`:
45
+
46
+ .. MATH::
47
+
48
+ y x = q^{B_{xy}} \cdot x y.
49
+
50
+ This is a graded `R`-algebra with a natural basis given by monomials
51
+ written in increasing order with respect to some total order on `I`.
52
+ """
53
+ @staticmethod
54
+ def __classcall__(cls, q, n=None, B=None, base_ring=None, names=None):
55
+ r"""
56
+ Normalize input to ensure a unique representation.
57
+
58
+ EXAMPLES::
59
+
60
+ sage: q = ZZ['q'].fraction_field().gen()
61
+ sage: R1.<x,y,z> = algebras.qCommutingPolynomials(q)
62
+ sage: R2 = algebras.qCommutingPolynomials(q, base_ring=q.parent(), names='x,y,z')
63
+ sage: R3 = algebras.qCommutingPolynomials(q, names=['x', 'y', 'z'])
64
+ sage: R1 is R2 is R3
65
+ True
66
+ """
67
+ if base_ring is not None:
68
+ q = base_ring(q)
69
+
70
+ if B is None and isinstance(n, Matrix):
71
+ n, B = B, n
72
+
73
+ if names is None:
74
+ raise ValueError("the names of the variables must be given")
75
+ from sage.structure.category_object import normalize_names
76
+ if n is None:
77
+ if isinstance(names, str):
78
+ n = names.count(',') + 1
79
+ else:
80
+ n = len(names)
81
+ names = normalize_names(n, names)
82
+ n = len(names)
83
+ if B is None:
84
+ B = matrix.zero(ZZ, n)
85
+ for i in range(n):
86
+ for j in range(i+1, n):
87
+ B[i, j] = 1
88
+ B[j, i] = -1
89
+ B.set_immutable()
90
+ else:
91
+ if not B.is_skew_symmetric():
92
+ raise ValueError("the matrix must be skew symmetric")
93
+ B = B.change_ring(ZZ)
94
+ B.set_immutable()
95
+ return super().__classcall__(cls, q=q, B=B, names=names)
96
+
97
+ def __init__(self, q, B, indices, names):
98
+ r"""
99
+ Initialize ``self``.
100
+
101
+ EXAMPLES::
102
+
103
+ sage: q = ZZ['q'].fraction_field().gen()
104
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
105
+ sage: TestSuite(R).run()
106
+ """
107
+ self._q = q
108
+ self._B = B
109
+ base_ring = q.parent()
110
+ if base_ring not in CommutativeRings():
111
+ raise ValueError("the base ring must be a commutative ring")
112
+ category = Algebras(base_ring).WithBasis().Graded()
113
+ CombinatorialFreeModule.__init__(self, base_ring, indices,
114
+ bracket=False, prefix='',
115
+ sorting_key=qCommutingPolynomials_generic._term_key,
116
+ names=names, category=category)
117
+
118
+ @staticmethod
119
+ def _term_key(x):
120
+ r"""
121
+ Compute a key for ``x`` for comparisons.
122
+
123
+ EXAMPLES::
124
+
125
+ sage: q = ZZ['q'].fraction_field().gen()
126
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
127
+ sage: elt = (x*y^3*z^2).leading_support()
128
+ sage: R._term_key(elt)
129
+ (6, [2, 3, 1])
130
+ """
131
+ L = x.list()
132
+ L.reverse()
133
+ return (sum(L), L)
134
+
135
+ def gen(self, i):
136
+ r"""
137
+ Return the ``i``-generator of ``self``.
138
+
139
+ EXAMPLES::
140
+
141
+ sage: q = ZZ['q'].fraction_field().gen()
142
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
143
+ sage: R.gen(0)
144
+ x
145
+ sage: R.gen(2)
146
+ z
147
+ """
148
+ return self.monomial(self._indices.gen(i))
149
+
150
+ @cached_method
151
+ def gens(self) -> tuple:
152
+ r"""
153
+ Return the generators of ``self``.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: q = ZZ['q'].fraction_field().gen()
158
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
159
+ sage: R.gens()
160
+ (x, y, z)
161
+ """
162
+ return tuple([self.monomial(g) for g in self._indices.gens()])
163
+
164
+ @cached_method
165
+ def algebra_generators(self):
166
+ r"""
167
+ Return the algebra generators of ``self``.
168
+
169
+ EXAMPLES::
170
+
171
+ sage: q = ZZ['q'].fraction_field().gen()
172
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
173
+ sage: R.algebra_generators()
174
+ Finite family {'x': x, 'y': y, 'z': z}
175
+ """
176
+ d = {v: self.gen(i) for i, v in enumerate(self.variable_names())}
177
+ return Family(self.variable_names(), d.__getitem__, name='generator')
178
+
179
+ def degree_on_basis(self, m):
180
+ r"""
181
+ Return the degree of the monomial index by ``m``.
182
+
183
+ EXAMPLES::
184
+
185
+ sage: q = ZZ['q'].fraction_field().gen()
186
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
187
+ sage: R.degree_on_basis(R.one_basis())
188
+ 0
189
+ sage: f = (x + y)^3 + z^3
190
+ sage: f.degree()
191
+ 3
192
+ """
193
+ return sum(m.list())
194
+
195
+ def dimension(self):
196
+ r"""
197
+ Return the dimension of ``self``, which is `\infty`.
198
+
199
+ EXAMPLES::
200
+
201
+ sage: q = ZZ['q'].fraction_field().gen()
202
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
203
+ sage: R.dimension()
204
+ +Infinity
205
+ """
206
+ return infinity
207
+
208
+ def q(self):
209
+ """
210
+ Return the parameter `q`.
211
+
212
+ EXAMPLES::
213
+
214
+ sage: q = ZZ['q'].fraction_field().gen()
215
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
216
+ sage: R.q() == q
217
+ True
218
+ """
219
+ return self._q
220
+
221
+
222
+ class qCommutingPolynomials(qCommutingPolynomials_generic):
223
+ r"""
224
+ The algebra of `q`-commuting polynomials.
225
+
226
+ Let `R` be a commutative ring, and fix an element `q \in R`. Let
227
+ `B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
228
+ index set `I`. Let `R[I]_{q,B}` denote the polynomial ring in the variables
229
+ `I` such that we have the `q`-*commuting* relation for `x, y \in I`:
230
+
231
+ .. MATH::
232
+
233
+ y x = q^{B_{xy}} \cdot x y.
234
+
235
+ This is a graded `R`-algebra with a natural basis given by monomials
236
+ written in increasing order with respect to some total order on `I`.
237
+
238
+ When `B_{xy} = 1` and `B_{yx} = -1` for all `x < y`, then we have
239
+ a `q`-analog of the classical binomial coefficient theorem:
240
+
241
+ .. MATH::
242
+
243
+ (x + y)^n = \sum_{k=0}^n \binom{n}{k}_q x^k y^{n-k}.
244
+
245
+ EXAMPLES::
246
+
247
+ sage: q = ZZ['q'].fraction_field().gen()
248
+ sage: R.<x,y> = algebras.qCommutingPolynomials(q)
249
+
250
+ We verify a case of the `q`-binomial theorem::
251
+
252
+ sage: f = (x + y)^10
253
+ sage: all(f[b] == q_binomial(10, b.list()[0]) for b in f.support())
254
+ True
255
+
256
+ We now do a computation with a non-standard `B` matrix::
257
+
258
+ sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
259
+ sage: B
260
+ [ 0 1 2]
261
+ [-1 0 3]
262
+ [-2 -3 0]
263
+ sage: q = ZZ['q'].gen()
264
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q, B)
265
+ sage: y * x
266
+ q*x*y
267
+ sage: z * x
268
+ q^2*x*z
269
+ sage: z * y
270
+ q^3*y*z
271
+
272
+ sage: f = (x + z)^10
273
+ sage: all(f[b] == q_binomial(10, b.list()[0], q^2) for b in f.support())
274
+ True
275
+
276
+ sage: f = (y + z)^10
277
+ sage: all(f[b] == q_binomial(10, b.list()[1], q^3) for b in f.support())
278
+ True
279
+ """
280
+ def __init__(self, q, B, names):
281
+ r"""
282
+ Initialize ``self``.
283
+
284
+ EXAMPLES::
285
+
286
+ sage: q = ZZ['q'].fraction_field().gen()
287
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
288
+ sage: TestSuite(R).run()
289
+ """
290
+ indices = FreeAbelianMonoid(len(names), names)
291
+ qCommutingPolynomials_generic.__init__(self, q, B, indices, indices.variable_names())
292
+
293
+ def _repr_(self):
294
+ r"""
295
+ Return a string representation of ``self``.
296
+
297
+ EXAMPLES::
298
+
299
+ sage: q = ZZ['q'].fraction_field().gen()
300
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
301
+ sage: R
302
+ q-commuting polynomial ring in x, y, z over Fraction Field of
303
+ Univariate Polynomial Ring in q over Integer Ring with matrix:
304
+ [ 0 1 1]
305
+ [-1 0 1]
306
+ [-1 -1 0]
307
+ """
308
+ names = ", ".join(self.variable_names())
309
+ return "{}-commuting polynomial ring in {} over {} with matrix:\n{}".format(self._q, names, self.base_ring(), self._B)
310
+
311
+ def _latex_(self):
312
+ r"""
313
+ Return a latex representation of ``self``.
314
+
315
+ EXAMPLES::
316
+
317
+ sage: q = ZZ['q'].fraction_field().gen()
318
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
319
+ sage: latex(R)
320
+ \mathrm{Frac}(\Bold{Z}[q])[x, y, z]_{q}
321
+ """
322
+ names = ", ".join(self.variable_names())
323
+ return "{}[{}]_{{{}}}".format(latex(self.base_ring()), names, self._q)
324
+
325
+ @cached_method
326
+ def one_basis(self):
327
+ r"""
328
+ Return the basis index of the element `1`.
329
+
330
+ EXAMPLES::
331
+
332
+ sage: q = ZZ['q'].fraction_field().gen()
333
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
334
+ sage: R.one_basis()
335
+ 1
336
+ """
337
+ return self._indices.one()
338
+
339
+ def product_on_basis(self, x, y):
340
+ r"""
341
+ Return the product of two monomials given by ``x`` and ``y``.
342
+
343
+ EXAMPLES::
344
+
345
+ sage: q = ZZ['q'].fraction_field().gen()
346
+ sage: R.<x,y> = algebras.qCommutingPolynomials(q)
347
+ sage: R.product_on_basis(x.leading_support(), y.leading_support())
348
+ x*y
349
+ sage: R.product_on_basis(y.leading_support(), x.leading_support())
350
+ q*x*y
351
+
352
+ sage: x * y
353
+ x*y
354
+ sage: y * x
355
+ q*x*y
356
+ sage: y^2 * x
357
+ q^2*x*y^2
358
+ sage: y * x^2
359
+ q^2*x^2*y
360
+ sage: x * y * x
361
+ q*x^2*y
362
+ sage: y^2 * x^2
363
+ q^4*x^2*y^2
364
+ sage: (x + y)^2
365
+ x^2 + (q+1)*x*y + y^2
366
+ sage: (x + y)^3
367
+ x^3 + (q^2+q+1)*x^2*y + (q^2+q+1)*x*y^2 + y^3
368
+ sage: (x + y)^4
369
+ x^4 + (q^3+q^2+q+1)*x^3*y + (q^4+q^3+2*q^2+q+1)*x^2*y^2 + (q^3+q^2+q+1)*x*y^3 + y^4
370
+
371
+ With a non-standard `B` matrix::
372
+
373
+ sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
374
+ sage: q = ZZ['q'].fraction_field().gen()
375
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q, B=B)
376
+ sage: x * y
377
+ x*y
378
+ sage: y * x^2
379
+ q^2*x^2*y
380
+ sage: z^2 * x
381
+ q^4*x*z^2
382
+ sage: z^2 * x^3
383
+ q^12*x^3*z^2
384
+ sage: z^2 * y
385
+ q^6*y*z^2
386
+ sage: z^2 * y^3
387
+ q^18*y^3*z^2
388
+ """
389
+ # Special case for multiplying by 1
390
+ if x == self.one_basis():
391
+ return self.monomial(y)
392
+ if y == self.one_basis():
393
+ return self.monomial(x)
394
+
395
+ Lx = x.list()
396
+ Ly = y.list()
397
+
398
+ # This could be made more efficient
399
+ B = self._B
400
+ qpow = sum(exp * sum(B[j, i] * val for j, val in enumerate(Ly[:i])) for i, exp in enumerate(Lx) if exp)
401
+ return self.term(x * y, self._q ** qpow)
402
+
403
+
404
+ class qCommutingLaurentPolynomials(qCommutingPolynomials_generic):
405
+ r"""
406
+ The algebra of `q`-commuting Laurent polynomials.
407
+
408
+ Let `R` be a commutative ring, and fix an element `q \in R`. Let
409
+ `B = (B_{xy})_{x,y \in I}` be a skew-symmetric bilinear form with
410
+ index set `I`. Let `R[I]_{q,B}` denote the Laurent polynomial ring in
411
+ the variables `I` such that we have the `q`-*commuting* relation
412
+ for `x, y \in I`:
413
+
414
+ .. MATH::
415
+
416
+ y x = q^{B_{xy}} \cdot x y.
417
+
418
+ This is a graded `R`-algebra with a natural basis given by monomials
419
+ written in increasing order with respect to some total order on `I`.
420
+
421
+ EXAMPLES::
422
+
423
+ sage: q = ZZ['q'].fraction_field().gen()
424
+ sage: R.<x,y> = algebras.qCommutingLaurentPolynomials(q)
425
+
426
+ We verify a case of the `q`-binomial theorem using inverse variables::
427
+
428
+ sage: f = (x^-1 + y^-1)^10
429
+ sage: all(f[b] == q_binomial(10, -b.list()[0]) for b in f.support())
430
+ True
431
+
432
+ We now do a computation with a non-standard `B` matrix::
433
+
434
+ sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
435
+ sage: B
436
+ [ 0 1 2]
437
+ [-1 0 3]
438
+ [-2 -3 0]
439
+ sage: q = ZZ['q'].gen()
440
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B)
441
+ sage: y^-1 * x
442
+ 1/q*x*y^-1
443
+ sage: z^-1 * x
444
+ 1/q^2*x*z^-1
445
+ sage: z^-1 * y^-1
446
+ q^3*y^-1*z^-1
447
+
448
+ sage: f = (x + z^-1)^10
449
+ sage: all(f[b] == q_binomial(10, b.list()[0], q^-2) for b in f.support())
450
+ True
451
+
452
+ sage: f = (y^-1 + z^-1)^10
453
+ sage: all(f[b] == q_binomial(10, -b.list()[1], q^3) for b in f.support())
454
+ True
455
+ """
456
+ def __init__(self, q, B, names):
457
+ r"""
458
+ Initialize ``self``.
459
+
460
+ EXAMPLES::
461
+
462
+ sage: q = ZZ['q'].fraction_field().gen()
463
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
464
+ sage: TestSuite(R).run()
465
+ """
466
+ indices = FreeModule(ZZ, len(names))
467
+ self._display_group = FreeGroup(names=names, abelian=True, bracket=False)
468
+ qCommutingPolynomials_generic.__init__(self, q, B, indices, names)
469
+
470
+ def _repr_(self):
471
+ r"""
472
+ Return a string representation of ``self``.
473
+
474
+ EXAMPLES::
475
+
476
+ sage: q = ZZ['q'].fraction_field().gen()
477
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
478
+ sage: R
479
+ q-commuting Laurent polynomial ring in x, y, z over Fraction Field of
480
+ Univariate Polynomial Ring in q over Integer Ring with matrix:
481
+ [ 0 1 1]
482
+ [-1 0 1]
483
+ [-1 -1 0]
484
+ """
485
+ names = ", ".join(self.variable_names())
486
+ return "{}-commuting Laurent polynomial ring in {} over {} with matrix:\n{}".format(self._q, names, self.base_ring(), self._B)
487
+
488
+ def _latex_(self):
489
+ r"""
490
+ Return a latex representation of ``self``.
491
+
492
+ EXAMPLES::
493
+
494
+ sage: q = ZZ['q'].fraction_field().gen()
495
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q)
496
+ sage: latex(R)
497
+ \mathrm{Frac}(\Bold{Z}[q])[x^{\pm}, y^{\pm}, z^{\pm}]_{q}
498
+ """
499
+ from sage.misc.latex import latex
500
+ names = ", ".join(r"{}^{{\pm}}".format(v) for v in self.variable_names())
501
+ return "{}[{}]_{{{}}}".format(latex(self.base_ring()), names, self._q)
502
+
503
+ def _repr_term(self, m):
504
+ r"""
505
+ Return a latex representation of the basis element indexed by ``m``.
506
+
507
+ EXAMPLES::
508
+
509
+ sage: q = ZZ['q'].fraction_field().gen()
510
+ sage: R.<w,x,y,z> = algebras.qCommutingLaurentPolynomials(q)
511
+ sage: R._repr_term(R._indices([1,-2,0,3]))
512
+ 'w*x^-2*z^3'
513
+ sage: R._repr_term(R.zero())
514
+ '1'
515
+ sage: q^3 * R.one()
516
+ q^3
517
+ """
518
+ if not m:
519
+ return '1'
520
+ G = self._display_group
521
+ return repr(G.prod(g ** val for g, val in zip(G.gens(), m) if val != 0))
522
+
523
+ def _latex_term(self, m):
524
+ r"""
525
+ Return a latex representation of the basis element indexed by ``m``.
526
+
527
+ EXAMPLES::
528
+
529
+ sage: q = ZZ['q'].fraction_field().gen()
530
+ sage: R.<w,x,y,z> = algebras.qCommutingLaurentPolynomials(q)
531
+ sage: R._latex_term(R._indices([1,-2,0,3]))
532
+ w x^{-2} z^{3}
533
+ sage: R._latex_term(R.zero())
534
+ '1'
535
+ sage: latex(q^3 * R.one())
536
+ q^{3}
537
+ """
538
+ if not m:
539
+ return '1'
540
+ G = self._display_group
541
+ return latex(G.prod(g ** val for g, val in zip(G.gens(), m) if val != 0))
542
+
543
+ @cached_method
544
+ def one_basis(self):
545
+ r"""
546
+ Return the basis index of the element `1`.
547
+
548
+ EXAMPLES::
549
+
550
+ sage: q = ZZ['q'].fraction_field().gen()
551
+ sage: R.<x,y,z> = algebras.qCommutingPolynomials(q)
552
+ sage: R.one_basis()
553
+ 1
554
+ """
555
+ return self._indices.zero()
556
+
557
+ def product_on_basis(self, x, y):
558
+ r"""
559
+ Return the product of two monomials given by ``x`` and ``y``.
560
+
561
+ EXAMPLES::
562
+
563
+ sage: q = ZZ['q'].fraction_field().gen()
564
+ sage: R.<x,y> = algebras.qCommutingLaurentPolynomials(q)
565
+ sage: R.product_on_basis(x.leading_support(), y.leading_support())
566
+ x*y
567
+ sage: R.product_on_basis(y.leading_support(), x.leading_support())
568
+ q*x*y
569
+
570
+ sage: x * y
571
+ x*y
572
+ sage: y * x
573
+ q*x*y
574
+ sage: y^2 * x
575
+ q^2*x*y^2
576
+ sage: y * x^2
577
+ q^2*x^2*y
578
+ sage: y^-2 * x
579
+ 1/q^2*x*y^-2
580
+ sage: y * x^-2
581
+ 1/q^2*x^-2*y
582
+ sage: x * y * x
583
+ q*x^2*y
584
+ sage: x * y * ~x
585
+ 1/q*y
586
+ sage: y^2 * x^2
587
+ q^4*x^2*y^2
588
+ sage: y^-2 * x^2
589
+ 1/q^4*x^2*y^-2
590
+ sage: y^-2 * x^-2
591
+ q^4*x^-2*y^-2
592
+ sage: (x + y)^4
593
+ x^4 + (q^3+q^2+q+1)*x^3*y + (q^4+q^3+2*q^2+q+1)*x^2*y^2 + (q^3+q^2+q+1)*x*y^3 + y^4
594
+
595
+ With a non-standard `B` matrix::
596
+
597
+ sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
598
+ sage: q = ZZ['q'].fraction_field().gen()
599
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B=B)
600
+ sage: x * y
601
+ x*y
602
+ sage: y * x^2
603
+ q^2*x^2*y
604
+ sage: z^2 * x
605
+ q^4*x*z^2
606
+ sage: z^2 * x^3
607
+ q^12*x^3*z^2
608
+ sage: z^2 * y
609
+ q^6*y*z^2
610
+ sage: z^2 * y^3
611
+ q^18*y^3*z^2
612
+ sage: x * y^-1
613
+ x*y^-1
614
+ sage: y * x^-2
615
+ 1/q^2*x^-2*y
616
+ sage: z^-2 * x
617
+ 1/q^4*x*z^-2
618
+ sage: z^-2 * x^-3
619
+ q^12*x^-3*z^-2
620
+ sage: z^2 * y^-1
621
+ 1/q^6*y^-1*z^2
622
+ sage: z^2 * y^-3
623
+ 1/q^18*y^-3*z^2
624
+ """
625
+ # Special case for multiplying by 1
626
+ if x == self.one_basis():
627
+ return self.monomial(y)
628
+ if y == self.one_basis():
629
+ return self.monomial(x)
630
+
631
+ # This could be made more efficient
632
+ B = self._B
633
+ qpow = sum(exp * sum(B[j, i] * y[j] for j in range(i)) for i, exp in enumerate(x) if exp)
634
+ ret = x + y
635
+ ret.set_immutable()
636
+ return self.term(ret, self._q ** qpow)
637
+
638
+ class Element(qCommutingPolynomials_generic.Element):
639
+ def __invert__(self):
640
+ r"""
641
+ Return the (multiplicative) inverse of ``self``.
642
+
643
+ EXAMPLES::
644
+
645
+ sage: B = matrix([[0,1,2],[-1,0,3],[-2,-3,0]])
646
+ sage: q = ZZ['q'].fraction_field().gen()
647
+ sage: R.<x,y,z> = algebras.qCommutingLaurentPolynomials(q, B=B)
648
+ sage: ~x
649
+ x^-1
650
+ sage: ~(x * y^-2)
651
+ 1/q^2*x^-1*y^2
652
+ sage: for a, b in cartesian_product([R.gens(), R.gens()]):
653
+ ....: elt = a * b
654
+ ....: assert ~elt * elt == R.one(), elt
655
+ ....: assert elt * ~elt == R.one(), elt
656
+ sage: elt = x^2 * y^-3 * z
657
+ sage: ~elt
658
+ 1/q^11*x^-2*y^3*z^-1
659
+ sage: elt * ~elt == ~elt * elt == R.one()
660
+ True
661
+ """
662
+ if len(self._monomial_coefficients) == 1:
663
+ P = self.parent()
664
+ B = P._B
665
+ q = P._q
666
+ m, c = next(iter(self._monomial_coefficients.items()))
667
+ ret = -m
668
+ n = len(m)
669
+ qpow = sum(exp * sum(B[j, i] * m[j] for j in range(i+1, n))
670
+ for i, exp in enumerate(m) if exp)
671
+ ret.set_immutable()
672
+ return P.term(ret, ~c * q**-qpow)
673
+ return super().__invert__()