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,1209 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Filtered Modules With Basis
4
+
5
+ A *filtered module with basis* over a ring `R` means
6
+ (for the purpose of this code) a filtered `R`-module `M`
7
+ with filtration `(F_i)_{i \in I}` (typically `I = \NN`)
8
+ endowed with a basis `(b_j)_{j \in J}` of `M` and a partition
9
+ `J = \bigsqcup_{i \in I} J_i` of the set `J` (it is allowed
10
+ that some `J_i` are empty) such that for every `n \in I`,
11
+ the subfamily `(b_j)_{j \in U_n}`, where
12
+ `U_n = \bigcup_{i \leq n} J_i`, is a basis of the
13
+ `R`-submodule `F_n`.
14
+
15
+ For every `i \in I`, the `R`-submodule of `M` spanned by
16
+ `(b_j)_{j \in J_i}` is called the `i`-*th graded component*
17
+ (aka the `i`-*th homogeneous component*) of the filtered
18
+ module with basis `M`; the elements of this submodule are
19
+ referred to as *homogeneous elements of degree* `i`.
20
+
21
+ See the class documentation
22
+ :class:`~sage.categories.filtered_modules_with_basis.FilteredModulesWithBasis`
23
+ for further details.
24
+ """
25
+ #*****************************************************************************
26
+ # Copyright (C) 2014 Travis Scrimshaw <tscrim at ucdavis.edu>
27
+ #
28
+ # Distributed under the terms of the GNU General Public License (GPL)
29
+ # http://www.gnu.org/licenses/
30
+ #******************************************************************************
31
+
32
+ from sage.categories.filtered_modules import FilteredModulesCategory
33
+ from sage.misc.abstract_method import abstract_method
34
+ from sage.misc.cachefunc import cached_method
35
+ from sage.categories.subobjects import SubobjectsCategory
36
+ from sage.categories.category_with_axiom import CategoryWithAxiom_over_base_ring
37
+
38
+
39
+ class FilteredModulesWithBasis(FilteredModulesCategory):
40
+ r"""
41
+ The category of filtered modules with a distinguished basis.
42
+
43
+ A *filtered module with basis* over a ring `R` means
44
+ (for the purpose of this code) a filtered `R`-module `M`
45
+ with filtration `(F_i)_{i \in I}` (typically `I = \NN`)
46
+ endowed with a basis `(b_j)_{j \in J}` of `M` and a partition
47
+ `J = \bigsqcup_{i \in I} J_i` of the set `J` (it is allowed
48
+ that some `J_i` are empty) such that for every `n \in I`,
49
+ the subfamily `(b_j)_{j \in U_n}`, where
50
+ `U_n = \bigcup_{i \leq n} J_i`, is a basis of the
51
+ `R`-submodule `F_n`.
52
+
53
+ For every `i \in I`, the `R`-submodule of `M` spanned by
54
+ `(b_j)_{j \in J_i}` is called the `i`-*th graded component*
55
+ (aka the `i`-*th homogeneous component*) of the filtered
56
+ module with basis `M`; the elements of this submodule are
57
+ referred to as *homogeneous elements of degree* `i`.
58
+ The `R`-module `M` is the direct sum of its `i`-th graded
59
+ components over all `i \in I`, and thus becomes a graded
60
+ `R`-module with basis.
61
+ Conversely, any graded `R`-module with basis canonically
62
+ becomes a filtered `R`-module with basis (by defining
63
+ `F_n = \bigoplus_{i \leq n} G_i` where `G_i` is the `i`-th
64
+ graded component, and defining `J_i` as the indexing set
65
+ of the basis of the `i`-th graded component). Hence, the
66
+ notion of a filtered `R`-module with basis is equivalent
67
+ to the notion of a graded `R`-module with basis.
68
+
69
+ However, the *category* of filtered `R`-modules with basis is not
70
+ the category of graded `R`-modules with basis. Indeed, the *morphisms*
71
+ of filtered `R`-modules with basis are defined to be morphisms of
72
+ `R`-modules which send each `F_n` of the domain to the corresponding
73
+ `F_n` of the target; in contrast, the morphisms of graded `R`-modules
74
+ with basis must preserve each homogeneous component. Also,
75
+ the notion of a filtered algebra with basis differs from
76
+ that of a graded algebra with basis.
77
+
78
+ .. NOTE::
79
+
80
+ Currently, to make use of the functionality of this class,
81
+ an instance of ``FilteredModulesWithBasis`` should fulfill
82
+ the contract of a :class:`CombinatorialFreeModule` (most
83
+ likely by inheriting from it). It should also have the
84
+ indexing set `J` encoded as its ``_indices`` attribute,
85
+ and ``_indices.subset(size=i)`` should yield the subset
86
+ `J_i` (as an iterable). If the latter conditions are not
87
+ satisfied, then :meth:`basis` must be overridden.
88
+
89
+ .. NOTE::
90
+
91
+ One should implement a ``degree_on_basis`` method in the parent
92
+ class in order to fully utilize the methods of this category.
93
+ This might become a required abstract method in the future.
94
+
95
+ EXAMPLES::
96
+
97
+ sage: C = ModulesWithBasis(ZZ).Filtered(); C
98
+ Category of filtered modules with basis over Integer Ring
99
+ sage: sorted(C.super_categories(), key=str)
100
+ [Category of filtered modules over Integer Ring,
101
+ Category of modules with basis over Integer Ring]
102
+ sage: C is ModulesWithBasis(ZZ).Filtered()
103
+ True
104
+
105
+ TESTS::
106
+
107
+ sage: C = ModulesWithBasis(ZZ).Filtered()
108
+ sage: TestSuite(C).run()
109
+ sage: C = ModulesWithBasis(QQ).Filtered()
110
+ sage: TestSuite(C).run()
111
+ """
112
+ class ParentMethods:
113
+ # TODO: which syntax do we prefer?
114
+ # A.basis(degree = 3)
115
+ # A.basis().subset(degree=3)
116
+
117
+ # This is related to the following design question:
118
+ # If F = (f_i)_{i\in I} is a family, should ``F.subset(degree = 3)``
119
+ # be the elements of F of degree 3 or those whose index is of degree 3?
120
+
121
+ @cached_method
122
+ def basis(self, d=None):
123
+ r"""
124
+ Return the basis for (the ``d``-th homogeneous component
125
+ of) ``self``.
126
+
127
+ INPUT:
128
+
129
+ - ``d`` -- (default: ``None``) nonnegative integer
130
+ or ``None``
131
+
132
+ OUTPUT:
133
+
134
+ If ``d`` is ``None``, returns the basis of the module.
135
+ Otherwise, returns the basis of the homogeneous component
136
+ of degree ``d`` (i.e., the subfamily of the basis of the
137
+ whole module which consists only of the basis vectors
138
+ lying in `F_d \setminus \bigcup_{i<d} F_i`).
139
+
140
+ The basis is always returned as a family.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
145
+ sage: A.basis(4)
146
+ Lazy family (Term map from Partitions to An example of a
147
+ filtered module with basis: the free module on partitions
148
+ over Integer Ring(i))_{i in Partitions of the integer 4}
149
+
150
+ Without arguments, the full basis is returned::
151
+
152
+ sage: A.basis()
153
+ Lazy family (Term map from Partitions to An example of a
154
+ filtered module with basis: the free module on partitions
155
+ over Integer Ring(i))_{i in Partitions}
156
+ sage: A.basis()
157
+ Lazy family (Term map from Partitions to An example of a
158
+ filtered module with basis: the free module on partitions
159
+ over Integer Ring(i))_{i in Partitions}
160
+
161
+ Checking this method on a filtered algebra. Note that this
162
+ will typically raise a :exc:`NotImplementedError` when this
163
+ feature is not implemented. ::
164
+
165
+ sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
166
+ sage: A.basis(4)
167
+ Traceback (most recent call last):
168
+ ...
169
+ NotImplementedError: infinite set
170
+
171
+ Without arguments, the full basis is returned::
172
+
173
+ sage: A.basis()
174
+ Lazy family (Term map from Free abelian monoid indexed by
175
+ {'x', 'y', 'z'} to An example of a filtered algebra with
176
+ basis: the universal enveloping algebra of Lie algebra
177
+ of RR^3 with cross product over Integer Ring(i))_{i in
178
+ Free abelian monoid indexed by {'x', 'y', 'z'}}
179
+
180
+ An example with a graded algebra::
181
+
182
+ sage: E.<x,y> = ExteriorAlgebra(QQ)
183
+ sage: E.basis()
184
+ Lazy family (Term map from Subsets of {0,1} to
185
+ The exterior algebra of rank 2 over Rational Field(i))_{i in
186
+ Subsets of {0,1}}
187
+ """
188
+ if d is None:
189
+ from sage.sets.family import Family
190
+ return Family(self._indices, self.monomial)
191
+ else:
192
+ return self.homogeneous_component_basis(d)
193
+
194
+ # TODO: Change `list(self._indices)` to `self._indices` and move
195
+ # this fallback to the category of finite-dimensional filtered
196
+ # modules with basis when it is implemented and the MRO issues
197
+ # are fixed (see trac #19397)
198
+ def homogeneous_component_basis(self, d):
199
+ """
200
+ Return a basis for the ``d``-th homogeneous component of ``self``.
201
+
202
+ EXAMPLES::
203
+
204
+ sage: A = GradedModulesWithBasis(ZZ).example()
205
+ sage: A.homogeneous_component_basis(4)
206
+ Lazy family (Term map
207
+ from Partitions
208
+ to An example of a graded module with basis: the free module
209
+ on partitions over Integer Ring(i))_{i in Partitions of the integer 4}
210
+
211
+ sage: # needs sage.modules
212
+ sage: cat = GradedModulesWithBasis(ZZ)
213
+ sage: C = CombinatorialFreeModule(ZZ, ['a', 'b'], category=cat)
214
+ sage: C.degree_on_basis = lambda x: 1 if x == 'a' else 2
215
+ sage: C.homogeneous_component_basis(1)
216
+ Finite family {'a': B['a']}
217
+ sage: C.homogeneous_component_basis(2)
218
+ Finite family {'b': B['b']}
219
+ """
220
+ from sage.sets.family import Family
221
+ try:
222
+ S = self._indices.subset(size=d)
223
+ except (AttributeError, ValueError, TypeError):
224
+ S = [i for i in list(self._indices) if self.degree_on_basis(i) == d]
225
+ return Family(S, self.monomial)
226
+
227
+ def homogeneous_component(self, d):
228
+ """
229
+ Return the ``d``-th homogeneous component of ``self``.
230
+
231
+ EXAMPLES::
232
+
233
+ sage: A = GradedModulesWithBasis(ZZ).example()
234
+ sage: A.homogeneous_component(4)
235
+ Degree 4 homogeneous component of An example of a graded module
236
+ with basis: the free module on partitions over Integer Ring
237
+ """
238
+ from sage.categories.modules_with_basis import ModulesWithBasis
239
+ from sage.categories.filtered_algebras import FilteredAlgebras
240
+ if self.base_ring() in FilteredAlgebras:
241
+ raise NotImplementedError("this is only a natural module over"
242
+ " the degree 0 component of the filtered"
243
+ " algebra and coordinate rings are not"
244
+ " yet implemented for submodules")
245
+ category = ModulesWithBasis(self.category().base_ring())
246
+ M = self.submodule(self.homogeneous_component_basis(d),
247
+ category=category,
248
+ already_echelonized=True)
249
+ M.rename("Degree {} homogeneous component of {}".format(d, self))
250
+ return M
251
+
252
+ def hilbert_series(self, prec=None):
253
+ r"""
254
+ Return the Hilbert series of ``self``.
255
+
256
+ Let `R` be a commutative ring (with unit). Let
257
+ `M = \bigcup_{n=0}^{\infty} M_n` be a filtered `R`-module.
258
+ The *Hilbert series* of `M` is the formal power series
259
+
260
+ .. MATH::
261
+
262
+ H(t) = \sum_{n=0}^{\infty} \ell(M_n / M_{n-1}) t^n,
263
+
264
+ where `\ell(N)` is the *length* of `N`, which is the
265
+ longest chain of submodules (over `R`), and by convention
266
+ `M_{-1} = \{0\}`. By the assumptions of the category,
267
+ `M_n / M_{n-1}` is a free `R`-module, and so `\ell(M_n / M_{n-1})`
268
+ is equal to the rank of `M_n / M_{n-1}`.
269
+
270
+ INPUT:
271
+
272
+ - ``prec`` -- (default: `\infty`) the precision
273
+
274
+ OUTPUT:
275
+
276
+ If the precision is finite, then this returns an element in the
277
+ :class:`PowerSeriesRing` over ``ZZ``. Otherwise it returns an
278
+ element in the :class:`LazyPowerSeriesRing` over ``ZZ``.
279
+
280
+ EXAMPLES::
281
+
282
+ sage: # needs sage.combinat
283
+ sage: A = GradedModulesWithBasis(ZZ).example()
284
+ sage: A.hilbert_series()
285
+ 1 + t + 2*t^2 + 3*t^3 + 5*t^4 + 7*t^5 + 11*t^6 + O(t^7)
286
+ sage: A.hilbert_series(10)
287
+ 1 + t + 2*t^2 + 3*t^3 + 5*t^4 + 7*t^5 + 11*t^6 + 15*t^7 + 22*t^8 + 30*t^9 + O(t^10)
288
+ """
289
+ from sage.rings.integer_ring import ZZ
290
+ if prec is None:
291
+ from sage.rings.lazy_series_ring import LazyPowerSeriesRing
292
+ R = LazyPowerSeriesRing(ZZ, 't')
293
+ return R(lambda n: self.homogeneous_component_basis(n).cardinality())
294
+ from sage.rings.power_series_ring import PowerSeriesRing
295
+ R = PowerSeriesRing(ZZ, 't')
296
+ elt = R([self.homogeneous_component_basis(n).cardinality() for n in range(prec)])
297
+ return elt.O(prec)
298
+
299
+ def graded_algebra(self):
300
+ r"""
301
+ Return the associated graded module to ``self``.
302
+
303
+ See :class:`~sage.algebras.associated_graded.AssociatedGradedAlgebra`
304
+ for the definition and the properties of this.
305
+
306
+ If the filtered module ``self`` with basis is called `A`,
307
+ then this method returns `\operatorname{gr} A`. The method
308
+ :meth:`to_graded_conversion` returns the canonical
309
+ `R`-module isomorphism `A \to \operatorname{gr} A` induced
310
+ by the basis of `A`, and the method
311
+ :meth:`from_graded_conversion` returns the inverse of this
312
+ isomorphism. The method :meth:`projection` projects
313
+ elements of `A` onto `\operatorname{gr} A` according to
314
+ their place in the filtration on `A`.
315
+
316
+ .. WARNING::
317
+
318
+ When not overridden, this method returns the default
319
+ implementation of an associated graded module --
320
+ namely, ``AssociatedGradedAlgebra(self)``, where
321
+ ``AssociatedGradedAlgebra`` is
322
+ :class:`~sage.algebras.associated_graded.AssociatedGradedAlgebra`.
323
+ But some instances of :class:`FilteredModulesWithBasis`
324
+ override this method, as the associated graded module
325
+ often is (isomorphic) to a simpler object (for instance,
326
+ the associated graded module of a graded module can be
327
+ identified with the graded module itself). Generic code
328
+ that uses associated graded modules (such as the code
329
+ of the :meth:`induced_graded_map` method below) should
330
+ make sure to only communicate with them via the
331
+ :meth:`to_graded_conversion`,
332
+ :meth:`from_graded_conversion` and
333
+ :meth:`projection` methods (in particular,
334
+ do not expect there to be a conversion from ``self``
335
+ to ``self.graded_algebra()``; this currently does not
336
+ work for Clifford algebras). Similarly, when
337
+ overriding :meth:`graded_algebra`, make sure to
338
+ accordingly redefine these three methods, unless their
339
+ definitions below still apply to your case (this will
340
+ happen whenever the basis of your :meth:`graded_algebra`
341
+ has the same indexing set as ``self``, and the partition
342
+ of this indexing set according to degree is the same as
343
+ for ``self``).
344
+
345
+ EXAMPLES::
346
+
347
+ sage: # needs sage.combinat sage.modules
348
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
349
+ sage: A.graded_algebra()
350
+ Graded Module of An example of a filtered module with basis:
351
+ the free module on partitions over Integer Ring
352
+ """
353
+ from sage.algebras.associated_graded import AssociatedGradedAlgebra
354
+ return AssociatedGradedAlgebra(self)
355
+
356
+ # Maps
357
+
358
+ def to_graded_conversion(self):
359
+ r"""
360
+ Return the canonical `R`-module isomorphism
361
+ `A \to \operatorname{gr} A` induced by the basis of `A`
362
+ (where `A = ` ``self``).
363
+
364
+ This is an isomorphism of `R`-modules. See
365
+ the class documentation :class:`AssociatedGradedAlgebra`.
366
+
367
+ .. SEEALSO::
368
+
369
+ :meth:`from_graded_conversion`
370
+
371
+ EXAMPLES::
372
+
373
+ sage: # needs sage.combinat sage.modules
374
+ sage: A = Modules(QQ).WithBasis().Filtered().example()
375
+ sage: p = -2 * A.an_element(); p
376
+ -4*P[] - 4*P[1] - 6*P[2]
377
+ sage: q = A.to_graded_conversion()(p); q
378
+ -4*Bbar[[]] - 4*Bbar[[1]] - 6*Bbar[[2]]
379
+ sage: q.parent() is A.graded_algebra()
380
+ True
381
+ """
382
+ base_one = self.base_ring().one()
383
+ return self.module_morphism(diagonal=lambda x: base_one,
384
+ codomain=self.graded_algebra())
385
+
386
+ def from_graded_conversion(self):
387
+ r"""
388
+ Return the inverse of the canonical `R`-module isomorphism
389
+ `A \to \operatorname{gr} A` induced by the basis of `A`
390
+ (where `A = ` ``self``). This inverse is an isomorphism
391
+ `\operatorname{gr} A \to A`.
392
+
393
+ This is an isomorphism of `R`-modules. See
394
+ the class documentation :class:`AssociatedGradedAlgebra`.
395
+
396
+ .. SEEALSO::
397
+
398
+ :meth:`to_graded_conversion`
399
+
400
+ EXAMPLES::
401
+
402
+ sage: # needs sage.combinat sage.modules
403
+ sage: A = Modules(QQ).WithBasis().Filtered().example()
404
+ sage: p = -2 * A.an_element(); p
405
+ -4*P[] - 4*P[1] - 6*P[2]
406
+ sage: q = A.to_graded_conversion()(p); q
407
+ -4*Bbar[[]] - 4*Bbar[[1]] - 6*Bbar[[2]]
408
+ sage: A.from_graded_conversion()(q) == p
409
+ True
410
+ sage: q.parent() is A.graded_algebra()
411
+ True
412
+ """
413
+ base_one = self.base_ring().one()
414
+ return self.graded_algebra().module_morphism(diagonal=lambda x: base_one,
415
+ codomain=self)
416
+
417
+ def projection(self, i):
418
+ r"""
419
+ Return the `i`-th projection `p_i : F_i \to G_i` (in the
420
+ notations of the class documentation
421
+ :class:`AssociatedGradedAlgebra`, where `A = ` ``self``).
422
+
423
+ This method actually does not return the map `p_i` itself,
424
+ but an extension of `p_i` to the whole `R`-module `A`.
425
+ This extension is the composition of the `R`-module
426
+ isomorphism `A \to \operatorname{gr} A` with the canonical
427
+ projection of the graded `R`-module `\operatorname{gr} A`
428
+ onto its `i`-th graded component `G_i`. The codomain of
429
+ this map is `\operatorname{gr} A`, although its actual
430
+ image is `G_i`. The map `p_i` is obtained from this map
431
+ by restricting its domain to `F_i` and its image to `G_i`.
432
+
433
+ EXAMPLES::
434
+
435
+ sage: # needs sage.combinat sage.modules
436
+ sage: A = Modules(ZZ).WithBasis().Filtered().example()
437
+ sage: p = -2 * A.an_element(); p
438
+ -4*P[] - 4*P[1] - 6*P[2]
439
+ sage: q = A.projection(2)(p); q
440
+ -6*Bbar[[2]]
441
+ sage: q.parent() is A.graded_algebra()
442
+ True
443
+ sage: A.projection(3)(p)
444
+ 0
445
+ """
446
+ base_zero = self.base_ring().zero()
447
+ base_one = self.base_ring().one()
448
+ grA = self.graded_algebra()
449
+ proj = lambda x: (base_one if self.degree_on_basis(x) == i
450
+ else base_zero)
451
+ return self.module_morphism(diagonal=proj, codomain=grA)
452
+
453
+ def induced_graded_map(self, other, f):
454
+ r"""
455
+ Return the graded linear map between the associated graded
456
+ modules of ``self`` and ``other`` canonically induced by
457
+ the filtration-preserving map ``f : self -> other``.
458
+
459
+ Let `A` and `B` be two filtered modules with basis, and let
460
+ `(F_i)_{i \in I}` and `(G_i)_{i \in I}` be their
461
+ filtrations. Let `f : A \to B` be a linear map which
462
+ preserves the filtration (i.e., satisfies `f(F_i) \subseteq
463
+ G_i` for all `i \in I`). Then, there is a canonically
464
+ defined graded linear map
465
+ `\operatorname{gr} f : \operatorname{gr} A \to
466
+ \operatorname{gr} B` which satisfies
467
+
468
+ .. MATH::
469
+
470
+ (\operatorname{gr} f) (p_i(a)) = p_i(f(a))
471
+ \qquad \text{for all } i \in I \text{ and } a \in F_i ,
472
+
473
+ where the `p_i` on the left hand side is the canonical
474
+ projection from `F_i` onto the `i`-th graded component
475
+ of `\operatorname{gr} A`, while the `p_i` on the right
476
+ hand side is the canonical projection from `G_i` onto
477
+ the `i`-th graded component of `\operatorname{gr} B`.
478
+
479
+ INPUT:
480
+
481
+ - ``other`` -- a filtered algebra with basis
482
+
483
+ - ``f`` -- a filtration-preserving linear map from ``self``
484
+ to ``other`` (can be given as a morphism or as a function)
485
+
486
+ OUTPUT: the graded linear map `\operatorname{gr} f`
487
+
488
+ EXAMPLES:
489
+
490
+ **Example 1.**
491
+
492
+ We start with the free `\QQ`-module with basis the set of all
493
+ partitions::
494
+
495
+ sage: A = Modules(QQ).WithBasis().Filtered().example(); A # needs sage.modules
496
+ An example of a filtered module with basis: the free module
497
+ on partitions over Rational Field
498
+ sage: M = A.indices(); M # needs sage.modules
499
+ Partitions
500
+ sage: p1, p2, p21, p321 = [A.basis()[Partition(i)] # needs sage.modules
501
+ ....: for i in [[1], [2], [2,1], [3,2,1]]]
502
+
503
+ Let us define a map from ``A`` to itself which acts on the
504
+ basis by sending every partition `\lambda` to the sum of
505
+ the conjugates of all partitions `\mu` for which
506
+ `\lambda / \mu` is a horizontal strip::
507
+
508
+ sage: # needs sage.combinat sage.modules
509
+ sage: def map_on_basis(lam):
510
+ ....: def mus(k):
511
+ ....: return lam.remove_horizontal_border_strip(k)
512
+ ....: return A.sum_of_monomials([Partition(mu).conjugate()
513
+ ....: for k in range(sum(lam) + 1)
514
+ ....: for mu in mus(k)])
515
+ sage: f = A.module_morphism(on_basis=map_on_basis,
516
+ ....: codomain=A)
517
+ sage: f(p1)
518
+ P[] + P[1]
519
+ sage: f(p2)
520
+ P[] + P[1] + P[1, 1]
521
+ sage: f(p21)
522
+ P[1] + P[1, 1] + P[2] + P[2, 1]
523
+ sage: f(p21 - p1)
524
+ -P[] + P[1, 1] + P[2] + P[2, 1]
525
+ sage: f(p321)
526
+ P[2, 1] + P[2, 1, 1] + P[2, 2] + P[2, 2, 1]
527
+ + P[3, 1] + P[3, 1, 1] + P[3, 2] + P[3, 2, 1]
528
+
529
+ We now compute `\operatorname{gr} f` ::
530
+
531
+ sage: # needs sage.combinat sage.modules
532
+ sage: grA = A.graded_algebra(); grA
533
+ Graded Module of An example of a filtered module with basis:
534
+ the free module on partitions over Rational Field
535
+ sage: pp1, pp2, pp21, pp321 = [A.to_graded_conversion()(i)
536
+ ....: for i in [p1, p2, p21, p321]]
537
+ sage: pp2 + 4 * pp21
538
+ Bbar[[2]] + 4*Bbar[[2, 1]]
539
+ sage: grf = A.induced_graded_map(A, f); grf
540
+ Generic endomorphism of Graded Module of
541
+ An example of a filtered module with basis:
542
+ the free module on partitions over Rational Field
543
+ sage: grf(pp1)
544
+ Bbar[[1]]
545
+ sage: grf(pp2 + 4 * pp21)
546
+ Bbar[[1, 1]] + 4*Bbar[[2, 1]]
547
+
548
+ **Example 2.**
549
+
550
+ We shall now construct `\operatorname{gr} f` for a
551
+ different map `f` out of the same ``A``; the new map
552
+ `f` will lead into a graded algebra already, namely into
553
+ the algebra of symmetric functions::
554
+
555
+ sage: # needs sage.combinat sage.modules
556
+ sage: h = SymmetricFunctions(QQ).h()
557
+ sage: def map_on_basis(lam): # redefining map_on_basis
558
+ ....: def mus(k):
559
+ ....: return lam.remove_horizontal_border_strip(k)
560
+ ....: return h.sum_of_monomials([Partition(mu).conjugate()
561
+ ....: for k in range(sum(lam) + 1)
562
+ ....: for mu in mus(k)])
563
+ sage: f = A.module_morphism(on_basis=map_on_basis,
564
+ ....: codomain=h) # redefining f
565
+ sage: f(p1)
566
+ h[] + h[1]
567
+ sage: f(p2)
568
+ h[] + h[1] + h[1, 1]
569
+ sage: f(A.zero())
570
+ 0
571
+ sage: f(p2 - 3*p1)
572
+ -2*h[] - 2*h[1] + h[1, 1]
573
+
574
+ The algebra ``h`` of symmetric functions in the `h`-basis
575
+ is already graded, so its associated graded algebra is
576
+ implemented as itself::
577
+
578
+ sage: # needs sage.combinat sage.modules
579
+ sage: grh = h.graded_algebra(); grh is h
580
+ True
581
+ sage: grf = A.induced_graded_map(h, f); grf
582
+ Generic morphism:
583
+ From: Graded Module of An example of a filtered
584
+ module with basis: the free module on partitions
585
+ over Rational Field
586
+ To: Symmetric Functions over Rational Field
587
+ in the homogeneous basis
588
+ sage: grf(pp1)
589
+ h[1]
590
+ sage: grf(pp2)
591
+ h[1, 1]
592
+ sage: grf(pp321)
593
+ h[3, 2, 1]
594
+ sage: grf(pp2 - 3*pp1)
595
+ -3*h[1] + h[1, 1]
596
+ sage: grf(pp21)
597
+ h[2, 1]
598
+ sage: grf(grA.zero())
599
+ 0
600
+
601
+ **Example 3.**
602
+
603
+ After having had a graded module as the codomain, let us try to
604
+ have one as the domain instead. Our new ``f`` will go from ``h``
605
+ to ``A``::
606
+
607
+ sage: # needs sage.combinat sage.modules
608
+ sage: def map_on_basis(lam): # redefining map_on_basis
609
+ ....: def mus(k):
610
+ ....: return lam.remove_horizontal_border_strip(k)
611
+ ....: return A.sum_of_monomials([Partition(mu).conjugate()
612
+ ....: for k in range(sum(lam) + 1)
613
+ ....: for mu in mus(k)])
614
+ sage: f = h.module_morphism(on_basis=map_on_basis,
615
+ ....: codomain=A) # redefining f
616
+ sage: f(h[1])
617
+ P[] + P[1]
618
+ sage: f(h[2])
619
+ P[] + P[1] + P[1, 1]
620
+ sage: f(h[1, 1])
621
+ P[1] + P[2]
622
+ sage: f(h[2, 2])
623
+ P[1, 1] + P[2, 1] + P[2, 2]
624
+ sage: f(h[3, 2, 1])
625
+ P[2, 1] + P[2, 1, 1] + P[2, 2] + P[2, 2, 1]
626
+ + P[3, 1] + P[3, 1, 1] + P[3, 2] + P[3, 2, 1]
627
+ sage: f(h.one())
628
+ P[]
629
+ sage: grf = h.induced_graded_map(A, f); grf
630
+ Generic morphism:
631
+ From: Symmetric Functions over Rational Field
632
+ in the homogeneous basis
633
+ To: Graded Module of An example of a filtered
634
+ module with basis: the free module on partitions
635
+ over Rational Field
636
+ sage: grf(h[1])
637
+ Bbar[[1]]
638
+ sage: grf(h[2])
639
+ Bbar[[1, 1]]
640
+ sage: grf(h[1, 1])
641
+ Bbar[[2]]
642
+ sage: grf(h[2, 2])
643
+ Bbar[[2, 2]]
644
+ sage: grf(h[3, 2, 1])
645
+ Bbar[[3, 2, 1]]
646
+ sage: grf(h.one())
647
+ Bbar[[]]
648
+
649
+ **Example 4.**
650
+
651
+ The construct `\operatorname{gr} f` also makes sense when `f`
652
+ is a filtration-preserving map between graded modules. ::
653
+
654
+ sage: # needs sage.combinat sage.modules
655
+ sage: def map_on_basis(lam): # redefining map_on_basis
656
+ ....: def mus(k):
657
+ ....: return lam.remove_horizontal_border_strip(k)
658
+ ....: return h.sum_of_monomials([Partition(mu).conjugate()
659
+ ....: for k in range(sum(lam) + 1)
660
+ ....: for mu in mus(k)])
661
+ sage: f = h.module_morphism(on_basis=map_on_basis,
662
+ ....: codomain=h) # redefining f
663
+ sage: f(h[1])
664
+ h[] + h[1]
665
+ sage: f(h[2])
666
+ h[] + h[1] + h[1, 1]
667
+ sage: f(h[1, 1])
668
+ h[1] + h[2]
669
+ sage: f(h[2, 1])
670
+ h[1] + h[1, 1] + h[2] + h[2, 1]
671
+ sage: f(h.one())
672
+ h[]
673
+ sage: grf = h.induced_graded_map(h, f); grf
674
+ Generic endomorphism of
675
+ Symmetric Functions over Rational Field in the homogeneous basis
676
+ sage: grf(h[1])
677
+ h[1]
678
+ sage: grf(h[2])
679
+ h[1, 1]
680
+ sage: grf(h[1, 1])
681
+ h[2]
682
+ sage: grf(h[2, 1])
683
+ h[2, 1]
684
+ sage: grf(h.one())
685
+ h[]
686
+ """
687
+ grA = self.graded_algebra()
688
+ grB = other.graded_algebra()
689
+ from sage.categories.graded_modules_with_basis import GradedModulesWithBasis
690
+ cat = GradedModulesWithBasis(self.base_ring())
691
+ from_gr = self.from_graded_conversion()
692
+
693
+ def on_basis(m):
694
+ i = grA.degree_on_basis(m)
695
+ lifted_img_of_m = f(from_gr(grA.monomial(m)))
696
+ return other.projection(i)(lifted_img_of_m)
697
+ return grA.module_morphism(on_basis=on_basis,
698
+ codomain=grB, category=cat)
699
+ # If we could assume that the projection of the basis
700
+ # element of ``self`` indexed by an index ``m`` is the
701
+ # basis element of ``grA`` indexed by ``m``, then this
702
+ # could go faster:
703
+ #
704
+ # def on_basis(m):
705
+ # i = grA.degree_on_basis(m)
706
+ # return grB.projection(i)(f(self.monomial(m)))
707
+ # return grA.module_morphism(on_basis=on_basis,
708
+ # codomain=grB, category=cat)
709
+ #
710
+ # But this assumption might come back to bite us in the
711
+ # ass one day. What do you think?
712
+
713
+ class ElementMethods:
714
+
715
+ def is_homogeneous(self):
716
+ r"""
717
+ Return whether the element ``self`` is homogeneous.
718
+
719
+ EXAMPLES::
720
+
721
+ sage: # needs sage.combinat sage.modules
722
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
723
+ sage: x = A(Partition((3,2,1)))
724
+ sage: y = A(Partition((4,4,1)))
725
+ sage: z = A(Partition((2,2,2)))
726
+ sage: (3*x).is_homogeneous()
727
+ True
728
+ sage: (x - y).is_homogeneous()
729
+ False
730
+ sage: (x+2*z).is_homogeneous()
731
+ True
732
+
733
+ Here is an example with a graded algebra::
734
+
735
+ sage: # needs sage.combinat sage.modules
736
+ sage: S = NonCommutativeSymmetricFunctions(QQ).S()
737
+ sage: (x, y) = (S[2], S[3])
738
+ sage: (3*x).is_homogeneous()
739
+ True
740
+ sage: (x^3 - y^2).is_homogeneous()
741
+ True
742
+ sage: ((x + y)^2).is_homogeneous()
743
+ False
744
+
745
+ Let us now test a filtered algebra (but remember that the
746
+ notion of homogeneity now depends on the choice of a
747
+ basis, or at least on a definition of homogeneous
748
+ components)::
749
+
750
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
751
+ sage: x,y,z = A.algebra_generators()
752
+ sage: (x*y).is_homogeneous()
753
+ True
754
+ sage: (y*x).is_homogeneous()
755
+ False
756
+ sage: A.one().is_homogeneous()
757
+ True
758
+ sage: A.zero().is_homogeneous()
759
+ True
760
+ sage: (A.one()+x).is_homogeneous()
761
+ False
762
+ """
763
+ degree_on_basis = self.parent().degree_on_basis
764
+ degree = None
765
+ for m in self.support():
766
+ if degree is None:
767
+ degree = degree_on_basis(m)
768
+ else:
769
+ if degree != degree_on_basis(m):
770
+ return False
771
+ return True
772
+
773
+ @abstract_method(optional=True)
774
+ def degree_on_basis(self, m):
775
+ r"""
776
+ Return the degree of the basis element indexed by ``m``
777
+ in ``self``.
778
+
779
+ EXAMPLES::
780
+
781
+ sage: A = GradedModulesWithBasis(QQ).example() # needs sage.modules
782
+ sage: A.degree_on_basis(Partition((2,1))) # needs sage.modules
783
+ 3
784
+ sage: A.degree_on_basis(Partition((4,2,1,1,1,1))) # needs sage.modules
785
+ 10
786
+ """
787
+
788
+ def homogeneous_degree(self):
789
+ r"""
790
+ The degree of a nonzero homogeneous element ``self`` in the
791
+ filtered module.
792
+
793
+ .. NOTE::
794
+
795
+ This raises an error if the element is not homogeneous.
796
+ To compute the maximum of the degrees of the homogeneous
797
+ summands of a (not necessarily homogeneous) element, use
798
+ :meth:`maximal_degree` instead.
799
+
800
+ EXAMPLES::
801
+
802
+ sage: # needs sage.combinat sage.modules
803
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
804
+ sage: x = A(Partition((3,2,1)))
805
+ sage: y = A(Partition((4,4,1)))
806
+ sage: z = A(Partition((2,2,2)))
807
+ sage: x.degree()
808
+ 6
809
+ sage: (x + 2*z).degree()
810
+ 6
811
+ sage: (y - x).degree()
812
+ Traceback (most recent call last):
813
+ ...
814
+ ValueError: element is not homogeneous
815
+
816
+ An example in a graded algebra::
817
+
818
+ sage: # needs sage.combinat sage.modules
819
+ sage: S = NonCommutativeSymmetricFunctions(QQ).S()
820
+ sage: (x, y) = (S[2], S[3])
821
+ sage: x.homogeneous_degree()
822
+ 2
823
+ sage: (x^3 + 4*y^2).homogeneous_degree()
824
+ 6
825
+ sage: ((1 + x)^3).homogeneous_degree()
826
+ Traceback (most recent call last):
827
+ ...
828
+ ValueError: element is not homogeneous
829
+
830
+ Let us now test a filtered algebra (but remember that the
831
+ notion of homogeneity now depends on the choice of a
832
+ basis)::
833
+
834
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
835
+ sage: x,y,z = A.algebra_generators()
836
+ sage: (x*y).homogeneous_degree()
837
+ 2
838
+ sage: (y*x).homogeneous_degree()
839
+ Traceback (most recent call last):
840
+ ...
841
+ ValueError: element is not homogeneous
842
+ sage: A.one().homogeneous_degree()
843
+ 0
844
+
845
+ TESTS::
846
+
847
+ sage: S = NonCommutativeSymmetricFunctions(QQ).S() # needs sage.combinat sage.modules
848
+ sage: S.zero().degree() # needs sage.combinat sage.modules
849
+ Traceback (most recent call last):
850
+ ...
851
+ ValueError: the zero element does not have a well-defined degree
852
+ """
853
+ if not self.support():
854
+ raise ValueError("the zero element does not have a well-defined degree")
855
+ if not self.is_homogeneous():
856
+ raise ValueError("element is not homogeneous")
857
+ return self.parent().degree_on_basis(next(iter(self.support())))
858
+
859
+ # default choice for degree; will be overridden as necessary
860
+ degree = homogeneous_degree
861
+
862
+ def maximal_degree(self):
863
+ """
864
+ The maximum of the degrees of the homogeneous components
865
+ of ``self``.
866
+
867
+ This is also the smallest `i` such that ``self`` belongs
868
+ to `F_i`. Hence, it does not depend on the basis of the
869
+ parent of ``self``.
870
+
871
+ .. SEEALSO:: :meth:`homogeneous_degree`
872
+
873
+ EXAMPLES::
874
+
875
+ sage: # needs sage.combinat sage.modules
876
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
877
+ sage: x = A(Partition((3,2,1)))
878
+ sage: y = A(Partition((4,4,1)))
879
+ sage: z = A(Partition((2,2,2)))
880
+ sage: x.maximal_degree()
881
+ 6
882
+ sage: (x + 2*z).maximal_degree()
883
+ 6
884
+ sage: (y - x).maximal_degree()
885
+ 9
886
+ sage: (3*z).maximal_degree()
887
+ 6
888
+
889
+ Now, we test this on a graded algebra::
890
+
891
+ sage: # needs sage.combinat sage.modules
892
+ sage: S = NonCommutativeSymmetricFunctions(QQ).S()
893
+ sage: (x, y) = (S[2], S[3])
894
+ sage: x.maximal_degree()
895
+ 2
896
+ sage: (x^3 + 4*y^2).maximal_degree()
897
+ 6
898
+ sage: ((1 + x)^3).maximal_degree()
899
+ 6
900
+
901
+ Let us now test a filtered algebra::
902
+
903
+ sage: # needs sage.combinat sage.modules
904
+ sage: A = AlgebrasWithBasis(QQ).Filtered().example()
905
+ sage: x,y,z = A.algebra_generators()
906
+ sage: (x*y).maximal_degree()
907
+ 2
908
+ sage: (y*x).maximal_degree()
909
+ 2
910
+ sage: A.one().maximal_degree()
911
+ 0
912
+ sage: A.zero().maximal_degree()
913
+ Traceback (most recent call last):
914
+ ...
915
+ ValueError: the zero element does not have a well-defined degree
916
+ sage: (A.one()+x).maximal_degree()
917
+ 1
918
+
919
+ TESTS::
920
+
921
+ sage: S = NonCommutativeSymmetricFunctions(QQ).S() # needs sage.combinat sage.modules
922
+ sage: S.zero().degree() # needs sage.combinat sage.modules
923
+ Traceback (most recent call last):
924
+ ...
925
+ ValueError: the zero element does not have a well-defined degree
926
+ """
927
+ if self.is_zero():
928
+ raise ValueError("the zero element does not have a well-defined degree")
929
+ degree_on_basis = self.parent().degree_on_basis
930
+ return max(degree_on_basis(m) for m in self.support())
931
+
932
+ def homogeneous_component(self, n):
933
+ r"""
934
+ Return the homogeneous component of degree ``n`` of the
935
+ element ``self``.
936
+
937
+ Let `m` be an element of a filtered `R`-module `M` with
938
+ basis. Then, `m` can be uniquely written in the form
939
+ `m = \sum_{i \in I} m_i`, where each `m_i` is a
940
+ homogeneous element of degree `i`. For `n \in I`, we
941
+ define the homogeneous component of degree `n` of the
942
+ element `m` to be `m_n`.
943
+
944
+ EXAMPLES::
945
+
946
+ sage: # needs sage.combinat sage.modules
947
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
948
+ sage: x = A.an_element(); x
949
+ 2*P[] + 2*P[1] + 3*P[2]
950
+ sage: x.homogeneous_component(-1)
951
+ 0
952
+ sage: x.homogeneous_component(0)
953
+ 2*P[]
954
+ sage: x.homogeneous_component(1)
955
+ 2*P[1]
956
+ sage: x.homogeneous_component(2)
957
+ 3*P[2]
958
+ sage: x.homogeneous_component(3)
959
+ 0
960
+
961
+ sage: # needs sage.combinat sage.modules
962
+ sage: A = ModulesWithBasis(ZZ).Graded().example()
963
+ sage: x = A.an_element(); x
964
+ 2*P[] + 2*P[1] + 3*P[2]
965
+ sage: x.homogeneous_component(-1)
966
+ 0
967
+ sage: x.homogeneous_component(0)
968
+ 2*P[]
969
+ sage: x.homogeneous_component(1)
970
+ 2*P[1]
971
+ sage: x.homogeneous_component(2)
972
+ 3*P[2]
973
+ sage: x.homogeneous_component(3)
974
+ 0
975
+
976
+ sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
977
+ sage: G = A.algebra_generators()
978
+ sage: g = A.an_element() - 2 * G['x'] * G['y']; g
979
+ U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
980
+ + 2*U['x'] + 3*U['y'] + 1
981
+ sage: g.homogeneous_component(-1)
982
+ 0
983
+ sage: g.homogeneous_component(0)
984
+ 1
985
+ sage: g.homogeneous_component(2)
986
+ -2*U['x']*U['y']
987
+ sage: g.homogeneous_component(5)
988
+ 0
989
+ sage: g.homogeneous_component(7)
990
+ U['x']^2*U['y']^2*U['z']^3
991
+ sage: g.homogeneous_component(8)
992
+ 0
993
+
994
+ TESTS:
995
+
996
+ Check that this really returns ``A.zero()`` and not a plain ``0``::
997
+
998
+ sage: # needs sage.combinat sage.modules
999
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
1000
+ sage: x = A.an_element()
1001
+ sage: x.homogeneous_component(3).parent() is A
1002
+ True
1003
+ """
1004
+ degree_on_basis = self.parent().degree_on_basis
1005
+ return self.parent().sum_of_terms((i, c)
1006
+ for (i, c) in self
1007
+ if degree_on_basis(i) == n)
1008
+
1009
+ def truncate(self, n):
1010
+ """
1011
+ Return the sum of the homogeneous components of degree
1012
+ strictly less than ``n`` of ``self``.
1013
+
1014
+ See :meth:`homogeneous_component` for the notion of a
1015
+ homogeneous component.
1016
+
1017
+ EXAMPLES::
1018
+
1019
+ sage: # needs sage.combinat sage.modules
1020
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
1021
+ sage: x = A.an_element(); x
1022
+ 2*P[] + 2*P[1] + 3*P[2]
1023
+ sage: x.truncate(0)
1024
+ 0
1025
+ sage: x.truncate(1)
1026
+ 2*P[]
1027
+ sage: x.truncate(2)
1028
+ 2*P[] + 2*P[1]
1029
+ sage: x.truncate(3)
1030
+ 2*P[] + 2*P[1] + 3*P[2]
1031
+
1032
+ sage: # needs sage.combinat sage.modules
1033
+ sage: A = ModulesWithBasis(ZZ).Graded().example()
1034
+ sage: x = A.an_element(); x
1035
+ 2*P[] + 2*P[1] + 3*P[2]
1036
+ sage: x.truncate(0)
1037
+ 0
1038
+ sage: x.truncate(1)
1039
+ 2*P[]
1040
+ sage: x.truncate(2)
1041
+ 2*P[] + 2*P[1]
1042
+ sage: x.truncate(3)
1043
+ 2*P[] + 2*P[1] + 3*P[2]
1044
+
1045
+ sage: A = AlgebrasWithBasis(ZZ).Filtered().example()
1046
+ sage: G = A.algebra_generators()
1047
+ sage: g = A.an_element() - 2 * G['x'] * G['y']; g
1048
+ U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
1049
+ + 2*U['x'] + 3*U['y'] + 1
1050
+ sage: g.truncate(-1)
1051
+ 0
1052
+ sage: g.truncate(0)
1053
+ 0
1054
+ sage: g.truncate(2)
1055
+ 2*U['x'] + 3*U['y'] + 1
1056
+ sage: g.truncate(3)
1057
+ -2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
1058
+ sage: g.truncate(5)
1059
+ -2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
1060
+ sage: g.truncate(7)
1061
+ -2*U['x']*U['y'] + 2*U['x'] + 3*U['y'] + 1
1062
+ sage: g.truncate(8)
1063
+ U['x']^2*U['y']^2*U['z']^3 - 2*U['x']*U['y']
1064
+ + 2*U['x'] + 3*U['y'] + 1
1065
+
1066
+ TESTS:
1067
+
1068
+ Check that this really return ``A.zero()`` and not a plain ``0``::
1069
+
1070
+ sage: # needs sage.combinat sage.modules
1071
+ sage: A = ModulesWithBasis(ZZ).Filtered().example()
1072
+ sage: x = A.an_element()
1073
+ sage: x.truncate(0).parent() is A
1074
+ True
1075
+ """
1076
+ degree_on_basis = self.parent().degree_on_basis
1077
+ return self.parent().sum_of_terms((i, c) for (i, c) in self
1078
+ if degree_on_basis(i) < n)
1079
+
1080
+ class Subobjects(SubobjectsCategory):
1081
+ class ParentMethods:
1082
+ def degree_on_basis(self, m):
1083
+ r"""
1084
+ Return the degree of the basis element indexed by ``m``
1085
+ in ``self``.
1086
+
1087
+ EXAMPLES::
1088
+
1089
+ sage: # needs sage.modules
1090
+ sage: E.<x,y,z> = ExteriorAlgebra(QQ)
1091
+ sage: S = E.submodule([x + y, x*y - y*z, y])
1092
+ sage: B = S.basis()
1093
+ sage: [B[0].lift(), B[1].lift(), B[2].lift()]
1094
+ [x, y, x*y - y*z]
1095
+ sage: S.degree_on_basis(0)
1096
+ 1
1097
+ sage: S.degree_on_basis(1)
1098
+ 1
1099
+ sage: S.degree_on_basis(2)
1100
+ 2
1101
+ """
1102
+ return self.basis()[m].lift().degree()
1103
+
1104
+ class ElementMethods:
1105
+ def degree(self):
1106
+ r"""
1107
+ Return the degree of ``self``.
1108
+
1109
+ EXAMPLES::
1110
+
1111
+ sage: # needs sage.modules
1112
+ sage: E.<x,y,z> = ExteriorAlgebra(QQ)
1113
+ sage: S = E.submodule([x + y, x*y - y*z, y])
1114
+ sage: B = S.basis()
1115
+ sage: [B[0].lift(), B[1].lift(), B[2].lift()]
1116
+ [x, y, x*y - y*z]
1117
+ sage: B[0].degree()
1118
+ 1
1119
+ sage: B[1].degree()
1120
+ 1
1121
+ sage: (B[0] + 3*B[1]).degree()
1122
+ 1
1123
+
1124
+ The degree of inhomogeneous elements is not defined
1125
+ (following the behavior of the exterior algebra)::
1126
+
1127
+ sage: (B[0] + B[2]).degree() # needs sage.modules
1128
+ Traceback (most recent call last):
1129
+ ...
1130
+ ValueError: element is not homogeneous
1131
+
1132
+ We can still get the maximal degree::
1133
+
1134
+ sage: (B[0] + B[2]).maximal_degree() # needs sage.modules
1135
+ 2
1136
+ """
1137
+ return self.lift().degree()
1138
+
1139
+ def maximal_degree(self):
1140
+ r"""
1141
+ The maximum of the degrees of the homogeneous components
1142
+ of ``self``.
1143
+
1144
+ This is also the smallest `i` such that ``self`` belongs
1145
+ to `F_i`. Hence, it does not depend on the basis of the
1146
+ parent of ``self``.
1147
+
1148
+ .. SEEALSO:: :meth:`homogeneous_degree`
1149
+
1150
+ EXAMPLES::
1151
+
1152
+ sage: # needs sage.modules
1153
+ sage: E.<x,y,z> = ExteriorAlgebra(QQ)
1154
+ sage: F = E.submodule([x + 1, x*y - 1])
1155
+ sage: B = F.basis()
1156
+ sage: [B[0].lift(), B[1].lift()]
1157
+ [-x*y + 1, x*y + x]
1158
+ sage: B[0].maximal_degree()
1159
+ 2
1160
+ sage: B[1].maximal_degree()
1161
+ 2
1162
+ """
1163
+ return self.lift().maximal_degree()
1164
+
1165
+ class FiniteDimensional(CategoryWithAxiom_over_base_ring):
1166
+ class ParentMethods:
1167
+ def hilbert_series(self, prec=None):
1168
+ r"""
1169
+ Return the Hilbert series of ``self`` as a polynomial.
1170
+
1171
+ Let `R` be a commutative ring (with unit). Let
1172
+ `M = \bigcup_{n=0}^{\infty} M_n` be a filtered `R`-module.
1173
+ The *Hilbert series* of `M` is the formal power series
1174
+
1175
+ .. MATH::
1176
+
1177
+ H(t) = \sum_{n=0}^{\infty} \ell(M_n / M_{n-1}) t^n,
1178
+
1179
+ where `\ell(N)` is the *length* of `N`, which is the
1180
+ longest chain of submodules (over `R`), and by convention
1181
+ `M_{-1} = \{0\}`. By the assumptions of the category,
1182
+ `M_n / M_{n-1}` is a free `R`-module, and so
1183
+ `\ell(M_n / M_{n-1})` is equal to the rank of `M_n / M_{n-1}`.
1184
+
1185
+ EXAMPLES::
1186
+
1187
+ sage: # needs sage.geometry.polyhedron sage.graphs
1188
+ sage: OS = hyperplane_arrangements.braid(3).orlik_solomon_algebra(QQ)
1189
+ sage: OS.hilbert_series()
1190
+ 2*t^2 + 3*t + 1
1191
+
1192
+ sage: # needs sage.combinat sage.modules
1193
+ sage: OS = matroids.Uniform(5, 3).orlik_solomon_algebra(ZZ)
1194
+ sage: OS.hilbert_series()
1195
+ t^3 + 3*t^2 + 3*t + 1
1196
+
1197
+ sage: # needs sage.combinat sage.modules
1198
+ sage: OS = matroids.PG(2, 3).orlik_solomon_algebra(ZZ['x','y'])
1199
+ sage: OS.hilbert_series()
1200
+ 27*t^3 + 39*t^2 + 13*t + 1
1201
+ """
1202
+ from collections import defaultdict
1203
+ from sage.rings.integer_ring import ZZ
1204
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
1205
+ PR = PolynomialRing(ZZ, 't')
1206
+ dims = defaultdict(ZZ)
1207
+ for b in self.basis():
1208
+ dims[b.homogeneous_degree()] += 1
1209
+ return PR(dims)