passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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 (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,1860 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Finite dimensional algebras with basis
4
+
5
+ .. TODO::
6
+
7
+ Quotients of polynomial rings.
8
+
9
+ Quotients in general.
10
+
11
+ Matrix rings.
12
+
13
+ REFERENCES:
14
+
15
+ - [CR1962]_
16
+ """
17
+ #*****************************************************************************
18
+ # Copyright (C) 2008 Teresa Gomez-Diaz (CNRS) <Teresa.Gomez-Diaz@univ-mlv.fr>
19
+ # 2011-2015 Nicolas M. Thiéry <nthiery at users.sf.net>
20
+ # 2011-2015 Franco Saliola <saliola@gmail.com>
21
+ # 2014-2015 Aladin Virmaux <aladin.virmaux at u-psud.fr>
22
+ #
23
+ # Distributed under the terms of the GNU General Public License (GPL)
24
+ # http://www.gnu.org/licenses/
25
+ #******************************************************************************
26
+
27
+ import operator
28
+ from sage.misc.cachefunc import cached_method
29
+ from sage.misc.abstract_method import abstract_method
30
+ from sage.misc.lazy_attribute import lazy_attribute
31
+ from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
32
+ from sage.categories.algebras import Algebras
33
+ from sage.categories.associative_algebras import AssociativeAlgebras
34
+ from sage.categories.tensor import TensorProductsCategory
35
+
36
+
37
+ class FiniteDimensionalAlgebrasWithBasis(CategoryWithAxiom_over_base_ring):
38
+ r"""
39
+ The category of finite dimensional algebras with a distinguished basis.
40
+
41
+ These algebras are assumed to be associative and
42
+ unital.
43
+
44
+ EXAMPLES::
45
+
46
+ sage: C = FiniteDimensionalAlgebrasWithBasis(QQ); C
47
+ Category of finite dimensional algebras with basis over Rational Field
48
+ sage: C.super_categories()
49
+ [Category of algebras with basis over Rational Field,
50
+ Category of finite dimensional magmatic algebras with basis over Rational Field]
51
+ sage: C.example() # needs sage.modules
52
+ An example of a finite dimensional algebra with basis:
53
+ the path algebra of the Kronecker quiver
54
+ (containing the arrows a:x->y and b:x->y) over Rational Field
55
+
56
+ TESTS::
57
+
58
+ sage: # needs sage.graphs sage.modules
59
+ sage: TestSuite(C).run()
60
+ sage: C is Algebras(QQ).FiniteDimensional().WithBasis()
61
+ True
62
+ sage: C is Algebras(QQ).WithBasis().FiniteDimensional()
63
+ True
64
+ """
65
+
66
+ class ParentMethods:
67
+
68
+ @cached_method
69
+ def radical_basis(self):
70
+ r"""
71
+ Return a basis of the Jacobson radical of this algebra.
72
+
73
+ .. NOTE::
74
+
75
+ This implementation handles algebras over fields of
76
+ characteristic zero (using Dixon's lemma) or fields of
77
+ characteristic `p` in which we can compute `x^{1/p}`
78
+ [FR1985]_, [Eb1989]_.
79
+
80
+ OUTPUT: list of elements of ``self``
81
+
82
+ .. SEEALSO:: :meth:`radical`, :class:`Algebras.Semisimple`
83
+
84
+ EXAMPLES::
85
+
86
+ sage: # needs sage.graphs sage.modules
87
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
88
+ An example of a finite dimensional algebra with basis:
89
+ the path algebra of the Kronecker quiver
90
+ (containing the arrows a:x->y and b:x->y) over Rational Field
91
+ sage: A.radical_basis()
92
+ (a, b)
93
+
94
+ We construct the group algebra of the Klein Four-Group
95
+ over the rationals::
96
+
97
+ sage: A = KleinFourGroup().algebra(QQ) # needs sage.groups sage.modules
98
+
99
+ This algebra belongs to the category of finite dimensional
100
+ algebras over the rationals::
101
+
102
+ sage: A in Algebras(QQ).FiniteDimensional().WithBasis() # needs sage.groups sage.modules
103
+ True
104
+
105
+ Since the field has characteristic `0`, Maschke's Theorem
106
+ tells us that the group algebra is semisimple. So its
107
+ radical is the zero ideal::
108
+
109
+ sage: A in Algebras(QQ).Semisimple() # needs sage.groups sage.modules
110
+ True
111
+ sage: A.radical_basis() # needs sage.groups sage.modules
112
+ ()
113
+
114
+ Let's work instead over a field of characteristic `2`::
115
+
116
+ sage: A = KleinFourGroup().algebra(GF(2)) # needs sage.groups sage.modules
117
+ sage: A in Algebras(GF(2)).Semisimple() # needs sage.groups sage.modules
118
+ False
119
+ sage: A.radical_basis() # needs sage.groups sage.modules
120
+ (() + (1,2)(3,4), (3,4) + (1,2)(3,4), (1,2) + (1,2)(3,4))
121
+
122
+ We now implement the algebra `A = K[x] / (x^p-1)`, where `K`
123
+ is a finite field of characteristic `p`, and check its
124
+ radical; alas, we currently need to wrap `A` to make it a
125
+ proper :class:`ModulesWithBasis`::
126
+
127
+ sage: # needs sage.modules
128
+ sage: class AnAlgebra(CombinatorialFreeModule):
129
+ ....: def __init__(self, F):
130
+ ....: R.<x> = PolynomialRing(F)
131
+ ....: I = R.ideal(x**F.characteristic()-F.one())
132
+ ....: self._xbar = R.quotient(I).gen()
133
+ ....: basis_keys = [self._xbar**i for i in range(F.characteristic())]
134
+ ....: CombinatorialFreeModule.__init__(self, F, basis_keys,
135
+ ....: category=Algebras(F).FiniteDimensional().WithBasis())
136
+ ....: def one(self):
137
+ ....: return self.basis()[self.base_ring().one()]
138
+ ....: def product_on_basis(self, w1, w2):
139
+ ....: return self.from_vector(vector(w1*w2))
140
+ sage: AnAlgebra(GF(3)).radical_basis() # needs sage.libs.pari
141
+ (B[1] + 2*B[xbar^2], B[xbar] + 2*B[xbar^2])
142
+ sage: AnAlgebra(GF(16,'a')).radical_basis() # needs sage.rings.finite_rings
143
+ (B[1] + B[xbar],)
144
+ sage: AnAlgebra(GF(49,'a')).radical_basis() # needs sage.rings.finite_rings
145
+ (B[1] + 6*B[xbar^6], B[xbar] + 6*B[xbar^6], B[xbar^2] + 6*B[xbar^6],
146
+ B[xbar^3] + 6*B[xbar^6], B[xbar^4] + 6*B[xbar^6], B[xbar^5] + 6*B[xbar^6])
147
+
148
+ We compute the radical basis in a subalgebra using
149
+ the inherited product::
150
+
151
+ sage: # needs sage.combinat sage.modules
152
+ sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
153
+ ....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
154
+ sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
155
+ sage: MS = MatrixSpace(QQ, 5)
156
+ sage: A = MS.subalgebra([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
157
+ sage: A.radical_basis()
158
+ (B[1], B[2], B[3], B[4], B[5])
159
+
160
+ TESTS::
161
+
162
+ sage: # needs sage.groups sage.modules
163
+ sage: A = KleinFourGroup().algebra(GF(2))
164
+ sage: A.radical_basis()
165
+ (() + (1,2)(3,4), (3,4) + (1,2)(3,4), (1,2) + (1,2)(3,4))
166
+ sage: A = KleinFourGroup().algebra(QQ, category=Monoids())
167
+ sage: A.radical_basis.__module__
168
+ 'sage.categories.finite_dimensional_algebras_with_basis'
169
+ sage: A.radical_basis()
170
+ ()
171
+ """
172
+ F = self.base_ring()
173
+ if not F.is_field():
174
+ raise NotImplementedError("the base ring must be a field")
175
+ p = F.characteristic()
176
+ from sage.matrix.constructor import matrix
177
+ from sage.modules.free_module_element import vector
178
+
179
+ if p == 0:
180
+ B = self.basis()
181
+ product_on_basis = self.product_on_basis
182
+ if product_on_basis is NotImplemented:
183
+ def product_on_basis(i, j):
184
+ return B[i] * B[j]
185
+
186
+ zero = F.zero()
187
+ keys = B.keys()
188
+ cache = [{(i, j): c for i in keys
189
+ for j, c in product_on_basis(y, i).monomial_coefficients().items()}
190
+ for y in keys]
191
+ mat = [[F.sum(x.get((j, i), zero) * c for (i,j), c in y.items())
192
+ for x in cache]
193
+ for y in cache]
194
+
195
+ mat = matrix(F, mat)
196
+ rad_basis = mat.kernel().basis()
197
+
198
+ else:
199
+ # TODO: some finite field elements in Sage have both an
200
+ # ``nth_root`` method and a ``pth_root`` method (such as ``GF(9,'a')``),
201
+ # some only have a ``nth_root`` element such as ``GF(2)``
202
+ # I imagine that ``pth_root`` would be fastest, but it is not
203
+ # always available....
204
+ if hasattr(F.one(), 'nth_root'):
205
+ def root_fcn(s, x):
206
+ return x.nth_root(s)
207
+ else:
208
+ def root_fcn(s, x):
209
+ return x ** (1 / s)
210
+
211
+ s = 1
212
+ n = self.dimension()
213
+ B = [b.on_left_matrix() for b in self.basis()]
214
+ while s <= n:
215
+ # we use that p_{AB}(x) = p_{BA}(x) here
216
+ data = [[None]*(len(B)+1) for _ in B]
217
+ for i, b in enumerate(B):
218
+ for j, bb in enumerate(B[i:], start=i):
219
+ val = (-1)**s * (b*bb).charpoly()[n-s]
220
+ data[i][j] = data[j][i] = val
221
+ data[i][-1] = (-1)**s * b.charpoly()[n-s]
222
+ C = matrix(data).left_kernel().basis()
223
+ if 1 < s < F.order():
224
+ C = [vector(F, [root_fcn(s, ci) for ci in c]) for c in C]
225
+ B = [sum(ci * b for (ci, b) in zip(c, B)) for c in C]
226
+ s = p * s
227
+ e = vector(self.one())
228
+ rad_basis = [b * e for b in B]
229
+
230
+ return tuple([self.from_vector(vec) for vec in rad_basis])
231
+
232
+ @cached_method
233
+ def radical(self):
234
+ r"""
235
+ Return the Jacobson radical of ``self``.
236
+
237
+ This uses :meth:`radical_basis`, whose default
238
+ implementation handles algebras over fields of
239
+ characteristic zero or fields of characteristic `p` in
240
+ which we can compute `x^{1/p}`.
241
+
242
+ .. SEEALSO:: :meth:`radical_basis`, :meth:`semisimple_quotient`
243
+
244
+ EXAMPLES::
245
+
246
+ sage: # needs sage.graphs sage.modules
247
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
248
+ An example of a finite dimensional algebra with basis:
249
+ the path algebra of the Kronecker quiver
250
+ (containing the arrows a:x->y and b:x->y) over Rational Field
251
+ sage: radical = A.radical(); radical
252
+ Radical of An example of a finite dimensional algebra with basis:
253
+ the path algebra of the Kronecker quiver
254
+ (containing the arrows a:x->y and b:x->y) over Rational Field
255
+
256
+ The radical is an ideal of `A`, and thus a finite
257
+ dimensional non unital associative algebra::
258
+
259
+ sage: # needs sage.graphs sage.modules
260
+ sage: from sage.categories.associative_algebras import AssociativeAlgebras
261
+ sage: radical in AssociativeAlgebras(QQ).WithBasis().FiniteDimensional()
262
+ True
263
+ sage: radical in Algebras(QQ)
264
+ False
265
+
266
+ sage: # needs sage.graphs sage.modules
267
+ sage: radical.dimension()
268
+ 2
269
+ sage: radical.basis()
270
+ Finite family {0: B[0], 1: B[1]}
271
+ sage: radical.ambient() is A
272
+ True
273
+ sage: [c.lift() for c in radical.basis()]
274
+ [a, b]
275
+
276
+ .. TODO::
277
+
278
+ - Tell Sage that the radical is in fact an ideal;
279
+ - Pickling by construction, as ``A.center()``;
280
+ - Lazy evaluation of ``_repr_``.
281
+
282
+ TESTS::
283
+
284
+ sage: # needs sage.graphs sage.modules
285
+ sage: TestSuite(radical).run()
286
+ """
287
+ category = AssociativeAlgebras(self.category().base_ring()).WithBasis().FiniteDimensional().Subobjects()
288
+ radical = self.submodule(self.radical_basis(),
289
+ category=category,
290
+ already_echelonized=True)
291
+ radical.rename("Radical of {}".format(self))
292
+ return radical
293
+
294
+ @cached_method
295
+ def semisimple_quotient(self):
296
+ """
297
+ Return the semisimple quotient of ``self``.
298
+
299
+ This is the quotient of ``self`` by its radical.
300
+
301
+ .. SEEALSO:: :meth:`radical`
302
+
303
+ EXAMPLES::
304
+
305
+ sage: # needs sage.graphs sage.modules
306
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
307
+ An example of a finite dimensional algebra with basis:
308
+ the path algebra of the Kronecker quiver
309
+ (containing the arrows a:x->y and b:x->y) over Rational Field
310
+ sage: a,b,x,y = sorted(A.basis())
311
+ sage: S = A.semisimple_quotient(); S
312
+ Semisimple quotient of An example of a finite dimensional algebra with basis:
313
+ the path algebra of the Kronecker quiver
314
+ (containing the arrows a:x->y and b:x->y) over Rational Field
315
+ sage: S in Algebras(QQ).Semisimple()
316
+ True
317
+ sage: S.basis()
318
+ Finite family {'x': B['x'], 'y': B['y']}
319
+ sage: xs,ys = sorted(S.basis())
320
+ sage: (xs + ys) * xs
321
+ B['x']
322
+
323
+ Sanity check: the semisimple quotient of the `n`-th
324
+ descent algebra of the symmetric group is of dimension the
325
+ number of partitions of `n`::
326
+
327
+ sage: [ DescentAlgebra(QQ,n).B().semisimple_quotient().dimension() # needs sage.combinat sage.groups sage.modules
328
+ ....: for n in range(6) ]
329
+ [1, 1, 2, 3, 5, 7]
330
+ sage: [Partitions(n).cardinality() for n in range(10)] # needs sage.combinat sage.libs.flint
331
+ [1, 1, 2, 3, 5, 7, 11, 15, 22, 30]
332
+
333
+ .. TODO::
334
+
335
+ - Pickling by construction, as ``A.semisimple_quotient()``?
336
+ - Lazy evaluation of ``_repr_``
337
+
338
+ TESTS::
339
+
340
+ sage: TestSuite(S).run() # needs sage.graphs sage.modules
341
+ """
342
+ ring = self.base_ring()
343
+ category = Algebras(ring).WithBasis().FiniteDimensional().Quotients().Semisimple()
344
+ result = self.quotient_module(self.radical(), category=category)
345
+ result.rename("Semisimple quotient of {}".format(self))
346
+ return result
347
+
348
+ @cached_method
349
+ def center_basis(self):
350
+ r"""
351
+ Return a basis of the center of ``self``.
352
+
353
+ OUTPUT: list of elements of ``self``
354
+
355
+ .. SEEALSO:: :meth:`center`
356
+
357
+ EXAMPLES::
358
+
359
+ sage: # needs sage.graphs sage.modules
360
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
361
+ An example of a finite dimensional algebra with basis:
362
+ the path algebra of the Kronecker quiver
363
+ (containing the arrows a:x->y and b:x->y) over Rational Field
364
+ sage: A.center_basis()
365
+ (x + y,)
366
+ """
367
+ return self.annihilator_basis(self.algebra_generators(), self.bracket)
368
+
369
+ @cached_method
370
+ def center(self):
371
+ r"""
372
+ Return the center of ``self``.
373
+
374
+ .. SEEALSO:: :meth:`center_basis`
375
+
376
+ EXAMPLES::
377
+
378
+ sage: # needs sage.graphs sage.modules
379
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
380
+ An example of a finite dimensional algebra with basis:
381
+ the path algebra of the Kronecker quiver
382
+ (containing the arrows a:x->y and b:x->y) over Rational Field
383
+ sage: center = A.center(); center
384
+ Center of An example of a finite dimensional algebra with basis:
385
+ the path algebra of the Kronecker quiver
386
+ (containing the arrows a:x->y and b:x->y) over Rational Field
387
+ sage: center in Algebras(QQ).WithBasis().FiniteDimensional().Commutative()
388
+ True
389
+ sage: center.dimension()
390
+ 1
391
+ sage: center.basis()
392
+ Finite family {0: B[0]}
393
+ sage: center.ambient() is A
394
+ True
395
+ sage: [c.lift() for c in center.basis()]
396
+ [x + y]
397
+
398
+ The center of a semisimple algebra is semisimple::
399
+
400
+ sage: A = DihedralGroup(6).algebra(QQ) # needs sage.groups sage.modules
401
+ sage: A.center() in Algebras(QQ).Semisimple() # needs sage.groups sage.modules
402
+ True
403
+
404
+ .. TODO::
405
+
406
+ - Pickling by construction, as ``A.center()``?
407
+ - Lazy evaluation of ``_repr_``
408
+
409
+ TESTS::
410
+
411
+ sage: TestSuite(center).run() # needs sage.graphs sage.modules
412
+ """
413
+ category = Algebras(self.base_ring()).FiniteDimensional().Subobjects().Commutative().WithBasis()
414
+ if self in Algebras.Semisimple:
415
+ category = category.Semisimple()
416
+ center = self.submodule(self.center_basis(),
417
+ category=category,
418
+ already_echelonized=True)
419
+ center.rename("Center of {}".format(self))
420
+ return center
421
+
422
+ def subalgebra(self, gens, category=None, *args, **opts):
423
+ r"""
424
+ Return the subalgebra of ``self`` generated by ``gens``.
425
+
426
+ Here, ``gens`` is an iterable containing elements of
427
+ ``self``.
428
+
429
+ EXAMPLES::
430
+
431
+ sage: # needs sage.combinat sage.modules
432
+ sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
433
+ ....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
434
+ sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
435
+ sage: MS = MatrixSpace(QQ, 5)
436
+ sage: A = MS.subalgebra([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
437
+ sage: A.dimension()
438
+ 7
439
+
440
+ sage: # needs sage.combinat sage.modules
441
+ sage: L.<x,y,z> = LieAlgebra(GF(3), {('x','z'): {'x':1, 'y':1}, ('y','z'): {'y':1}})
442
+ sage: MS = MatrixSpace(L.base_ring(), L.dimension())
443
+ sage: gens = [b.adjoint_matrix() for b in L.basis()]
444
+ sage: A = MS.subalgebra(gens)
445
+ sage: A.dimension()
446
+ 5
447
+ """
448
+ # add the unit to make sure it is unital
449
+ basis = []
450
+ new_elts = [self(g) for g in gens] + [self.one()]
451
+ while new_elts:
452
+ basis = self.echelon_form(basis + new_elts)
453
+ trailsupp = {b.trailing_support(): b for b in basis}
454
+ sortsupp = sorted(trailsupp)
455
+ new_elts = []
456
+ # We (re)implement the reduction here
457
+ for b in basis:
458
+ for bp in basis:
459
+ elt = b * bp
460
+ for s in sortsupp:
461
+ c = elt[s]
462
+ if c:
463
+ elt -= c / trailsupp[s].trailing_coefficient() * trailsupp[s]
464
+ if elt:
465
+ new_elts.append(elt)
466
+ C = FiniteDimensionalAlgebrasWithBasis(self.category().base_ring())
467
+ category = C.Subobjects().or_subcategory(category)
468
+ return self.submodule(basis, check=False, already_echelonized=True,
469
+ category=category)
470
+
471
+ def ideal_submodule(self, gens, side='left', category=None, *args, **opts):
472
+ r"""
473
+ Return the ``side`` ideal of ``self`` generated by ``gens``
474
+ as a submodule.
475
+
476
+ Here, ``gens`` is an iterable containing elements of
477
+ ``self`` or a single element of ``self``,
478
+ and ``side`` is either ``'left'`` or
479
+ ``'right'`` or ``'twosided'``.
480
+
481
+ .. TODO::
482
+
483
+ This is not generally compatible with the implementation of
484
+ the ideals. This method should be folded into the ``ideal``
485
+ method after the corresponding classes are refactored to
486
+ be compatible.
487
+
488
+ EXAMPLES::
489
+
490
+ sage: # needs sage.combinat sage.modules
491
+ sage: scoeffs = {('a','e'): {'a':1}, ('b','e'): {'a':1, 'b':1},
492
+ ....: ('c','d'): {'a':1}, ('c','e'): {'c':1}}
493
+ sage: L.<a,b,c,d,e> = LieAlgebra(QQ, scoeffs)
494
+ sage: MS = MatrixSpace(QQ, 5)
495
+ sage: I = MS.ideal_submodule([bg.adjoint_matrix() for bg in L.lie_algebra_generators()])
496
+ sage: I.dimension()
497
+ 25
498
+ """
499
+ C = AssociativeAlgebras(self.category().base_ring()).WithBasis().FiniteDimensional()
500
+ category = C.Subobjects().or_subcategory(category)
501
+ if gens in self:
502
+ gens = [self(gens)]
503
+ else:
504
+ gens = [self(g) for g in gens]
505
+ if side == 'left':
506
+ return self.submodule([b * g for b in self.basis() for g in gens],
507
+ category=category, *args, **opts)
508
+ if side == 'right':
509
+ return self.submodule([g * b for b in self.basis() for g in gens],
510
+ category=category, *args, **opts)
511
+ if side == 'twosided':
512
+ return self.submodule([b * g * bp for b in self.basis()
513
+ for bp in self.basis() for g in gens],
514
+ category=category, *args, **opts)
515
+ raise ValueError("side must be either 'left', 'right', or 'twosided'")
516
+
517
+ def principal_ideal(self, a, side='left', *args, **opts):
518
+ r"""
519
+ Construct the ``side`` principal ideal generated by ``a``.
520
+
521
+ INPUT:
522
+
523
+ - ``a`` -- an element
524
+ - ``side`` -- ``left`` (default) or ``right`` or ``twosided``
525
+ - ``coerce`` -- ignored, for compatibility with categories
526
+
527
+ EXAMPLES:
528
+
529
+ In order to highlight the difference between left and
530
+ right principal ideals, our first example deals with a
531
+ noncommutative algebra::
532
+
533
+ sage: # needs sage.graphs sage.modules
534
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
535
+ An example of a finite dimensional algebra with basis:
536
+ the path algebra of the Kronecker quiver
537
+ (containing the arrows a:x->y and b:x->y) over Rational Field
538
+ sage: x, y, a, b = A.basis()
539
+
540
+ In this algebra, multiplication on the right by `x`
541
+ annihilates all basis elements but `x`::
542
+
543
+ sage: x*x, y*x, a*x, b*x # needs sage.graphs sage.modules
544
+ (x, 0, 0, 0)
545
+
546
+ so the left ideal generated by `x` is one-dimensional::
547
+
548
+ sage: Ax = A.principal_ideal(x, side='left'); Ax # needs sage.graphs sage.modules
549
+ Free module generated by {0} over Rational Field
550
+ sage: [B.lift() for B in Ax.basis()] # needs sage.graphs sage.modules
551
+ [x]
552
+
553
+ Multiplication on the left by `x` annihilates
554
+ only `x` and fixes the other basis elements::
555
+
556
+ sage: x*x, x*y, x*a, x*b # needs sage.graphs sage.modules
557
+ (x, 0, a, b)
558
+
559
+ so the right ideal generated by `x` is 3-dimensional::
560
+
561
+ sage: xA = A.principal_ideal(x, side='right'); xA # needs sage.graphs sage.modules
562
+ Free module generated by {0, 1, 2} over Rational Field
563
+ sage: [B.lift() for B in xA.basis()] # needs sage.graphs sage.modules
564
+ [x, a, b]
565
+
566
+ For another example::
567
+
568
+ sage: # needs sage.modules
569
+ sage: A = MatrixSpace(QQ, 2)
570
+ sage: A.basis()
571
+ Finite family {(0, 0): [1 0]
572
+ [0 0], (0, 1): [0 1]
573
+ [0 0], (1, 0): [0 0]
574
+ [1 0], (1, 1): [0 0]
575
+ [0 1]}
576
+ sage: e = list(A.basis())
577
+ sage: [b.lift() for b in A.principal_ideal(e[0], side="left").basis()]
578
+ [
579
+ [1 0] [0 0]
580
+ [0 0], [1 0]
581
+ ]
582
+ sage: [b.lift() for b in A.principal_ideal(e[0], side="right").basis()]
583
+ [
584
+ [1 0] [0 1]
585
+ [0 0], [0 0]
586
+ ]
587
+ sage: [b.lift() for b in A.principal_ideal(e[0], side="twosided").basis()]
588
+ [
589
+ [1 0] [0 1] [0 0] [0 0]
590
+ [0 0], [0 0], [1 0], [0 1]
591
+ ]
592
+
593
+ .. SEEALSO::
594
+
595
+ - :meth:`peirce_summand`
596
+ """
597
+ opts.pop("coerce", None)
598
+ if side == 'right':
599
+ return self.submodule([a * b
600
+ for b in self.basis()], *args, **opts)
601
+ if side == 'left':
602
+ return self.submodule([b * a
603
+ for b in self.basis()], *args, **opts)
604
+ if side == 'twosided':
605
+ return self.submodule([b1 * a * b2 for b1 in self.basis()
606
+ for b2 in self.basis()], *args, **opts)
607
+ raise ValueError("side must be either 'left', 'right', or 'twosided'")
608
+
609
+ @cached_method
610
+ def orthogonal_idempotents_central_mod_radical(self):
611
+ r"""
612
+ Return a family of orthogonal idempotents of ``self`` that project
613
+ on the central orthogonal idempotents of the semisimple quotient.
614
+
615
+ .. TODO::
616
+
617
+ The implementation assumes that the algebra
618
+ is split over its base field.
619
+
620
+ OUTPUT:
621
+
622
+ - a list of orthogonal idempotents obtained by lifting the central
623
+ orthogonal idempotents of the semisimple quotient.
624
+
625
+ ALGORITHM:
626
+
627
+ The orthogonal idempotents of `A` are obtained by lifting the
628
+ central orthogonal idempotents of the semisimple quotient
629
+ `\overline{A}`.
630
+
631
+ Namely, let `(\overline{f_i})` be the central orthogonal
632
+ idempotents of the semisimple quotient of `A`. We
633
+ recursively construct orthogonal idempotents of `A` by the
634
+ following procedure: assuming `(f_i)_{i < n}` is a set of
635
+ already constructed orthogonal idempotents, we construct
636
+ `f_k` by idempotent lifting of `(1-f) g (1-f)`, where `g`
637
+ is any lift of `\overline{e_k}` and `f=\sum_{i<k} f_i`.
638
+
639
+ See [CR1962]_ for correctness and termination proofs.
640
+
641
+ .. SEEALSO::
642
+
643
+ - :meth:`Algebras.SemiSimple.FiniteDimensional.WithBasis.ParentMethods.central_orthogonal_idempotents`
644
+ - :meth:`idempotent_lift`
645
+
646
+ EXAMPLES::
647
+
648
+ sage: # needs sage.graphs sage.modules
649
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
650
+ An example of a finite dimensional algebra with basis:
651
+ the path algebra of the Kronecker quiver
652
+ (containing the arrows a:x->y and b:x->y) over Rational Field
653
+ sage: A.orthogonal_idempotents_central_mod_radical() # needs sage.rings.number_field
654
+ (x, y)
655
+
656
+ ::
657
+
658
+ sage: # needs sage.modules sage.rings.number_field
659
+ sage: Z12 = Monoids().Finite().example(); Z12
660
+ An example of a finite multiplicative monoid: the integers modulo 12
661
+ sage: A = Z12.algebra(QQ)
662
+ sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
663
+ sage: sorted(idempotents, key=str)
664
+ [-B[0] + 1/2*B[4] + 1/2*B[8],
665
+ 1/2*B[4] - 1/2*B[8],
666
+ 1/2*B[9] + 1/2*B[3] - B[0],
667
+ 1/2*B[9] - 1/2*B[3],
668
+ 1/4*B[1] + 1/4*B[11] - 1/4*B[5] - 1/4*B[7],
669
+ 1/4*B[1] - 1/2*B[9] + 1/4*B[5] - 1/4*B[7] + 1/2*B[3] - 1/4*B[11],
670
+ 1/4*B[1] - 1/2*B[9] - 1/2*B[3] + 1/4*B[11] + 1/4*B[5] + 1/4*B[7] + B[0] - 1/2*B[4] - 1/2*B[8],
671
+ 1/4*B[1] - 1/4*B[5] + 1/4*B[7] - 1/4*B[11] - 1/2*B[4] + 1/2*B[8],
672
+ B[0]]
673
+ sage: sum(idempotents) == 1
674
+ True
675
+ sage: all(e*e == e for e in idempotents)
676
+ True
677
+ sage: all(e*f == 0 and f*e == 0
678
+ ....: for e in idempotents for f in idempotents if e != f)
679
+ True
680
+
681
+ This is best tested with::
682
+
683
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents) # needs sage.graphs sage.modules sage.rings.number_field
684
+ True
685
+
686
+ We construct orthogonal idempotents for the algebra of the
687
+ `0`-Hecke monoid::
688
+
689
+ sage: # needs sage.combinat sage.graphs sage.groups sage.modules
690
+ sage: from sage.monoids.hecke_monoid import HeckeMonoid
691
+ sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
692
+ sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
693
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
694
+ True
695
+ """
696
+ one = self.one()
697
+ # Construction of the orthogonal idempotents
698
+ idempotents = []
699
+ f = self.zero()
700
+ for g in self.semisimple_quotient().central_orthogonal_idempotents():
701
+ fi = self.idempotent_lift((one - f) * g.lift() * (one - f))
702
+ idempotents.append(fi)
703
+ f = f + fi
704
+ return tuple(idempotents)
705
+
706
+ def idempotent_lift(self, x):
707
+ r"""
708
+ Lift an idempotent of the semisimple quotient into an idempotent of ``self``.
709
+
710
+ Let `A` be this finite dimensional algebra and `\pi` be
711
+ the projection `A \rightarrow \overline{A}` on its
712
+ semisimple quotient. Let `\overline{x}` be an idempotent
713
+ of `\overline A`, and `x` any lift thereof in `A`. This
714
+ returns an idempotent `e` of `A` such that `\pi(e)=\pi(x)`
715
+ and `e` is a polynomial in `x`.
716
+
717
+ INPUT:
718
+
719
+ - ``x`` -- an element of `A` that projects on an idempotent
720
+ `\overline x` of the semisimple quotient of `A`.
721
+ Alternatively one may give as input the idempotent
722
+ `\overline{x}`, in which case some lift thereof will be
723
+ taken for `x`.
724
+
725
+ OUTPUT: the idempotent `e` of ``self``
726
+
727
+ ALGORITHM:
728
+
729
+ Iterate the formula `1 - (1 - x^2)^2` until having an
730
+ idempotent.
731
+
732
+ See [CR1962]_ for correctness and termination proofs.
733
+
734
+ EXAMPLES::
735
+
736
+ sage: # needs sage.graphs sage.modules
737
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
738
+ sage: S = A.semisimple_quotient()
739
+ sage: A.idempotent_lift(S.basis()['x'])
740
+ x
741
+ sage: A.idempotent_lift(A.basis()['y'])
742
+ y
743
+
744
+ A less trivial example::
745
+
746
+ sage: # needs sage.combinat sage.modules
747
+ sage: B = DescentAlgebra(QQ, 4).B()
748
+ sage: a = 1/8*B[[1, 1, 1, 1]] - 1/2*B[[2, 1, 1]] + 1/2*B[[2, 2]]
749
+ sage: a ** 2 == a # not idempotent, but idempotent mod radical
750
+ False
751
+ sage: al = B.idempotent_lift(a)
752
+ sage: al ** 2 == al
753
+ True
754
+ sage: (a - al) ** 2
755
+ 0
756
+ """
757
+ if not self.is_parent_of(x):
758
+ x = x.lift()
759
+ p = self.semisimple_quotient().retract(x)
760
+ if p * p != p:
761
+ raise ValueError("%s does not retract to an idempotent." % p)
762
+ x_prev = None
763
+ while x != x_prev:
764
+ tmp = x
765
+ y = x ** 2
766
+ x = 2*y - y**2 # == one - (one - x**2)**2
767
+ x_prev = tmp
768
+ return x
769
+
770
+ @cached_method
771
+ def cartan_invariants_matrix(self):
772
+ r"""
773
+ Return the Cartan invariants matrix of the algebra.
774
+
775
+ OUTPUT: a matrix of nonnegative integers
776
+
777
+ .. TODO::
778
+
779
+ Both the implementation and the documentation
780
+ assume that the algebra is split over its
781
+ base field.
782
+
783
+ Let `A` be this finite-dimensional algebra and
784
+ `(S_i)_{i\in I}` be representatives of the right simple
785
+ modules of `A`. Note that their adjoints `S_i^*` are
786
+ representatives of the left simple modules.
787
+
788
+ Let `(P^L_i)_{i\in I}` and `(P^R_i)_{i\in I}` be
789
+ respectively representatives of the corresponding
790
+ indecomposable projective left and right modules of `A`.
791
+ In particular, we assume that the indexing is consistent
792
+ so that `S_i^*=\operatorname{top} P^L_i` and
793
+ `S_i=\operatorname{top} P^R_i`.
794
+
795
+ The *Cartan invariant matrix* `(C_{i,j})_{i,j\in I}` is a
796
+ matrix of nonnegative integers that encodes much of the
797
+ representation theory of `A`; namely:
798
+
799
+ - `C_{i,j}` counts how many times `S_i^*\otimes S_j`
800
+ appears as composition factor of `A` seen as a bimodule
801
+ over itself;
802
+
803
+ - `C_{i,j}=\dim Hom_A(P^R_j, P^R_i)`;
804
+
805
+ - `C_{i,j}` counts how many times `S_j` appears as
806
+ composition factor of `P^R_i`;
807
+
808
+ - `C_{i,j}=\dim Hom_A(P^L_i, P^L_j)`;
809
+
810
+ - `C_{i,j}` counts how many times `S_i^*` appears as
811
+ composition factor of `P^L_j`.
812
+
813
+ In the commutative case, the Cartan invariant matrix is
814
+ diagonal. In the context of solving systems of
815
+ multivariate polynomial equations of dimension zero, `A`
816
+ is the quotient of the polynomial ring by the ideal
817
+ generated by the equations, the simple modules correspond
818
+ to the roots, and the numbers `C_{i,i}` give the
819
+ multiplicities of those roots.
820
+
821
+ .. NOTE::
822
+
823
+ For simplicity, the current implementation assumes
824
+ that the index set `I` is of the form
825
+ `\{0,\dots,n-1\}`. Better indexations will be possible
826
+ in the future.
827
+
828
+ ALGORITHM:
829
+
830
+ The Cartan invariant matrix of `A` is computed from the
831
+ dimension of the summands of its Peirce decomposition.
832
+
833
+ .. SEEALSO::
834
+
835
+ - :meth:`peirce_decomposition`
836
+ - :meth:`isotypic_projective_modules`
837
+
838
+ EXAMPLES:
839
+
840
+ For a semisimple algebra, in particular for group algebras
841
+ in characteristic zero, the Cartan invariants matrix is
842
+ the identity::
843
+
844
+ sage: A3 = SymmetricGroup(3).algebra(QQ) # needs sage.combinat sage.groups sage.modules
845
+ sage: A3.cartan_invariants_matrix() # needs sage.combinat sage.groups sage.modules
846
+ [1 0 0]
847
+ [0 1 0]
848
+ [0 0 1]
849
+
850
+ For the path algebra of a quiver, the Cartan invariants
851
+ matrix counts the number of paths between two vertices::
852
+
853
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
854
+ sage: A.cartan_invariants_matrix() # needs sage.modules sage.rings.number_field
855
+ [1 2]
856
+ [0 1]
857
+
858
+ In the commutative case, the Cartan invariant matrix is diagonal::
859
+
860
+ sage: Z12 = Monoids().Finite().example(); Z12
861
+ An example of a finite multiplicative monoid: the integers modulo 12
862
+ sage: A = Z12.algebra(QQ) # needs sage.modules
863
+ sage: A.cartan_invariants_matrix() # needs sage.modules sage.rings.number_field
864
+ [1 0 0 0 0 0 0 0 0]
865
+ [0 1 0 0 0 0 0 0 0]
866
+ [0 0 2 0 0 0 0 0 0]
867
+ [0 0 0 1 0 0 0 0 0]
868
+ [0 0 0 0 2 0 0 0 0]
869
+ [0 0 0 0 0 1 0 0 0]
870
+ [0 0 0 0 0 0 1 0 0]
871
+ [0 0 0 0 0 0 0 2 0]
872
+ [0 0 0 0 0 0 0 0 1]
873
+
874
+ With the algebra of the `0`-Hecke monoid::
875
+
876
+ sage: # needs sage.combinat sage.groups sage.modules
877
+ sage: from sage.monoids.hecke_monoid import HeckeMonoid
878
+ sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
879
+ sage: A.cartan_invariants_matrix() # needs sage.rings.number_field
880
+ [1 0 0 0 0 0 0 0]
881
+ [0 2 1 0 1 1 0 0]
882
+ [0 1 1 0 1 0 0 0]
883
+ [0 0 0 1 0 1 1 0]
884
+ [0 1 1 0 1 0 0 0]
885
+ [0 1 0 1 0 2 1 0]
886
+ [0 0 0 1 0 1 1 0]
887
+ [0 0 0 0 0 0 0 1]
888
+ """
889
+ from sage.matrix.constructor import Matrix
890
+ from sage.rings.integer_ring import ZZ
891
+ A_quo = self.semisimple_quotient()
892
+ idempotents_quo = A_quo.central_orthogonal_idempotents()
893
+ # Dimension of simple modules
894
+ dim_simples = [A_quo.principal_ideal(e).dimension().sqrt()
895
+ for e in idempotents_quo]
896
+ # Orthogonal idempotents
897
+ idempotents = self.orthogonal_idempotents_central_mod_radical()
898
+
899
+ def C(i, j):
900
+ summand = self.peirce_summand(idempotents[i], idempotents[j])
901
+ return summand.dimension() / (dim_simples[i] * dim_simples[j])
902
+ m = Matrix(ZZ, len(idempotents), C)
903
+ m.set_immutable()
904
+ return m
905
+
906
+ def isotypic_projective_modules(self, side='left'):
907
+ r"""
908
+ Return the isotypic projective ``side`` ``self``-modules.
909
+
910
+ .. TODO::
911
+
912
+ The current implementation assumes that the
913
+ algebra is split over its base field.
914
+
915
+ Let `P_i` be representatives of the indecomposable
916
+ projective ``side``-modules of this finite dimensional
917
+ algebra `A`, and `S_i` be the associated simple modules.
918
+
919
+ The regular ``side`` representation of `A` can be
920
+ decomposed as a direct sum `A = \bigoplus_i Q_i` where
921
+ each `Q_i` is an isotypic projective module; namely `Q_i`
922
+ is the direct sum of `\dim S_i` copies of the
923
+ indecomposable projective module `P_i`. This decomposition
924
+ is not unique.
925
+
926
+ The isotypic projective modules are constructed as
927
+ `Q_i=e_iA`, where the `(e_i)_i` is the decomposition of
928
+ the identity into orthogonal idempotents obtained by
929
+ lifting the central orthogonal idempotents of the
930
+ semisimple quotient of `A`.
931
+
932
+ INPUT:
933
+
934
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'left'``)
935
+
936
+ OUTPUT: list of subspaces of ``self``
937
+
938
+ EXAMPLES::
939
+
940
+ sage: # needs sage.graphs sage.modules sage.rings.number_field
941
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
942
+ An example of a finite dimensional algebra with basis:
943
+ the path algebra of the Kronecker quiver
944
+ (containing the arrows a:x->y and b:x->y) over Rational Field
945
+ sage: Q = A.isotypic_projective_modules(side='left'); Q
946
+ [Free module generated by {0} over Rational Field,
947
+ Free module generated by {0, 1, 2} over Rational Field]
948
+ sage: [[x.lift() for x in Qi.basis()]
949
+ ....: for Qi in Q]
950
+ [[x],
951
+ [y, a, b]]
952
+
953
+ We check that the sum of the dimensions of the isotypic
954
+ projective modules is the dimension of ``self``::
955
+
956
+ sage: sum([Qi.dimension() for Qi in Q]) == A.dimension() # needs sage.graphs sage.modules sage.rings.number_field
957
+ True
958
+
959
+ .. SEEALSO::
960
+
961
+ - :meth:`orthogonal_idempotents_central_mod_radical`
962
+ - :meth:`peirce_decomposition`
963
+ """
964
+ return [self.principal_ideal(e, side) for e in
965
+ self.orthogonal_idempotents_central_mod_radical()]
966
+
967
+ @cached_method
968
+ def peirce_summand(self, ei, ej):
969
+ r"""
970
+ Return the Peirce decomposition summand `e_i A e_j`.
971
+
972
+ INPUT:
973
+
974
+ - ``self`` -- an algebra `A`
975
+
976
+ - ``ei``, ``ej`` -- two idempotents of `A`
977
+
978
+ OUTPUT: `e_i A e_j`, as a subspace of `A`
979
+
980
+ .. SEEALSO::
981
+
982
+ - :meth:`peirce_decomposition`
983
+ - :meth:`principal_ideal`
984
+
985
+ EXAMPLES::
986
+
987
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example()
988
+ sage: idemp = A.orthogonal_idempotents_central_mod_radical() # needs sage.rings.number_field
989
+ sage: A.peirce_summand(idemp[0], idemp[1]) # needs sage.rings.number_field
990
+ Free module generated by {0, 1} over Rational Field
991
+ sage: A.peirce_summand(idemp[1], idemp[0]) # needs sage.rings.number_field
992
+ Free module generated by {} over Rational Field
993
+
994
+ We recover the `2\times2` block of `\QQ[S_4]`
995
+ corresponding to the unique simple module of dimension `2`
996
+ of the symmetric group `S_4`::
997
+
998
+ sage: # needs sage.combinat sage.groups sage.rings.number_field
999
+ sage: A4 = SymmetricGroup(4).algebra(QQ)
1000
+ sage: e = A4.central_orthogonal_idempotents()[2]
1001
+ sage: A4.peirce_summand(e, e)
1002
+ Free module generated by {0, 1, 2, 3} over Rational Field
1003
+
1004
+ TESTS:
1005
+
1006
+ We check each idempotent belongs to its own Peirce summand
1007
+ (see :issue:`24687`)::
1008
+
1009
+ sage: # needs sage.combinat sage.groups sage.rings.number_field
1010
+ sage: from sage.monoids.hecke_monoid import HeckeMonoid
1011
+ sage: M = HeckeMonoid(SymmetricGroup(4))
1012
+ sage: A = M.algebra(QQ)
1013
+ sage: Idms = A.orthogonal_idempotents_central_mod_radical()
1014
+ sage: all(A.peirce_summand(e, e).retract(e)
1015
+ ....: in A.peirce_summand(e, e) for e in Idms)
1016
+ True
1017
+ """
1018
+ B = self.basis()
1019
+ phi = self.module_morphism(on_basis=lambda k: ei * B[k] * ej,
1020
+ codomain=self, triangular='lower')
1021
+ ideal = phi.matrix(side='right').image()
1022
+
1023
+ return self.submodule([self.from_vector(v) for v in ideal.basis()],
1024
+ already_echelonized=True)
1025
+
1026
+ def peirce_decomposition(self, idempotents=None, check=True):
1027
+ r"""
1028
+ Return a Peirce decomposition of ``self``.
1029
+
1030
+ Let `(e_i)_i` be a collection of orthogonal idempotents of
1031
+ `A` with sum `1`. The *Peirce decomposition* of `A` is the
1032
+ decomposition of `A` into the direct sum of the subspaces
1033
+ `e_i A e_j`.
1034
+
1035
+ With the default collection of orthogonal idempotents, one has
1036
+
1037
+ .. MATH::
1038
+
1039
+ \dim e_i A e_j = C_{i,j} \dim S_i \dim S_j
1040
+
1041
+ where `(S_i)_i` are the simple modules of `A` and
1042
+ `(C_{i,j})_{i, j}` is the Cartan invariants matrix.
1043
+
1044
+ INPUT:
1045
+
1046
+ - ``idempotents`` -- list of orthogonal idempotents
1047
+ `(e_i)_{i=0,\ldots,n}` of the algebra that sum to `1`
1048
+ (default: the idempotents returned by
1049
+ :meth:`orthogonal_idempotents_central_mod_radical`)
1050
+
1051
+ - ``check`` -- boolean (default: ``True``); whether to check that
1052
+ the idempotents are indeed orthogonal and idempotent and
1053
+ sum to `1`
1054
+
1055
+ OUTPUT:
1056
+
1057
+ A list of lists `l` such that ``l[i][j]`` is the subspace
1058
+ `e_i A e_j`.
1059
+
1060
+ .. SEEALSO::
1061
+
1062
+ - :meth:`orthogonal_idempotents_central_mod_radical`
1063
+ - :meth:`cartan_invariants_matrix`
1064
+
1065
+ EXAMPLES::
1066
+
1067
+ sage: # needs sage.graphs sage.groups sage.modules sage.rings.number_field
1068
+ sage: A = Algebras(QQ).FiniteDimensional().WithBasis().example(); A
1069
+ An example of a finite dimensional algebra with basis:
1070
+ the path algebra of the Kronecker quiver
1071
+ (containing the arrows a:x->y and b:x->y) over Rational Field
1072
+ sage: A.orthogonal_idempotents_central_mod_radical()
1073
+ (x, y)
1074
+ sage: decomposition = A.peirce_decomposition(); decomposition
1075
+ [[Free module generated by {0} over Rational Field,
1076
+ Free module generated by {0, 1} over Rational Field],
1077
+ [Free module generated by {} over Rational Field,
1078
+ Free module generated by {0} over Rational Field]]
1079
+ sage: [ [[x.lift() for x in decomposition[i][j].basis()]
1080
+ ....: for j in range(2)]
1081
+ ....: for i in range(2)]
1082
+ [[[x], [a, b]],
1083
+ [[], [y]]]
1084
+
1085
+ We recover that the group algebra of the symmetric group
1086
+ `S_4` is a block matrix algebra::
1087
+
1088
+ sage: # needs sage.combinat sage.groups sage.modules sage.rings.number_field
1089
+ sage: A = SymmetricGroup(4).algebra(QQ)
1090
+ sage: decomposition = A.peirce_decomposition() # long time
1091
+ sage: [[decomposition[i][j].dimension() # long time (4s)
1092
+ ....: for j in range(len(decomposition))]
1093
+ ....: for i in range(len(decomposition))]
1094
+ [[9, 0, 0, 0, 0],
1095
+ [0, 9, 0, 0, 0],
1096
+ [0, 0, 4, 0, 0],
1097
+ [0, 0, 0, 1, 0],
1098
+ [0, 0, 0, 0, 1]]
1099
+
1100
+ The dimension of each block is `d^2`, where `d` is the
1101
+ dimension of the corresponding simple module of `S_4`. The
1102
+ latter are given by::
1103
+
1104
+ sage: [p.standard_tableaux().cardinality() for p in Partitions(4)] # needs sage.combinat
1105
+ [1, 3, 2, 3, 1]
1106
+ """
1107
+ if idempotents is None:
1108
+ idempotents = self.orthogonal_idempotents_central_mod_radical()
1109
+ if check:
1110
+ if not self.is_identity_decomposition_into_orthogonal_idempotents(idempotents):
1111
+ raise ValueError("Not a decomposition of the identity into orthogonal idempotents")
1112
+ return [[self.peirce_summand(ei, ej) for ej in idempotents]
1113
+ for ei in idempotents]
1114
+
1115
+ def is_identity_decomposition_into_orthogonal_idempotents(self, l):
1116
+ r"""
1117
+ Return whether ``l`` is a decomposition of the identity
1118
+ into orthogonal idempotents.
1119
+
1120
+ INPUT:
1121
+
1122
+ - ``l`` -- list or iterable of elements of ``self``
1123
+
1124
+ EXAMPLES::
1125
+
1126
+ sage: # needs sage.graphs sage.modules
1127
+ sage: A = FiniteDimensionalAlgebrasWithBasis(QQ).example(); A
1128
+ An example of a finite dimensional algebra with basis:
1129
+ the path algebra of the Kronecker quiver
1130
+ (containing the arrows a:x->y and b:x->y) over Rational Field
1131
+ sage: x,y,a,b = A.algebra_generators(); x,y,a,b
1132
+ (x, y, a, b)
1133
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents([A.one()])
1134
+ True
1135
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents([x, y])
1136
+ True
1137
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents([x + a, y - a])
1138
+ True
1139
+
1140
+ Here the idempotents do not sum up to `1`::
1141
+
1142
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents([x]) # needs sage.graphs sage.modules
1143
+ False
1144
+
1145
+ Here `1+x` and `-x` are neither idempotent nor orthogonal::
1146
+
1147
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents([1 + x, -x]) # needs sage.graphs sage.modules
1148
+ False
1149
+
1150
+ With the algebra of the `0`-Hecke monoid::
1151
+
1152
+ sage: # needs sage.combinat sage.groups sage.modules sage.rings.number_field
1153
+ sage: from sage.monoids.hecke_monoid import HeckeMonoid
1154
+ sage: A = HeckeMonoid(SymmetricGroup(4)).algebra(QQ)
1155
+ sage: idempotents = A.orthogonal_idempotents_central_mod_radical()
1156
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents(idempotents)
1157
+ True
1158
+
1159
+ Here are some more counterexamples:
1160
+
1161
+ 1. Some orthogonal elements summing to `1` but not being
1162
+ idempotent::
1163
+
1164
+ sage: # needs sage.libs.pari sage.modules
1165
+ sage: class PQAlgebra(CombinatorialFreeModule):
1166
+ ....: def __init__(self, F, p):
1167
+ ....: # Construct the quotient algebra F[x] / p,
1168
+ ....: # where p is a univariate polynomial.
1169
+ ....: R = parent(p); x = R.gen()
1170
+ ....: I = R.ideal(p)
1171
+ ....: self._xbar = R.quotient(I).gen()
1172
+ ....: basis_keys = [self._xbar**i for i in range(p.degree())]
1173
+ ....: CombinatorialFreeModule.__init__(self, F, basis_keys,
1174
+ ....: category=Algebras(F).FiniteDimensional().WithBasis())
1175
+ ....: def x(self):
1176
+ ....: return self(self._xbar)
1177
+ ....: def one(self):
1178
+ ....: return self.basis()[self.base_ring().one()]
1179
+ ....: def product_on_basis(self, w1, w2):
1180
+ ....: return self.from_vector(vector(w1*w2))
1181
+ sage: R.<x> = PolynomialRing(QQ)
1182
+ sage: A = PQAlgebra(QQ, x**3 - x**2 + x + 1); y = A.x()
1183
+ sage: a, b = y, 1 - y
1184
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
1185
+ False
1186
+
1187
+ For comparison::
1188
+
1189
+ sage: # needs sage.libs.pari sage.modules
1190
+ sage: A = PQAlgebra(QQ, x**2 - x); y = A.x()
1191
+ sage: a, b = y, 1-y
1192
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
1193
+ True
1194
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, A.zero(), b))
1195
+ True
1196
+ sage: A = PQAlgebra(QQ, x**3 - x**2 + x - 1); y = A.x()
1197
+ sage: a = (y**2 + 1) / 2
1198
+ sage: b = 1 - a
1199
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, b))
1200
+ True
1201
+
1202
+ 2. Some idempotents summing to 1 but not orthogonal::
1203
+
1204
+ sage: # needs sage.libs.pari sage.modules
1205
+ sage: R.<x> = PolynomialRing(GF(2))
1206
+ sage: A = PQAlgebra(GF(2), x)
1207
+ sage: a = A.one()
1208
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,))
1209
+ True
1210
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a, a, a))
1211
+ False
1212
+
1213
+ 3. Some orthogonal idempotents not summing to the identity::
1214
+
1215
+ sage: # needs sage.libs.pari sage.modules
1216
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents((a,a))
1217
+ False
1218
+ sage: A.is_identity_decomposition_into_orthogonal_idempotents(())
1219
+ False
1220
+ """
1221
+ return (self.sum(l) == self.one()
1222
+ and all(e*e == e for e in l)
1223
+ and all(e*f == 0 and f*e == 0 for i, e in enumerate(l)
1224
+ for f in l[:i]))
1225
+
1226
+ @cached_method
1227
+ def is_commutative(self) -> bool:
1228
+ """
1229
+ Return whether ``self`` is a commutative algebra.
1230
+
1231
+ EXAMPLES::
1232
+
1233
+ sage: # needs sage.combinat sage.groups
1234
+ sage: S4 = SymmetricGroupAlgebra(QQ, 4)
1235
+ sage: S4.is_commutative()
1236
+ False
1237
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1238
+ sage: S2.is_commutative()
1239
+ True
1240
+ """
1241
+ B = list(self.basis())
1242
+ try: # See if 1 is a basis element, if so, remove it
1243
+ B.remove(self.one())
1244
+ except ValueError:
1245
+ pass
1246
+ return all(b*bp == bp*b for i,b in enumerate(B) for bp in B[i+1:])
1247
+
1248
+ class ElementMethods:
1249
+
1250
+ def to_matrix(self, base_ring=None, action=operator.mul, side='left'):
1251
+ """
1252
+ Return the matrix of the action of ``self`` on the algebra.
1253
+
1254
+ INPUT:
1255
+
1256
+ - ``base_ring`` -- the base ring for the matrix to be constructed
1257
+ - ``action`` -- a bivariate function (default: :func:`operator.mul`)
1258
+ - ``side`` -- ``'left'`` or ``'right'`` (default: ``'left'``)
1259
+
1260
+ EXAMPLES::
1261
+
1262
+ sage: # needs sage.combinat sage.groups
1263
+ sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
1264
+ sage: a = QS3([2,1,3])
1265
+ sage: a.to_matrix(side='left')
1266
+ [0 0 1 0 0 0]
1267
+ [0 0 0 0 1 0]
1268
+ [1 0 0 0 0 0]
1269
+ [0 0 0 0 0 1]
1270
+ [0 1 0 0 0 0]
1271
+ [0 0 0 1 0 0]
1272
+ sage: a.to_matrix(side='right')
1273
+ [0 0 1 0 0 0]
1274
+ [0 0 0 1 0 0]
1275
+ [1 0 0 0 0 0]
1276
+ [0 1 0 0 0 0]
1277
+ [0 0 0 0 0 1]
1278
+ [0 0 0 0 1 0]
1279
+ sage: a.to_matrix(base_ring=RDF, side='left')
1280
+ [0.0 0.0 1.0 0.0 0.0 0.0]
1281
+ [0.0 0.0 0.0 0.0 1.0 0.0]
1282
+ [1.0 0.0 0.0 0.0 0.0 0.0]
1283
+ [0.0 0.0 0.0 0.0 0.0 1.0]
1284
+ [0.0 1.0 0.0 0.0 0.0 0.0]
1285
+ [0.0 0.0 0.0 1.0 0.0 0.0]
1286
+
1287
+ AUTHORS: Mike Hansen, ...
1288
+ """
1289
+ basis = self.parent().basis()
1290
+ action_left = action
1291
+ if side == 'right':
1292
+ action = lambda x: action_left(basis[x], self)
1293
+ else:
1294
+ action = lambda x: action_left(self, basis[x])
1295
+ endo = self.parent().module_morphism(on_basis=action, codomain=self.parent())
1296
+ return endo.matrix(base_ring=base_ring)
1297
+
1298
+ _matrix_ = to_matrix # For temporary backward compatibility
1299
+ on_left_matrix = to_matrix
1300
+
1301
+ def __invert__(self):
1302
+ r"""
1303
+ Return the inverse of ``self`` if it exists, and
1304
+ otherwise raise an error.
1305
+
1306
+ .. WARNING::
1307
+
1308
+ This always returns the inverse or fails on elements
1309
+ that are not invertible when the base ring is a field.
1310
+ In other cases, it may fail to find an inverse even
1311
+ if one exists if we cannot solve a linear system of
1312
+ equations over (the fraction field of) the base ring.
1313
+
1314
+ EXAMPLES::
1315
+
1316
+ sage: # needs sage.combinat sage.groups
1317
+ sage: QS3 = SymmetricGroupAlgebra(QQ, 3)
1318
+ sage: P = Permutation
1319
+ sage: a = 3 * QS3(P([1,2,3])) + QS3(P([1,3,2])) + QS3(P([2,1,3]))
1320
+ sage: b = ~a; b
1321
+ 9/20*[1, 2, 3] - 7/40*[1, 3, 2] - 7/40*[2, 1, 3]
1322
+ + 3/40*[2, 3, 1] + 3/40*[3, 1, 2] - 1/20*[3, 2, 1]
1323
+ sage: a * b
1324
+ [1, 2, 3]
1325
+ sage: ~b == a
1326
+ True
1327
+ sage: a = 3 * QS3.one()
1328
+ sage: b = ~a
1329
+ sage: b * a == QS3.one()
1330
+ True
1331
+ sage: b == 1/3 * QS3.one()
1332
+ True
1333
+ sage: ~b == a
1334
+ True
1335
+
1336
+ sage: R.<t> = QQ[]
1337
+ sage: RS3 = SymmetricGroupAlgebra(R, 3) # needs sage.combinat sage.groups
1338
+ sage: a = RS3(P([1,2,3])) - RS3(P([1,3,2])) + RS3(P([2,1,3])); ~a # needs sage.combinat sage.groups
1339
+ -1/2*[1, 3, 2] + 1/2*[2, 1, 3] + 1/2*[2, 3, 1] + 1/2*[3, 1, 2]
1340
+
1341
+ Some examples on elements that do not have an inverse::
1342
+
1343
+ sage: # needs sage.combinat sage.groups
1344
+ sage: c = 2 * QS3(P([1,2,3])) + QS3(P([1,3,2])) + QS3(P([2,1,3]))
1345
+ sage: ~c
1346
+ Traceback (most recent call last):
1347
+ ...
1348
+ ValueError: cannot invert self (= 2*[1, 2, 3] + [1, 3, 2] + [2, 1, 3])
1349
+ sage: ZS3 = SymmetricGroupAlgebra(ZZ, 3)
1350
+ sage: aZ = 3 * ZS3(P([1,2,3])) + ZS3(P([1,3,2])) + ZS3(P([2,1,3]))
1351
+ sage: ~aZ
1352
+ Traceback (most recent call last):
1353
+ ...
1354
+ ValueError: cannot invert self (= 3*[1, 2, 3] + [1, 3, 2] + [2, 1, 3])
1355
+ sage: x = 2 * ZS3.one()
1356
+ sage: ~x
1357
+ Traceback (most recent call last):
1358
+ ...
1359
+ ValueError: cannot invert self (= 2*[1, 2, 3])
1360
+
1361
+ TESTS:
1362
+
1363
+ An algebra that does not define ``one_basis()``::
1364
+
1365
+ sage: # needs sage.combinat sage.groups
1366
+ sage: I = DescentAlgebra(QQ, 3).I()
1367
+ sage: a = 3 * I.one()
1368
+ sage: ~a == 1/3 * I.one()
1369
+ True
1370
+ """
1371
+ alg = self.parent()
1372
+ R = alg.base_ring()
1373
+ ob = None
1374
+ try:
1375
+ ob = alg.one_basis()
1376
+ except (AttributeError, TypeError, ValueError):
1377
+ pass
1378
+ if ob is not None:
1379
+ # inverting a scalar multiple of 1
1380
+ # (a trivial but frequent use case)
1381
+ mc = self.monomial_coefficients(copy=False)
1382
+ if len(mc) == 1 and ob in mc:
1383
+ try:
1384
+ return alg.term(ob, R(~mc[ob]))
1385
+ except (ValueError, TypeError):
1386
+ raise ValueError("cannot invert self (= %s)" % self)
1387
+
1388
+ e = alg.one().to_vector()
1389
+ A = self.to_matrix()
1390
+ try:
1391
+ inv = A.solve_right(e)
1392
+ inv.change_ring(R)
1393
+ return alg.from_vector(inv)
1394
+ except (ValueError, TypeError):
1395
+ raise ValueError("cannot invert self (= %s)" % self)
1396
+
1397
+ class Cellular(CategoryWithAxiom_over_base_ring):
1398
+ r"""
1399
+ Cellular algebras.
1400
+
1401
+ Let `R` be a commutative ring. A `R`-algebra `A` is a
1402
+ *cellular algebra* if it has a *cell datum*, which is
1403
+ a tuple `(\Lambda, i, M, C)`, where `\Lambda` is finite
1404
+ poset with order `\ge`, if `\mu \in \Lambda` then `T(\mu)`
1405
+ is a finite set and
1406
+
1407
+ .. MATH::
1408
+
1409
+ C \colon \coprod_{\mu\in\Lambda}T(\mu) \times T(\mu)
1410
+ \longrightarrow A; (\mu,s,t) \mapsto c^\mu_{st}
1411
+ \text{ is an injective map}
1412
+
1413
+ such that the following holds:
1414
+
1415
+ * The set `\{c^\mu_{st}\mid \mu\in\Lambda, s,t\in T(\mu)\}` is a
1416
+ basis of `A`.
1417
+ * If `a \in A` and `\mu\in\Lambda, s,t \in T(\mu)` then:
1418
+
1419
+ .. MATH::
1420
+
1421
+ a c^\mu_{st} = \sum_{u\in T(\mu)} r_a(s,u) c^\mu_{ut}
1422
+ \pmod{A^{>\mu}},
1423
+
1424
+ where `A^{>\mu}` is spanned by
1425
+
1426
+ .. MATH::
1427
+
1428
+ \{ c^\nu_{ab} \mid \nu > \mu \text{ and } a,b \in T(\nu) \}.
1429
+
1430
+ Moreover, the scalar `r_a(s,u)` depends only on `a`, `s` and
1431
+ `u` and, in particular, is independent of `t`.
1432
+
1433
+ * The map `\iota \colon A \longrightarrow A; c^\mu_{st} \mapsto
1434
+ c^\mu_{ts}` is an algebra anti-isomorphism.
1435
+
1436
+ A *cellular basis* for `A` is any basis of the form
1437
+ `\{c^\mu_{st} \mid \mu \in \Lambda, s,t \in T(\mu)\}`.
1438
+
1439
+ Note that in particular, the scalars `r_a(u, s)` in the second
1440
+ condition do not depend on `t`.
1441
+
1442
+ REFERENCES:
1443
+
1444
+ - [GrLe1996]_
1445
+ - [KX1998]_
1446
+ - [Mat1999]_
1447
+ - :wikipedia:`Cellular_algebra`
1448
+ - http://webusers.imj-prg.fr/~bernhard.keller/ictp2006/lecturenotes/xi.pdf
1449
+ """
1450
+ class ParentMethods:
1451
+ def _test_cellular(self, **options):
1452
+ """
1453
+ Check that ``self`` satisfies the properties of a
1454
+ cellular algebra.
1455
+
1456
+ EXAMPLES::
1457
+
1458
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups sage.modules
1459
+ sage: S._test_cellular() # needs sage.combinat sage.groups sage.modules
1460
+ """
1461
+ tester = self._tester(**options)
1462
+ cell_basis = self.cellular_basis()
1463
+ B = cell_basis.basis()
1464
+ P = self.cell_poset()
1465
+ for mu in P:
1466
+ C = self.cell_module_indices(mu)
1467
+ for s in C:
1468
+ t = C[0]
1469
+ vals = []
1470
+ basis_elt = B[(mu, s, t)]
1471
+ for a in B:
1472
+ elt = a * basis_elt
1473
+ tester.assertTrue( all(P.lt(i[0], mu) or i[2] == t
1474
+ for i in elt.support()) )
1475
+ vals.append([elt[(mu, u, t)] for u in C])
1476
+ for t in C[1:]:
1477
+ basis_elt = B[(mu, s, t)]
1478
+ for i,a in enumerate(B):
1479
+ elt = a * basis_elt
1480
+ tester.assertTrue( all(P.lt(i[0], mu) or i[2] == t
1481
+ for i in elt.support()) )
1482
+ tester.assertEqual(vals[i], [elt[(mu, u, t)]
1483
+ for u in C])
1484
+
1485
+ @abstract_method
1486
+ def cell_poset(self):
1487
+ """
1488
+ Return the cell poset of ``self``.
1489
+
1490
+ EXAMPLES::
1491
+
1492
+ sage: S = SymmetricGroupAlgebra(QQ, 4) # needs sage.combinat sage.groups
1493
+ sage: S.cell_poset() # needs sage.combinat sage.groups
1494
+ Finite poset containing 5 elements
1495
+ """
1496
+
1497
+ @abstract_method
1498
+ def cell_module_indices(self, mu):
1499
+ r"""
1500
+ Return the indices of the cell module of ``self``
1501
+ indexed by ``mu`` .
1502
+
1503
+ This is the finite set `M(\lambda)`.
1504
+
1505
+ EXAMPLES::
1506
+
1507
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
1508
+ sage: S.cell_module_indices([2,1]) # needs sage.combinat sage.groups
1509
+ Standard tableaux of shape [2, 1]
1510
+ """
1511
+
1512
+ @abstract_method(optional=True)
1513
+ def _to_cellular_element(self, i):
1514
+ """
1515
+ Return the image of the basis index ``i`` in the
1516
+ cellular basis of ``self``.
1517
+
1518
+ EXAMPLES::
1519
+
1520
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
1521
+ sage: S._to_cellular_element # no implementation currently uses this # needs sage.combinat sage.groups
1522
+ NotImplemented
1523
+ """
1524
+
1525
+ @abstract_method(optional=True)
1526
+ def _from_cellular_index(self, x):
1527
+ """
1528
+ Return the image in ``self`` from the index of the
1529
+ cellular basis ``x``.
1530
+
1531
+ EXAMPLES::
1532
+
1533
+ sage: # needs sage.combinat sage.groups
1534
+ sage: S = SymmetricGroupAlgebra(QQ, 3)
1535
+ sage: mu = Partition([2,1])
1536
+ sage: s = StandardTableau([[1,2],[3]])
1537
+ sage: t = StandardTableau([[1,3],[2]])
1538
+ sage: S._from_cellular_index((mu, s, t))
1539
+ 1/4*[1, 3, 2] - 1/4*[2, 3, 1] + 1/4*[3, 1, 2] - 1/4*[3, 2, 1]
1540
+ """
1541
+
1542
+ def cellular_involution(self, x):
1543
+ """
1544
+ Return the cellular involution of ``x`` in ``self``.
1545
+
1546
+ EXAMPLES::
1547
+
1548
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
1549
+ sage: for b in S.basis(): b, S.cellular_involution(b) # needs sage.combinat sage.groups
1550
+ ([1, 2, 3], [1, 2, 3])
1551
+ ([1, 3, 2], 49/48*[1, 3, 2] + 7/48*[2, 3, 1]
1552
+ - 7/48*[3, 1, 2] - 1/48*[3, 2, 1])
1553
+ ([2, 1, 3], [2, 1, 3])
1554
+ ([2, 3, 1], -7/48*[1, 3, 2] - 1/48*[2, 3, 1]
1555
+ + 49/48*[3, 1, 2] + 7/48*[3, 2, 1])
1556
+ ([3, 1, 2], 7/48*[1, 3, 2] + 49/48*[2, 3, 1]
1557
+ - 1/48*[3, 1, 2] - 7/48*[3, 2, 1])
1558
+ ([3, 2, 1], -1/48*[1, 3, 2] - 7/48*[2, 3, 1]
1559
+ + 7/48*[3, 1, 2] + 49/48*[3, 2, 1])
1560
+ """
1561
+ C = self.cellular_basis()
1562
+ if C is self:
1563
+ M = x.monomial_coefficients(copy=False)
1564
+ return self._from_dict({(i[0], i[2], i[1]): M[i] for i in M},
1565
+ remove_zeros=False)
1566
+ return self(C(x).cellular_involution())
1567
+
1568
+ @cached_method
1569
+ def cells(self):
1570
+ """
1571
+ Return the cells of ``self``.
1572
+
1573
+ EXAMPLES::
1574
+
1575
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
1576
+ sage: dict(S.cells()) # needs sage.combinat sage.groups
1577
+ {[1, 1, 1]: Standard tableaux of shape [1, 1, 1],
1578
+ [2, 1]: Standard tableaux of shape [2, 1],
1579
+ [3]: Standard tableaux of shape [3]}
1580
+ """
1581
+ from sage.sets.family import Family
1582
+ return Family(self.cell_poset(), self.cell_module_indices)
1583
+
1584
+ def cellular_basis(self):
1585
+ """
1586
+ Return the cellular basis of ``self``.
1587
+
1588
+ EXAMPLES::
1589
+
1590
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.groups
1591
+ sage: S.cellular_basis() # needs sage.combinat sage.groups
1592
+ Cellular basis of Symmetric group algebra of order 3
1593
+ over Rational Field
1594
+ """
1595
+ from sage.algebras.cellular_basis import CellularBasis
1596
+ return CellularBasis(self)
1597
+
1598
+ def cell_module(self, mu, **kwds):
1599
+ """
1600
+ Return the cell module indexed by ``mu``.
1601
+
1602
+ EXAMPLES::
1603
+
1604
+ sage: S = SymmetricGroupAlgebra(QQ, 3) # needs sage.combinat sage.graphs sage.groups
1605
+ sage: S.cell_module(Partition([2,1])) # needs sage.combinat sage.graphs sage.groups
1606
+ Cell module indexed by [2, 1] of Cellular basis of
1607
+ Symmetric group algebra of order 3 over Rational Field
1608
+ """
1609
+ from sage.modules.with_basis.cell_module import CellModule
1610
+ return CellModule(self.cellular_basis(), mu, **kwds)
1611
+
1612
+ @cached_method
1613
+ def simple_module_parameterization(self):
1614
+ r"""
1615
+ Return a parameterization of the simple modules of ``self``.
1616
+
1617
+ The set of simple modules are parameterized by
1618
+ `\lambda \in \Lambda` such that the cell module
1619
+ bilinear form `\Phi_{\lambda} \neq 0`.
1620
+
1621
+ EXAMPLES::
1622
+
1623
+ sage: # needs sage.combinat sage.graphs sage.modules
1624
+ sage: TL = TemperleyLiebAlgebra(5, 30, QQ) # semisimple
1625
+ sage: len(TL.radical_basis())
1626
+ 0
1627
+ sage: TL.simple_module_parameterization()
1628
+ (1, 3, 5)
1629
+ sage: TL = TemperleyLiebAlgebra(5, 1, QQ) # not semisimple
1630
+ sage: len(TL.radical_basis())
1631
+ 24
1632
+ sage: TL.simple_module_parameterization()
1633
+ (1, 3, 5)
1634
+ sage: TL = TemperleyLiebAlgebra(6, 30, QQ) # semisimple
1635
+ sage: all(TL.cell_module(la).dimension()
1636
+ ....: == TL.cell_module(la).simple_module().dimension()
1637
+ ....: for la in TL.simple_module_parameterization())
1638
+ True
1639
+ sage: TL.simple_module_parameterization()
1640
+ (0, 2, 4, 6)
1641
+ sage: TL = TemperleyLiebAlgebra(6, 0, QQ) # not semisimple
1642
+ sage: TL.simple_module_parameterization()
1643
+ (2, 4, 6)
1644
+ """
1645
+ return tuple([mu for mu in self.cell_poset()
1646
+ if self.cell_module(mu).nonzero_bilinear_form()])
1647
+
1648
+ class ElementMethods:
1649
+ def cellular_involution(self):
1650
+ """
1651
+ Return the cellular involution on ``self``.
1652
+
1653
+ EXAMPLES::
1654
+
1655
+ sage: # needs sage,combinat sage.groups
1656
+ sage: S = SymmetricGroupAlgebra(QQ, 4)
1657
+ sage: elt = S([3,1,2,4])
1658
+ sage: ci = elt.cellular_involution(); ci
1659
+ 7/48*[1, 3, 2, 4] + 49/48*[2, 3, 1, 4]
1660
+ - 1/48*[3, 1, 2, 4] - 7/48*[3, 2, 1, 4]
1661
+ sage: ci.cellular_involution()
1662
+ [3, 1, 2, 4]
1663
+ """
1664
+ return self.parent().cellular_involution(self)
1665
+
1666
+ class TensorProducts(TensorProductsCategory):
1667
+ """
1668
+ The category of cellular algebras constructed by tensor
1669
+ product of cellular algebras.
1670
+ """
1671
+ @cached_method
1672
+ def extra_super_categories(self):
1673
+ """
1674
+ Tensor products of cellular algebras are cellular.
1675
+
1676
+ EXAMPLES::
1677
+
1678
+ sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
1679
+ sage: cat.Cellular().TensorProducts().extra_super_categories()
1680
+ [Category of finite dimensional cellular algebras with basis
1681
+ over Rational Field]
1682
+ """
1683
+ return [self.base_category()]
1684
+
1685
+ class ParentMethods:
1686
+ @cached_method
1687
+ def cell_poset(self):
1688
+ """
1689
+ Return the cell poset of ``self``.
1690
+
1691
+ EXAMPLES::
1692
+
1693
+ sage: # needs sage.combinar sage.groups
1694
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1695
+ sage: S3 = SymmetricGroupAlgebra(QQ, 3)
1696
+ sage: T = S2.tensor(S3)
1697
+ sage: T.cell_poset() # needs sage.graphs
1698
+ Finite poset containing 6 elements
1699
+ """
1700
+ ret = self._sets[0].cell_poset()
1701
+ for A in self._sets[1:]:
1702
+ ret = ret.product(A.cell_poset())
1703
+ return ret
1704
+
1705
+ def cell_module_indices(self, mu):
1706
+ r"""
1707
+ Return the indices of the cell module of ``self``
1708
+ indexed by ``mu`` .
1709
+
1710
+ This is the finite set `M(\lambda)`.
1711
+
1712
+ EXAMPLES::
1713
+
1714
+ sage: # needs sage.combinat sage.groups
1715
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1716
+ sage: S3 = SymmetricGroupAlgebra(QQ, 3)
1717
+ sage: T = S2.tensor(S3)
1718
+ sage: T.cell_module_indices(([1,1], [2,1]))
1719
+ The Cartesian product of (Standard tableaux of shape [1, 1],
1720
+ Standard tableaux of shape [2, 1])
1721
+ """
1722
+ from sage.categories.cartesian_product import cartesian_product
1723
+ return cartesian_product([self._sets[i].cell_module_indices(x)
1724
+ for i,x in enumerate(mu)])
1725
+
1726
+ @lazy_attribute
1727
+ def cellular_involution(self):
1728
+ """
1729
+ Return the image of the cellular involution of the basis
1730
+ element indexed by ``i``.
1731
+
1732
+ EXAMPLES::
1733
+
1734
+ sage: # needs sage.combinat sage.groups
1735
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1736
+ sage: S3 = SymmetricGroupAlgebra(QQ, 3)
1737
+ sage: T = S2.tensor(S3)
1738
+ sage: for b in T.basis(): b, T.cellular_involution(b)
1739
+ ([1, 2] # [1, 2, 3], [1, 2] # [1, 2, 3])
1740
+ ([1, 2] # [1, 3, 2],
1741
+ 49/48*[1, 2] # [1, 3, 2] + 7/48*[1, 2] # [2, 3, 1]
1742
+ - 7/48*[1, 2] # [3, 1, 2] - 1/48*[1, 2] # [3, 2, 1])
1743
+ ([1, 2] # [2, 1, 3], [1, 2] # [2, 1, 3])
1744
+ ([1, 2] # [2, 3, 1],
1745
+ -7/48*[1, 2] # [1, 3, 2] - 1/48*[1, 2] # [2, 3, 1]
1746
+ + 49/48*[1, 2] # [3, 1, 2] + 7/48*[1, 2] # [3, 2, 1])
1747
+ ([1, 2] # [3, 1, 2],
1748
+ 7/48*[1, 2] # [1, 3, 2] + 49/48*[1, 2] # [2, 3, 1]
1749
+ - 1/48*[1, 2] # [3, 1, 2] - 7/48*[1, 2] # [3, 2, 1])
1750
+ ([1, 2] # [3, 2, 1],
1751
+ -1/48*[1, 2] # [1, 3, 2] - 7/48*[1, 2] # [2, 3, 1]
1752
+ + 7/48*[1, 2] # [3, 1, 2] + 49/48*[1, 2] # [3, 2, 1])
1753
+ ([2, 1] # [1, 2, 3], [2, 1] # [1, 2, 3])
1754
+ ([2, 1] # [1, 3, 2],
1755
+ 49/48*[2, 1] # [1, 3, 2] + 7/48*[2, 1] # [2, 3, 1]
1756
+ - 7/48*[2, 1] # [3, 1, 2] - 1/48*[2, 1] # [3, 2, 1])
1757
+ ([2, 1] # [2, 1, 3], [2, 1] # [2, 1, 3])
1758
+ ([2, 1] # [2, 3, 1],
1759
+ -7/48*[2, 1] # [1, 3, 2] - 1/48*[2, 1] # [2, 3, 1]
1760
+ + 49/48*[2, 1] # [3, 1, 2] + 7/48*[2, 1] # [3, 2, 1])
1761
+ ([2, 1] # [3, 1, 2],
1762
+ 7/48*[2, 1] # [1, 3, 2] + 49/48*[2, 1] # [2, 3, 1]
1763
+ - 1/48*[2, 1] # [3, 1, 2] - 7/48*[2, 1] # [3, 2, 1])
1764
+ ([2, 1] # [3, 2, 1],
1765
+ -1/48*[2, 1] # [1, 3, 2] - 7/48*[2, 1] # [2, 3, 1]
1766
+ + 7/48*[2, 1] # [3, 1, 2] + 49/48*[2, 1] # [3, 2, 1])
1767
+ """
1768
+ if self.cellular_basis() is self:
1769
+ def func(x):
1770
+ M = x.monomial_coefficients(copy=False)
1771
+ return self._from_dict({(i[0], i[2], i[1]): M[i] for i in M},
1772
+ remove_zeros=False)
1773
+ return self.module_morphism(function=func, codomain=self)
1774
+
1775
+ def on_basis(i):
1776
+ return self._tensor_of_elements([A.basis()[i[j]].cellular_involution()
1777
+ for j, A in enumerate(self._sets)])
1778
+ return self.module_morphism(on_basis, codomain=self)
1779
+
1780
+ @cached_method
1781
+ def _to_cellular_element(self, i):
1782
+ """
1783
+ Return the image of the basis index ``i`` in the
1784
+ cellular basis of ``self``.
1785
+
1786
+ EXAMPLES::
1787
+
1788
+ sage: # needs sage.combinat sage.groups
1789
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1790
+ sage: S3 = SymmetricGroupAlgebra(QQ, 3)
1791
+ sage: T = S2.tensor(S3)
1792
+ sage: all(T(T._to_cellular_element(k)).leading_support() == k
1793
+ ....: for k in T.basis().keys())
1794
+ True
1795
+ """
1796
+ C = [A.cellular_basis() for A in self._sets]
1797
+ elts = [C[j](self._sets[j].basis()[ij]) for j, ij in enumerate(i)]
1798
+ from sage.categories.tensor import tensor
1799
+ T = tensor(C)
1800
+ temp = T._tensor_of_elements(elts)
1801
+ B = self.cellular_basis()
1802
+ M = temp.monomial_coefficients(copy=False)
1803
+
1804
+ def convert_index(i):
1805
+ mu = []
1806
+ s = []
1807
+ t = []
1808
+ for a, b, c in i:
1809
+ mu.append(a)
1810
+ s.append(b)
1811
+ t.append(c)
1812
+ C = self.cell_module_indices(mu)
1813
+ return (tuple(mu), C(s), C(t))
1814
+ return B._from_dict({convert_index(i): M[i] for i in M},
1815
+ remove_zeros=False)
1816
+
1817
+ @cached_method
1818
+ def _from_cellular_index(self, x):
1819
+ """
1820
+ Return the image in ``self`` from the index of the
1821
+ cellular basis ``x``.
1822
+
1823
+ EXAMPLES::
1824
+
1825
+ sage: # needs sage.combinat sage.groups
1826
+ sage: S2 = SymmetricGroupAlgebra(QQ, 2)
1827
+ sage: S3 = SymmetricGroupAlgebra(QQ, 3)
1828
+ sage: T = S2.tensor(S3)
1829
+ sage: C = T.cellular_basis()
1830
+ sage: all(C(T._from_cellular_index(k)).leading_support() == k
1831
+ ....: for k in C.basis().keys())
1832
+ True
1833
+ """
1834
+ elts = [A(A.cellular_basis().basis()[ (x[0][i], x[1][i], x[2][i]) ])
1835
+ for i,A in enumerate(self._sets)]
1836
+ return self._tensor_of_elements(elts)
1837
+
1838
+ class SubcategoryMethods:
1839
+ @cached_method
1840
+ def Cellular(self):
1841
+ """
1842
+ Return the full subcategory of the cellular objects
1843
+ of ``self``.
1844
+
1845
+ .. SEEALSO:: :wikipedia:`Cellular_algebra`
1846
+
1847
+ EXAMPLES::
1848
+
1849
+ sage: Algebras(QQ).FiniteDimensional().WithBasis().Cellular()
1850
+ Category of finite dimensional cellular algebras with basis
1851
+ over Rational Field
1852
+
1853
+ TESTS::
1854
+
1855
+ sage: cat = Algebras(QQ).FiniteDimensional().WithBasis()
1856
+ sage: TestSuite(cat.Cellular()).run()
1857
+ sage: HopfAlgebras(QQ).FiniteDimensional().WithBasis().Cellular.__module__
1858
+ 'sage.categories.finite_dimensional_algebras_with_basis'
1859
+ """
1860
+ return self._with_axiom('Cellular')