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,405 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ """
4
+ Finite dimensional free algebra quotients
5
+
6
+ REMARK:
7
+
8
+ This implementation only works for finite dimensional quotients, since
9
+ a list of basis monomials and the multiplication matrices need to be
10
+ explicitly provided.
11
+
12
+ The homogeneous part of a quotient of a free algebra over a field by a
13
+ finitely generated homogeneous twosided ideal is available in a
14
+ different implementation. See
15
+ :mod:`~sage.algebras.letterplace.free_algebra_letterplace` and
16
+ :mod:`~sage.rings.quotient_ring`.
17
+
18
+ TESTS:
19
+
20
+ ::
21
+
22
+ sage: n = 2
23
+ sage: A = FreeAlgebra(QQ,n,'x')
24
+ sage: F = A.monoid()
25
+ sage: i, j = F.gens()
26
+ sage: mons = [F(1), i, j, i*j]
27
+ sage: r = len(mons)
28
+ sage: M = MatrixSpace(QQ,r)
29
+ sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
30
+ ....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]) ]
31
+ sage: H2.<i,j> = A.quotient(mons, mats)
32
+ sage: H2 == loads(dumps(H2))
33
+ True
34
+ sage: i == loads(dumps(i))
35
+ True
36
+
37
+ Test comparison by equality::
38
+
39
+ sage: HQ = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]
40
+ sage: HZ = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)[0]
41
+ sage: HQ == HQ
42
+ True
43
+ sage: HQ == HZ
44
+ False
45
+ sage: HZ == QQ
46
+ False
47
+ """
48
+
49
+ # ****************************************************************************
50
+ # Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
51
+ #
52
+ # Distributed under the terms of the GNU General Public License (GPL)
53
+ #
54
+ # This code is distributed in the hope that it will be useful,
55
+ # but WITHOUT ANY WARRANTY; without even the implied warranty
56
+ # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
57
+ #
58
+ # See the GNU General Public License for more details; the full text
59
+ # is available at:
60
+ #
61
+ # https://www.gnu.org/licenses/
62
+ # ****************************************************************************
63
+
64
+ from sage.algebras.free_algebra import FreeAlgebra_generic
65
+ from sage.algebras.free_algebra_quotient_element import FreeAlgebraQuotientElement
66
+ from sage.categories.algebras import Algebras
67
+ from sage.misc.lazy_import import lazy_import
68
+ from sage.modules.free_module import FreeModule
69
+ from sage.structure.unique_representation import UniqueRepresentation
70
+ from sage.structure.parent import Parent
71
+
72
+ lazy_import('sage.algebras.letterplace.free_algebra_letterplace', 'FreeAlgebra_letterplace')
73
+
74
+
75
+ class FreeAlgebraQuotient(UniqueRepresentation, Parent):
76
+ @staticmethod
77
+ def __classcall__(cls, A, mons, mats, names):
78
+ """
79
+ Used to support unique representation.
80
+
81
+ EXAMPLES::
82
+
83
+ sage: H = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0] # indirect doctest
84
+ sage: H1 = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]
85
+ sage: H is H1
86
+ True
87
+ """
88
+ new_mats = []
89
+ for M in mats:
90
+ M = M.parent()(M)
91
+ M.set_immutable()
92
+ new_mats.append(M)
93
+ return super().__classcall__(cls, A, tuple(mons),
94
+ tuple(new_mats), tuple(names))
95
+
96
+ Element = FreeAlgebraQuotientElement
97
+
98
+ def __init__(self, A, mons, mats, names):
99
+ """
100
+ Return a quotient algebra defined via the action of a free algebra
101
+ A on a (finitely generated) free module.
102
+
103
+ The input for the quotient algebra is a list of monomials (in
104
+ the underlying monoid for A) which form a free basis for the
105
+ module of A, and a list of matrices, which give the action of
106
+ the free generators of A on this monomial basis.
107
+
108
+ EXAMPLES:
109
+
110
+ Quaternion algebra defined in terms of three generators::
111
+
112
+ sage: n = 3
113
+ sage: A = FreeAlgebra(QQ,n,'i')
114
+ sage: F = A.monoid()
115
+ sage: i, j, k = F.gens()
116
+ sage: mons = [F(1), i, j, k]
117
+ sage: M = MatrixSpace(QQ,4)
118
+ sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
119
+ ....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]),
120
+ ....: M([0,0,0,1, 0,0,-1,0, 0,1,0,0, -1,0,0,0]) ]
121
+ sage: H3.<i,j,k> = FreeAlgebraQuotient(A,mons,mats)
122
+ sage: x = 1 + i + j + k
123
+ sage: x
124
+ 1 + i + j + k
125
+ sage: x**128
126
+ -170141183460469231731687303715884105728
127
+ + 170141183460469231731687303715884105728*i
128
+ + 170141183460469231731687303715884105728*j
129
+ + 170141183460469231731687303715884105728*k
130
+
131
+ Same algebra defined in terms of two generators, with some penalty
132
+ on already slow arithmetic.
133
+
134
+ ::
135
+
136
+ sage: n = 2
137
+ sage: A = FreeAlgebra(QQ,n,'x')
138
+ sage: F = A.monoid()
139
+ sage: i, j = F.gens()
140
+ sage: mons = [ F(1), i, j, i*j ]
141
+ sage: r = len(mons)
142
+ sage: M = MatrixSpace(QQ,r)
143
+ sage: mats = [M([0,1,0,0, -1,0,0,0, 0,0,0,-1, 0,0,1,0]),
144
+ ....: M([0,0,1,0, 0,0,0,1, -1,0,0,0, 0,-1,0,0]) ]
145
+ sage: H2.<i,j> = A.quotient(mons,mats)
146
+ sage: k = i*j
147
+ sage: x = 1 + i + j + k
148
+ sage: x
149
+ 1 + i + j + i*j
150
+ sage: x**128
151
+ -170141183460469231731687303715884105728
152
+ + 170141183460469231731687303715884105728*i
153
+ + 170141183460469231731687303715884105728*j
154
+ + 170141183460469231731687303715884105728*i*j
155
+
156
+ TESTS::
157
+
158
+ sage: TestSuite(H2).run()
159
+ """
160
+ if not isinstance(A, (FreeAlgebra_generic, FreeAlgebra_letterplace)):
161
+ raise TypeError("argument A must be a free algebra")
162
+ R = A.base_ring()
163
+ n = A.ngens()
164
+ assert n == len(mats)
165
+ self.__free_algebra = A
166
+ self.__ngens = n
167
+ self.__dim = len(mons)
168
+ self.__module = FreeModule(R, self.__dim)
169
+ self.__matrix_action = mats
170
+ self.__monomial_basis = mons # elements of free monoid
171
+ Parent.__init__(self, base=R, names=names,
172
+ normalize=True, category=Algebras(R))
173
+
174
+ def _element_constructor_(self, x):
175
+ """
176
+ EXAMPLES::
177
+
178
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
179
+ sage: H(i) is i
180
+ True
181
+ sage: a = H._element_constructor_(1); a
182
+ 1
183
+ sage: a in H
184
+ True
185
+ sage: a = H._element_constructor_([1,2,3,4]); a
186
+ 1 + 2*i + 3*j + 4*k
187
+ """
188
+ return self.element_class(self, x)
189
+
190
+ def _coerce_map_from_(self, S):
191
+ """
192
+ EXAMPLES::
193
+
194
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
195
+ sage: H._coerce_map_from_(H)
196
+ True
197
+ sage: H._coerce_map_from_(QQ)
198
+ True
199
+ sage: H._coerce_map_from_(GF(7))
200
+ False
201
+ """
202
+ return S == self or self.__free_algebra.has_coerce_map_from(S)
203
+
204
+ def _repr_(self) -> str:
205
+ """
206
+ EXAMPLES::
207
+
208
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
209
+ sage: H._repr_()
210
+ "Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4 over Rational Field"
211
+ """
212
+ R = self.base_ring()
213
+ n = self.__ngens
214
+ r = self.__module.dimension()
215
+ x = self.variable_names()
216
+ return f"Free algebra quotient on {n} generators {x} and dimension {r} over {R}"
217
+
218
+ def gen(self, i):
219
+ """
220
+ Return the ``i``-th generator of the algebra.
221
+
222
+ EXAMPLES::
223
+
224
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
225
+ sage: H.gen(0)
226
+ i
227
+ sage: H.gen(2)
228
+ k
229
+
230
+ An :exc:`IndexError` is raised if an invalid generator is requested::
231
+
232
+ sage: H.gen(3)
233
+ Traceback (most recent call last):
234
+ ...
235
+ IndexError: argument i (= 3) must be between 0 and 2
236
+
237
+ Negative indexing into the generators is not supported::
238
+
239
+ sage: H.gen(-1)
240
+ Traceback (most recent call last):
241
+ ...
242
+ IndexError: argument i (= -1) must be between 0 and 2
243
+ """
244
+ n = self.__ngens
245
+ if i < 0 or not i < n:
246
+ raise IndexError(f"argument i (= {i}) must be between 0 and {n - 1}")
247
+ one = self.base_ring().one()
248
+ F = self.__free_algebra.monoid()
249
+ return self.element_class(self, {F.gen(i): one})
250
+
251
+ def gens(self) -> tuple:
252
+ """
253
+ Return the tuple of generators of ``self``.
254
+
255
+ EXAMPLES::
256
+
257
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
258
+ sage: H.gens()
259
+ (i, j, k)
260
+ """
261
+ one = self.base_ring().one()
262
+ F = self.__free_algebra.monoid()
263
+ return tuple(self.element_class(self, {F.gen(i): one})
264
+ for i in range(self.__ngens))
265
+
266
+ def ngens(self):
267
+ """
268
+ Return the number of generators of the algebra.
269
+
270
+ EXAMPLES::
271
+
272
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].ngens()
273
+ 3
274
+ """
275
+ return self.__ngens
276
+
277
+ def dimension(self):
278
+ """
279
+ Return the rank of the algebra (as a free module).
280
+
281
+ EXAMPLES::
282
+
283
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].dimension()
284
+ 4
285
+ """
286
+ return self.__dim
287
+
288
+ def matrix_action(self):
289
+ """
290
+ Return the matrix action used to define the algebra.
291
+
292
+ EXAMPLES::
293
+
294
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].matrix_action()
295
+ (
296
+ [ 0 1 0 0] [ 0 0 1 0] [ 0 0 0 1]
297
+ [-1 0 0 0] [ 0 0 0 1] [ 0 0 -1 0]
298
+ [ 0 0 0 -1] [-1 0 0 0] [ 0 1 0 0]
299
+ [ 0 0 1 0], [ 0 -1 0 0], [-1 0 0 0]
300
+ )
301
+ """
302
+ return self.__matrix_action
303
+
304
+ def monomial_basis(self):
305
+ """
306
+ The free monoid of generators of the algebra as elements of a free
307
+ monoid.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].monomial_basis()
312
+ (1, i0, i1, i2)
313
+ """
314
+ return self.__monomial_basis
315
+
316
+ def rank(self):
317
+ """
318
+ Return the rank of the algebra (as a free module).
319
+
320
+ EXAMPLES::
321
+
322
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].rank()
323
+ 4
324
+ """
325
+ return self.__dim
326
+
327
+ def module(self):
328
+ """
329
+ Return the free module of the algebra.
330
+
331
+ EXAMPLES::
332
+
333
+ sage: H = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0]; H
334
+ Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4 over Rational Field
335
+ sage: H.module()
336
+ Vector space of dimension 4 over Rational Field
337
+ """
338
+ return self.__module
339
+
340
+ def monoid(self):
341
+ """
342
+ Return the free monoid of generators of the algebra.
343
+
344
+ EXAMPLES::
345
+
346
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].monoid()
347
+ Free monoid on 3 generators (i0, i1, i2)
348
+ """
349
+ return self.__free_algebra.monoid()
350
+
351
+ def free_algebra(self):
352
+ """
353
+ Return the free algebra generating the algebra.
354
+
355
+ EXAMPLES::
356
+
357
+ sage: sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)[0].free_algebra()
358
+ Free Algebra on 3 generators (i0, i1, i2) over Rational Field
359
+ """
360
+ return self.__free_algebra
361
+
362
+
363
+ def hamilton_quatalg(R):
364
+ """
365
+ Hamilton quaternion algebra over the commutative ring ``R``,
366
+ constructed as a free algebra quotient.
367
+
368
+ INPUT:
369
+
370
+ - ``R`` -- a commutative ring
371
+
372
+ OUTPUT:
373
+
374
+ - ``Q`` -- quaternion algebra
375
+ - ``gens`` -- generators for ``Q``
376
+
377
+ EXAMPLES::
378
+
379
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
380
+ sage: H
381
+ Free algebra quotient on 3 generators ('i', 'j', 'k') and dimension 4
382
+ over Integer Ring
383
+ sage: i^2
384
+ -1
385
+ sage: i in H
386
+ True
387
+
388
+ Note that there is another vastly more efficient model for
389
+ quaternion algebras in Sage; the one here is mainly for testing
390
+ purposes::
391
+
392
+ sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1) # much fast than the above # needs sage.libs.singular
393
+ """
394
+ from sage.algebras.free_algebra import FreeAlgebra
395
+ from sage.matrix.matrix_space import MatrixSpace
396
+ A = FreeAlgebra(R, 3, 'i')
397
+ F = A.monoid()
398
+ i, j, k = F.gens()
399
+ mons = [F.one(), i, j, k]
400
+ M = MatrixSpace(R, 4)
401
+ mats = [M([0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0]),
402
+ M([0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0]),
403
+ M([0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0])]
404
+ H3 = FreeAlgebraQuotient(A, mons, mats, names=('i', 'j', 'k'))
405
+ return H3, H3.gens()
@@ -0,0 +1,295 @@
1
+ # sage_setup: distribution = sagemath-combinat
2
+ # sage.doctest: needs sage.combinat sage.modules
3
+ """
4
+ Free algebra quotient elements
5
+
6
+ AUTHORS:
7
+ - William Stein (2011-11-19): improved doctest coverage to 100%
8
+ - David Kohel (2005-09): initial version
9
+ """
10
+
11
+ #*****************************************************************************
12
+ # Copyright (C) 2005 David Kohel <kohel@maths.usyd.edu>
13
+ #
14
+ # Distributed under the terms of the GNU General Public License (GPL)
15
+ #
16
+ # This code is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty
18
+ # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19
+ #
20
+ # See the GNU General Public License for more details; the full text
21
+ # is available at:
22
+ #
23
+ # http://www.gnu.org/licenses/
24
+ #*****************************************************************************
25
+
26
+ from sage.misc.repr import repr_lincomb
27
+ from sage.structure.element import RingElement, AlgebraElement
28
+ from sage.structure.parent_gens import localvars
29
+ from sage.structure.richcmp import richcmp
30
+ from sage.rings.integer import Integer
31
+ from sage.modules.free_module_element import FreeModuleElement
32
+ from sage.monoids.free_monoid_element import FreeMonoidElement
33
+ from sage.algebras.free_algebra_element import FreeAlgebraElement
34
+
35
+
36
+ def is_FreeAlgebraQuotientElement(x):
37
+ """
38
+ EXAMPLES::
39
+
40
+ sage: from sage.algebras.free_algebra_quotient import hamilton_quatalg
41
+ sage: from sage.algebras.free_algebra_quotient_element import is_FreeAlgebraQuotientElement
42
+ sage: H, (i,j,k) = hamilton_quatalg(QQ)
43
+ sage: is_FreeAlgebraQuotientElement(i)
44
+ doctest:warning...
45
+ DeprecationWarning: The function is_FreeAlgebraQuotientElement is deprecated;
46
+ use 'isinstance(..., FreeAlgebraQuotientElement)' instead.
47
+ See https://github.com/sagemath/sage/issues/38184 for details.
48
+ True
49
+
50
+ Of course this is testing the data type::
51
+
52
+ sage: is_FreeAlgebraQuotientElement(1)
53
+ False
54
+ sage: is_FreeAlgebraQuotientElement(H(1))
55
+ True
56
+ """
57
+ from sage.misc.superseded import deprecation
58
+ deprecation(38184,
59
+ "The function is_FreeAlgebraQuotientElement is deprecated; "
60
+ "use 'isinstance(..., FreeAlgebraQuotientElement)' instead.")
61
+ return isinstance(x, FreeAlgebraQuotientElement)
62
+
63
+
64
+ class FreeAlgebraQuotientElement(AlgebraElement):
65
+ def __init__(self, A, x):
66
+ """
67
+ Create the element x of the FreeAlgebraQuotient A.
68
+
69
+ EXAMPLES::
70
+
71
+ sage: from sage.algebras.free_algebra_quotient import FreeAlgebraQuotientElement
72
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
73
+ sage: FreeAlgebraQuotientElement(H, i)
74
+ i
75
+ sage: a = FreeAlgebraQuotientElement(H, 1); a
76
+ 1
77
+ sage: a in H
78
+ True
79
+
80
+ TESTS::
81
+
82
+ sage: TestSuite(i).run()
83
+ """
84
+ AlgebraElement.__init__(self, A)
85
+ Q = self.parent()
86
+
87
+ if isinstance(x, FreeAlgebraQuotientElement) and x.parent() == Q:
88
+ self.__vector = Q.module()(x.vector())
89
+ return
90
+ if isinstance(x, (Integer, int)):
91
+ self.__vector = Q.module().gen(0) * x
92
+ return
93
+ elif isinstance(x, FreeModuleElement) and x.parent() is Q.module():
94
+ self.__vector = x
95
+ return
96
+ elif isinstance(x, FreeModuleElement) and x.parent() == A.module():
97
+ self.__vector = x
98
+ return
99
+ R = A.base_ring()
100
+ M = A.module()
101
+ F = A.monoid()
102
+ B = A.monomial_basis()
103
+
104
+ if isinstance(x, (Integer, int)):
105
+ self.__vector = x*M.gen(0)
106
+ elif isinstance(x, RingElement) and not isinstance(x, AlgebraElement) and x in R:
107
+ self.__vector = x * M.gen(0)
108
+ elif isinstance(x, FreeMonoidElement) and x.parent() is F:
109
+ if x in B:
110
+ self.__vector = M.gen(B.index(x))
111
+ else:
112
+ raise AttributeError("argument x (= %s) is not in monomial basis" % x)
113
+ elif isinstance(x, list) and len(x) == A.dimension():
114
+ try:
115
+ self.__vector = M(x)
116
+ except TypeError:
117
+ raise TypeError("argument x (= %s) is of the wrong type" % x)
118
+ elif isinstance(x, FreeAlgebraElement) and x.parent() is A.free_algebra():
119
+ # Need to do more work here to include monomials not
120
+ # represented in the monomial basis.
121
+ self.__vector = M(0)
122
+ for m, c in x._FreeAlgebraElement__monomial_coefficients.items():
123
+ self.__vector += c*M.gen(B.index(m))
124
+ elif isinstance(x, dict):
125
+ self.__vector = M(0)
126
+ for m, c in x.items():
127
+ self.__vector += c*M.gen(B.index(m))
128
+ elif isinstance(x, AlgebraElement) and x.parent().ambient_algebra() is A:
129
+ self.__vector = x.ambient_algebra_element().vector()
130
+ else:
131
+ raise TypeError("argument x (= %s) is of the wrong type" % x)
132
+
133
+ def _repr_(self):
134
+ """
135
+ EXAMPLES::
136
+
137
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)
138
+ sage: i._repr_()
139
+ 'i'
140
+ """
141
+ Q = self.parent()
142
+ M = Q.monoid()
143
+ with localvars(M, Q.variable_names()):
144
+ cffs = list(self.__vector)
145
+ mons = Q.monomial_basis()
146
+ return repr_lincomb(zip(mons, cffs), strip_one=True)
147
+
148
+ def _latex_(self):
149
+ r"""
150
+ EXAMPLES::
151
+
152
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
153
+ sage: ((2/3)*i - j)._latex_()
154
+ '\\frac{2}{3} i - j'
155
+ """
156
+ Q = self.parent()
157
+ M = Q.monoid()
158
+ with localvars(M, Q.variable_names()):
159
+ cffs = tuple(self.__vector)
160
+ mons = Q.monomial_basis()
161
+ return repr_lincomb(zip(mons, cffs), is_latex=True, strip_one=True)
162
+
163
+ def vector(self):
164
+ """
165
+ Return underlying vector representation of this element.
166
+
167
+ EXAMPLES::
168
+
169
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
170
+ sage: ((2/3)*i - j).vector()
171
+ (0, 2/3, -1, 0)
172
+ """
173
+ return self.__vector
174
+
175
+ def _richcmp_(self, right, op):
176
+ """
177
+ Compare two quotient algebra elements; done by comparing the
178
+ underlying vector representatives.
179
+
180
+ EXAMPLES::
181
+
182
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
183
+ sage: i > j
184
+ True
185
+ sage: i == i
186
+ True
187
+ sage: i == 1
188
+ False
189
+ sage: i + j == j + i
190
+ True
191
+ """
192
+ return richcmp(self.vector(), right.vector(), op)
193
+
194
+ def __neg__(self):
195
+ """
196
+ Return negative of ``self``.
197
+
198
+ EXAMPLES::
199
+
200
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
201
+ sage: -i
202
+ -i
203
+ sage: -(2/3*i - 3/7*j + k)
204
+ -2/3*i + 3/7*j - k
205
+ """
206
+ y = self.parent()(0)
207
+ y.__vector = -self.__vector
208
+ return y
209
+
210
+ def _add_(self, y):
211
+ """
212
+ EXAMPLES::
213
+
214
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
215
+ sage: 2/3*i + 4*j + k
216
+ 2/3*i + 4*j + k
217
+ """
218
+ A = self.parent()
219
+ z = A(0)
220
+ z.__vector = self.__vector + y.__vector
221
+ return z
222
+
223
+ def _sub_(self, y):
224
+ """
225
+ EXAMPLES::
226
+
227
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
228
+ sage: 2/3*i - 4*j
229
+ 2/3*i - 4*j
230
+ sage: a = 2/3*i - 4*j; a
231
+ 2/3*i - 4*j
232
+ sage: a - a
233
+ 0
234
+ """
235
+ A = self.parent()
236
+ z = A(0)
237
+ z.__vector = self.__vector - y.__vector
238
+ return z
239
+
240
+ def _mul_(self, y):
241
+ """
242
+ EXAMPLES::
243
+
244
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
245
+ sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)
246
+ -5459/25 + 40*i - 12*j + 340*k
247
+
248
+ Double check that the above is actually right::
249
+
250
+ sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1) # needs sage.libs.singular
251
+ sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10) # needs sage.libs.singular
252
+ -5459/25 + 40*i - 12*j + 340*k
253
+ """
254
+ A = self.parent()
255
+
256
+ def monomial_product(X, w, m):
257
+ mats = X._FreeAlgebraQuotient__matrix_action
258
+ for j, k in m._element_list:
259
+ M = mats[int(j)]
260
+ for _ in range(k):
261
+ w *= M
262
+ return w
263
+ u = self.__vector.__copy__()
264
+ v = y.__vector
265
+ z = A(0)
266
+ B = A.monomial_basis()
267
+ for i in range(A.dimension()):
268
+ c = v[i]
269
+ if c != 0:
270
+ z.__vector += monomial_product(A,c*u,B[i])
271
+ return z
272
+
273
+ def _rmul_(self, c):
274
+ """
275
+ EXAMPLES::
276
+
277
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
278
+ sage: 3 * (-1+i-2*j+k)
279
+ -3 + 3*i - 6*j + 3*k
280
+ sage: (-1+i-2*j+k)._rmul_(3)
281
+ -3 + 3*i - 6*j + 3*k
282
+ """
283
+ return self.parent([c*a for a in self.__vector])
284
+
285
+ def _lmul_(self, c):
286
+ """
287
+ EXAMPLES::
288
+
289
+ sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)
290
+ sage: (-1+i-2*j+k) * 3
291
+ -3 + 3*i - 6*j + 3*k
292
+ sage: (-1+i-2*j+k)._lmul_(3)
293
+ -3 + 3*i - 6*j + 3*k
294
+ """
295
+ return self.parent([a*c for a in self.__vector])