passagemath-schemes 10.6.40__cp314-cp314-macosx_13_0_arm64.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.

Potentially problematic release.


This version of passagemath-schemes might be problematic. Click here for more details.

Files changed (314) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.6.40.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
  9. passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.40.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +745 -0
  29. sage/lfunctions/pari.py +818 -0
  30. sage/lfunctions/zero_sums.cpython-314-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5135 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
  34. sage/modular/abvar/abvar_newform.py +244 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +186 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +720 -0
  40. sage/modular/abvar/homspace.py +998 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +740 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1402 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +363 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +653 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1469 -0
  57. sage/modular/arithgroup/congroup_generic.py +628 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +267 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1066 -0
  61. sage/modular/arithgroup/tests.py +418 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3753 -0
  64. sage/modular/btquotients/pautomorphicform.py +2570 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1109 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +569 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1065 -0
  77. sage/modular/hecke/algebra.py +746 -0
  78. sage/modular/hecke/all.py +20 -0
  79. sage/modular/hecke/ambient_module.py +1019 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +325 -0
  82. sage/modular/hecke/hecke_operator.py +780 -0
  83. sage/modular/hecke/homspace.py +206 -0
  84. sage/modular/hecke/module.py +1767 -0
  85. sage/modular/hecke/morphism.py +174 -0
  86. sage/modular/hecke/submodule.py +989 -0
  87. sage/modular/hypergeometric_misc.cpython-314-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2017 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1071 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +815 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +124 -0
  101. sage/modular/modform/ambient_g1.py +204 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +505 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4131 -0
  108. sage/modular/modform/find_generators.py +59 -0
  109. sage/modular/modform/half_integral.py +154 -0
  110. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  111. sage/modular/modform/j_invariant.py +47 -0
  112. sage/modular/modform/l_series_gross_zagier.py +133 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314-darwin.so +0 -0
  114. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  115. sage/modular/modform/notes.py +45 -0
  116. sage/modular/modform/numerical.py +514 -0
  117. sage/modular/modform/periods.py +14 -0
  118. sage/modular/modform/ring.py +1257 -0
  119. sage/modular/modform/space.py +1860 -0
  120. sage/modular/modform/submodule.py +118 -0
  121. sage/modular/modform/tests.py +64 -0
  122. sage/modular/modform/theta.py +110 -0
  123. sage/modular/modform/vm_basis.py +381 -0
  124. sage/modular/modform/weight1.py +220 -0
  125. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  126. sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
  127. sage/modular/modform_hecketriangle/all.py +30 -0
  128. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  129. sage/modular/modform_hecketriangle/constructor.py +416 -0
  130. sage/modular/modform_hecketriangle/element.py +351 -0
  131. sage/modular/modform_hecketriangle/functors.py +752 -0
  132. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  133. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
  135. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
  136. sage/modular/modform_hecketriangle/readme.py +1214 -0
  137. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  138. sage/modular/modform_hecketriangle/space.py +1037 -0
  139. sage/modular/modform_hecketriangle/subspace.py +423 -0
  140. sage/modular/modsym/all.py +17 -0
  141. sage/modular/modsym/ambient.py +3846 -0
  142. sage/modular/modsym/boundary.py +1420 -0
  143. sage/modular/modsym/element.py +336 -0
  144. sage/modular/modsym/g1list.py +178 -0
  145. sage/modular/modsym/ghlist.py +182 -0
  146. sage/modular/modsym/hecke_operator.py +73 -0
  147. sage/modular/modsym/manin_symbol.cpython-314-darwin.so +0 -0
  148. sage/modular/modsym/manin_symbol.pxd +5 -0
  149. sage/modular/modsym/manin_symbol.pyx +497 -0
  150. sage/modular/modsym/manin_symbol_list.py +1295 -0
  151. sage/modular/modsym/modsym.py +400 -0
  152. sage/modular/modsym/modular_symbols.py +384 -0
  153. sage/modular/modsym/p1list.cpython-314-darwin.so +0 -0
  154. sage/modular/modsym/p1list.pxd +29 -0
  155. sage/modular/modsym/p1list.pyx +1372 -0
  156. sage/modular/modsym/p1list_nf.py +1241 -0
  157. sage/modular/modsym/relation_matrix.py +591 -0
  158. sage/modular/modsym/relation_matrix_pyx.cpython-314-darwin.so +0 -0
  159. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  160. sage/modular/modsym/space.py +2468 -0
  161. sage/modular/modsym/subspace.py +455 -0
  162. sage/modular/modsym/tests.py +375 -0
  163. sage/modular/multiple_zeta.py +2632 -0
  164. sage/modular/multiple_zeta_F_algebra.py +786 -0
  165. sage/modular/overconvergent/all.py +6 -0
  166. sage/modular/overconvergent/genus0.py +1878 -0
  167. sage/modular/overconvergent/hecke_series.py +1187 -0
  168. sage/modular/overconvergent/weightspace.py +778 -0
  169. sage/modular/pollack_stevens/all.py +4 -0
  170. sage/modular/pollack_stevens/distributions.py +874 -0
  171. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  172. sage/modular/pollack_stevens/manin_map.py +859 -0
  173. sage/modular/pollack_stevens/modsym.py +1593 -0
  174. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  175. sage/modular/pollack_stevens/sigma0.py +534 -0
  176. sage/modular/pollack_stevens/space.py +1076 -0
  177. sage/modular/quasimodform/all.py +3 -0
  178. sage/modular/quasimodform/element.py +845 -0
  179. sage/modular/quasimodform/ring.py +828 -0
  180. sage/modular/quatalg/all.py +3 -0
  181. sage/modular/quatalg/brandt.py +1642 -0
  182. sage/modular/ssmod/all.py +8 -0
  183. sage/modular/ssmod/ssmod.py +827 -0
  184. sage/rings/all__sagemath_schemes.py +1 -0
  185. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  186. sage/rings/polynomial/binary_form_reduce.py +585 -0
  187. sage/schemes/all.py +41 -0
  188. sage/schemes/berkovich/all.py +6 -0
  189. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  190. sage/schemes/berkovich/berkovich_space.py +748 -0
  191. sage/schemes/curves/affine_curve.py +2928 -0
  192. sage/schemes/curves/all.py +33 -0
  193. sage/schemes/curves/closed_point.py +434 -0
  194. sage/schemes/curves/constructor.py +381 -0
  195. sage/schemes/curves/curve.py +542 -0
  196. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  197. sage/schemes/curves/point.py +463 -0
  198. sage/schemes/curves/projective_curve.py +3026 -0
  199. sage/schemes/curves/zariski_vankampen.py +1932 -0
  200. sage/schemes/cyclic_covers/all.py +2 -0
  201. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  202. sage/schemes/cyclic_covers/constructor.py +137 -0
  203. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  204. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  205. sage/schemes/elliptic_curves/BSD.py +1036 -0
  206. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  207. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  208. sage/schemes/elliptic_curves/all.py +49 -0
  209. sage/schemes/elliptic_curves/cardinality.py +609 -0
  210. sage/schemes/elliptic_curves/cm.py +1102 -0
  211. sage/schemes/elliptic_curves/constructor.py +1552 -0
  212. sage/schemes/elliptic_curves/ec_database.py +175 -0
  213. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  214. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  215. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  216. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  217. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  218. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  219. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  220. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  221. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  222. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  223. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  224. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  225. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  226. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  227. sage/schemes/elliptic_curves/formal_group.py +760 -0
  228. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  229. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  230. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  231. sage/schemes/elliptic_curves/heegner.py +7335 -0
  232. sage/schemes/elliptic_curves/height.py +2109 -0
  233. sage/schemes/elliptic_curves/hom.py +1406 -0
  234. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  235. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  236. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  237. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  238. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  239. sage/schemes/elliptic_curves/homset.py +271 -0
  240. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  241. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  242. sage/schemes/elliptic_curves/jacobian.py +237 -0
  243. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  244. sage/schemes/elliptic_curves/kraus.py +1014 -0
  245. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  246. sage/schemes/elliptic_curves/mod5family.py +105 -0
  247. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  248. sage/schemes/elliptic_curves/mod_sym_num.cpython-314-darwin.so +0 -0
  249. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  250. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  251. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  252. sage/schemes/elliptic_curves/padics.py +1816 -0
  253. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  254. sage/schemes/elliptic_curves/period_lattice_region.cpython-314-darwin.so +0 -0
  255. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  256. sage/schemes/elliptic_curves/saturation.py +715 -0
  257. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  258. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  259. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  260. sage/schemes/hyperelliptic_curves/all.py +6 -0
  261. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  265. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  266. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  267. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  271. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  272. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  273. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  274. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  275. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  276. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  277. sage/schemes/jacobians/all.py +2 -0
  278. sage/schemes/overview.py +161 -0
  279. sage/schemes/plane_conics/all.py +22 -0
  280. sage/schemes/plane_conics/con_field.py +1296 -0
  281. sage/schemes/plane_conics/con_finite_field.py +158 -0
  282. sage/schemes/plane_conics/con_number_field.py +456 -0
  283. sage/schemes/plane_conics/con_rational_field.py +406 -0
  284. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  285. sage/schemes/plane_conics/constructor.py +249 -0
  286. sage/schemes/plane_quartics/all.py +2 -0
  287. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  288. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  289. sage/schemes/riemann_surfaces/all.py +1 -0
  290. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  291. sage_wheels/share/cremona/cremona_mini.db +0 -0
  292. sage_wheels/share/ellcurves/rank0 +30427 -0
  293. sage_wheels/share/ellcurves/rank1 +31871 -0
  294. sage_wheels/share/ellcurves/rank10 +6 -0
  295. sage_wheels/share/ellcurves/rank11 +6 -0
  296. sage_wheels/share/ellcurves/rank12 +1 -0
  297. sage_wheels/share/ellcurves/rank14 +1 -0
  298. sage_wheels/share/ellcurves/rank15 +1 -0
  299. sage_wheels/share/ellcurves/rank17 +1 -0
  300. sage_wheels/share/ellcurves/rank19 +1 -0
  301. sage_wheels/share/ellcurves/rank2 +2388 -0
  302. sage_wheels/share/ellcurves/rank20 +1 -0
  303. sage_wheels/share/ellcurves/rank21 +1 -0
  304. sage_wheels/share/ellcurves/rank22 +1 -0
  305. sage_wheels/share/ellcurves/rank23 +1 -0
  306. sage_wheels/share/ellcurves/rank24 +1 -0
  307. sage_wheels/share/ellcurves/rank28 +1 -0
  308. sage_wheels/share/ellcurves/rank3 +836 -0
  309. sage_wheels/share/ellcurves/rank4 +10 -0
  310. sage_wheels/share/ellcurves/rank5 +5 -0
  311. sage_wheels/share/ellcurves/rank6 +5 -0
  312. sage_wheels/share/ellcurves/rank7 +5 -0
  313. sage_wheels/share/ellcurves/rank8 +6 -0
  314. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,663 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.pari
3
+ """
4
+ The Eisenstein subspace
5
+ """
6
+
7
+ from sage.arith.functions import lcm
8
+ from sage.arith.misc import euler_phi
9
+ from sage.categories.objects import Objects
10
+ from sage.matrix.constructor import Matrix
11
+ from sage.misc.cachefunc import cached_method
12
+ from sage.misc.lazy_import import lazy_import
13
+ from sage.rings.integer import Integer
14
+ from sage.structure.sequence import Sequence
15
+
16
+ lazy_import('sage.rings.number_field.number_field', 'CyclotomicField')
17
+
18
+ from . import eis_series
19
+ from . import element
20
+ from . import submodule
21
+
22
+
23
+ class EisensteinSubmodule(submodule.ModularFormsSubmodule):
24
+ """
25
+ The Eisenstein submodule of an ambient space of modular forms.
26
+ """
27
+ def __init__(self, ambient_space):
28
+ """
29
+ Return the Eisenstein submodule of the given space.
30
+
31
+ EXAMPLES::
32
+
33
+ sage: E = ModularForms(23,4).eisenstein_subspace() # indirect doctest
34
+ sage: E
35
+ Eisenstein subspace of dimension 2 of Modular Forms space of dimension 7
36
+ for Congruence Subgroup Gamma0(23) of weight 4 over Rational Field
37
+ sage: E == loads(dumps(E))
38
+ True
39
+ """
40
+ from sage.misc.verbose import verbose
41
+ verbose('creating eisenstein submodule of %s' % ambient_space)
42
+ d = ambient_space._dim_eisenstein()
43
+ V = ambient_space.module()
44
+ n = V.dimension()
45
+ self._start_position = int(n - d)
46
+ S = V.submodule([V.gen(i) for i in range(n-d,n)], check=False,
47
+ already_echelonized=True)
48
+ submodule.ModularFormsSubmodule.__init__(self, ambient_space, S)
49
+
50
+ def _repr_(self):
51
+ """
52
+ Return the string representation of ``self``.
53
+
54
+ EXAMPLES::
55
+
56
+ sage: E = ModularForms(23,4).eisenstein_subspace() # indirect doctest
57
+ sage: E._repr_()
58
+ 'Eisenstein subspace of dimension 2 of Modular Forms space of dimension 7 for Congruence Subgroup Gamma0(23) of weight 4 over Rational Field'
59
+ """
60
+ return "Eisenstein subspace of dimension %s of %s" % (self.dimension(), self.ambient_module())
61
+
62
+ def eisenstein_submodule(self):
63
+ """
64
+ Return the Eisenstein submodule of ``self``.
65
+ (Yes, this is just self.)
66
+
67
+ EXAMPLES::
68
+
69
+ sage: E = ModularForms(23,4).eisenstein_subspace()
70
+ sage: E == E.eisenstein_submodule()
71
+ True
72
+ """
73
+ return self
74
+
75
+ @cached_method
76
+ def modular_symbols(self, sign=0):
77
+ r"""
78
+ Return the corresponding space of modular symbols with given sign. This
79
+ will fail in weight 1.
80
+
81
+ .. warning::
82
+
83
+ If sign != 0, then the space of modular symbols will, in general,
84
+ only correspond to a *subspace* of this space of modular forms.
85
+ This can be the case for both sign +1 or -1.
86
+
87
+ EXAMPLES::
88
+
89
+ sage: E = ModularForms(11,2).eisenstein_submodule()
90
+ sage: M = E.modular_symbols(); M
91
+ Modular Symbols subspace of dimension 1 of Modular Symbols space
92
+ of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
93
+ sage: M.sign()
94
+ 0
95
+
96
+ sage: M = E.modular_symbols(sign=-1); M
97
+ Modular Symbols subspace of dimension 0 of Modular Symbols space of
98
+ dimension 1 for Gamma_0(11) of weight 2 with sign -1 over Rational Field
99
+
100
+ sage: E = ModularForms(1,12).eisenstein_submodule()
101
+ sage: E.modular_symbols()
102
+ Modular Symbols subspace of dimension 1 of Modular Symbols space of
103
+ dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
104
+
105
+ sage: eps = DirichletGroup(13).0
106
+ sage: E = EisensteinForms(eps^2, 2)
107
+ sage: E.modular_symbols()
108
+ Modular Symbols subspace of dimension 2 of Modular Symbols space of
109
+ dimension 4 and level 13, weight 2, character [zeta6], sign 0,
110
+ over Cyclotomic Field of order 6 and degree 2
111
+
112
+ sage: E = EisensteinForms(eps, 1); E
113
+ Eisenstein subspace of dimension 1 of Modular Forms space of character
114
+ [zeta12] and weight 1 over Cyclotomic Field of order 12 and degree 4
115
+ sage: E.modular_symbols()
116
+ Traceback (most recent call last):
117
+ ...
118
+ ValueError: the weight must be at least 2
119
+ """
120
+ A = self.ambient_module()
121
+ return A.modular_symbols(sign).eisenstein_submodule()
122
+
123
+
124
+ class EisensteinSubmodule_params(EisensteinSubmodule):
125
+
126
+ @cached_method
127
+ def parameters(self):
128
+ r"""
129
+ Return a list of parameters for each Eisenstein series
130
+ spanning ``self``. That is, for each such series, return a triple
131
+ of the form (`\psi`, `\chi`, level), where `\psi` and `\chi`
132
+ are the characters defining the Eisenstein series, and level
133
+ is the smallest level at which this series occurs.
134
+
135
+ EXAMPLES::
136
+
137
+ sage: ModularForms(24,2).eisenstein_submodule().parameters()
138
+ [(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
139
+ Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1, 2),
140
+ ...
141
+ Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1, 24)]
142
+ sage: EisensteinForms(12,6).parameters()[-1]
143
+ (Dirichlet character modulo 12 of conductor 1 mapping 7 |--> 1, 5 |--> 1,
144
+ Dirichlet character modulo 12 of conductor 1 mapping 7 |--> 1, 5 |--> 1, 12)
145
+
146
+ sage: pars = ModularForms(DirichletGroup(24).0,3).eisenstein_submodule().parameters()
147
+ sage: [(x[0].values_on_gens(),x[1].values_on_gens(),x[2]) for x in pars]
148
+ [((1, 1, 1), (-1, 1, 1), 1),
149
+ ((1, 1, 1), (-1, 1, 1), 2),
150
+ ((1, 1, 1), (-1, 1, 1), 3),
151
+ ((1, 1, 1), (-1, 1, 1), 6),
152
+ ((-1, 1, 1), (1, 1, 1), 1),
153
+ ((-1, 1, 1), (1, 1, 1), 2),
154
+ ((-1, 1, 1), (1, 1, 1), 3),
155
+ ((-1, 1, 1), (1, 1, 1), 6)]
156
+ sage: EisensteinForms(DirichletGroup(24).0,1).parameters()
157
+ [(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
158
+ Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 1),
159
+ (Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
160
+ Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 2),
161
+ (Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
162
+ Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 3),
163
+ (Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
164
+ Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 6)]
165
+ """
166
+ char = self._parameters_character()
167
+ if char is None:
168
+ return eis_series.compute_eisenstein_params(self.level(), self.weight())
169
+ else:
170
+ return eis_series.compute_eisenstein_params(char, self.weight())
171
+
172
+ def new_submodule(self, p=None):
173
+ r"""
174
+ Return the new submodule of ``self``.
175
+
176
+ EXAMPLES::
177
+
178
+ sage: e = EisensteinForms(Gamma0(225), 2).new_submodule(); e
179
+ Modular Forms subspace of dimension 3 of Modular Forms space of dimension 42
180
+ for Congruence Subgroup Gamma0(225) of weight 2 over Rational Field
181
+ sage: e.basis()
182
+ [q + O(q^6), q^2 + O(q^6), q^4 + O(q^6)]
183
+ """
184
+
185
+ if p is not None:
186
+ raise NotImplementedError
187
+ return self.submodule([self(x) for x in self._compute_q_expansion_basis(self.sturm_bound(), new=True)], check=False)
188
+
189
+ def _parameters_character(self):
190
+ """
191
+ Return the character defining ``self``.
192
+
193
+ EXAMPLES::
194
+
195
+ sage: EisensteinForms(DirichletGroup(33).1,5)._parameters_character()
196
+ Dirichlet character modulo 33 of conductor 11 mapping 23 |--> 1, 13 |--> zeta10
197
+ """
198
+ return self.character()
199
+
200
+ def change_ring(self, base_ring):
201
+ """
202
+ Return ``self`` as a module over ``base_ring``.
203
+
204
+ EXAMPLES::
205
+
206
+ sage: E = EisensteinForms(12,2) ; E
207
+ Eisenstein subspace of dimension 5 of Modular Forms space of dimension 5
208
+ for Congruence Subgroup Gamma0(12) of weight 2 over Rational Field
209
+ sage: E.basis()
210
+ [1 + O(q^6), q + 6*q^5 + O(q^6), q^2 + O(q^6), q^3 + O(q^6), q^4 + O(q^6)]
211
+ sage: E.change_ring(GF(5))
212
+ Eisenstein subspace of dimension 5 of Modular Forms space of dimension 5
213
+ for Congruence Subgroup Gamma0(12) of weight 2 over Finite Field of size 5
214
+ sage: E.change_ring(GF(5)).basis()
215
+ [1 + O(q^6), q + q^5 + O(q^6), q^2 + O(q^6), q^3 + O(q^6), q^4 + O(q^6)]
216
+ """
217
+ if base_ring == self.base_ring():
218
+ return self
219
+ A = self.ambient_module()
220
+ B = A.change_ring(base_ring)
221
+ return B.eisenstein_submodule()
222
+
223
+ def eisenstein_series(self):
224
+ """
225
+ Return the Eisenstein series that span this space (over the
226
+ algebraic closure).
227
+
228
+ EXAMPLES::
229
+
230
+ sage: EisensteinForms(11,2).eisenstein_series()
231
+ [5/12 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + O(q^6)]
232
+ sage: EisensteinForms(1,4).eisenstein_series()
233
+ [1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6)]
234
+ sage: EisensteinForms(1,24).eisenstein_series()
235
+ [236364091/131040 + q + 8388609*q^2 + 94143178828*q^3 + 70368752566273*q^4 + 11920928955078126*q^5 + O(q^6)]
236
+ sage: EisensteinForms(5,4).eisenstein_series()
237
+ [1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6), 1/240 + q^5 + O(q^6)]
238
+ sage: EisensteinForms(13,2).eisenstein_series()
239
+ [1/2 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + O(q^6)]
240
+
241
+ sage: E = EisensteinForms(Gamma1(7),2)
242
+ sage: E.set_precision(4)
243
+ sage: E.eisenstein_series()
244
+ [1/4 + q + 3*q^2 + 4*q^3 + O(q^4),
245
+ 1/7*zeta6 - 3/7 + q + (-2*zeta6 + 1)*q^2 + (3*zeta6 - 2)*q^3 + O(q^4),
246
+ q + (-zeta6 + 2)*q^2 + (zeta6 + 2)*q^3 + O(q^4),
247
+ -1/7*zeta6 - 2/7 + q + (2*zeta6 - 1)*q^2 + (-3*zeta6 + 1)*q^3 + O(q^4),
248
+ q + (zeta6 + 1)*q^2 + (-zeta6 + 3)*q^3 + O(q^4)]
249
+
250
+ sage: eps = DirichletGroup(13).0^2
251
+ sage: ModularForms(eps,2).eisenstein_series()
252
+ [-7/13*zeta6 - 11/13 + q + (2*zeta6 + 1)*q^2 + (-3*zeta6 + 1)*q^3 + (6*zeta6 - 3)*q^4 - 4*q^5 + O(q^6),
253
+ q + (zeta6 + 2)*q^2 + (-zeta6 + 3)*q^3 + (3*zeta6 + 3)*q^4 + 4*q^5 + O(q^6)]
254
+
255
+ sage: M = ModularForms(19,3).eisenstein_subspace()
256
+ sage: M.eisenstein_series()
257
+ []
258
+
259
+ sage: M = ModularForms(DirichletGroup(13).0, 1)
260
+ sage: M.eisenstein_series()
261
+ [-1/13*zeta12^3 + 6/13*zeta12^2 + 4/13*zeta12 + 2/13 + q + (zeta12 + 1)*q^2 + zeta12^2*q^3 + (zeta12^2 + zeta12 + 1)*q^4 + (-zeta12^3 + 1)*q^5 + O(q^6)]
262
+
263
+ sage: M = ModularForms(GammaH(15, [4]), 4)
264
+ sage: M.eisenstein_series()
265
+ [1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6),
266
+ 1/240 + q^3 + O(q^6),
267
+ 1/240 + q^5 + O(q^6),
268
+ 1/240 + O(q^6),
269
+ 1 + q - 7*q^2 - 26*q^3 + 57*q^4 + q^5 + O(q^6),
270
+ 1 + q^3 + O(q^6),
271
+ q + 7*q^2 + 26*q^3 + 57*q^4 + 125*q^5 + O(q^6),
272
+ q^3 + O(q^6)]
273
+ """
274
+ P = self.parameters()
275
+ E = Sequence([element.EisensteinSeries(self.change_ring(chi.base_ring()),
276
+ None, t, chi, psi) for chi, psi, t in P],
277
+ immutable=True, cr=True, universe=Objects())
278
+ assert len(E) == self.dimension(), "bug in enumeration of Eisenstein series."
279
+ return E
280
+
281
+ def new_eisenstein_series(self):
282
+ r"""
283
+ Return a list of the Eisenstein series in this space that are new.
284
+
285
+ EXAMPLES::
286
+
287
+ sage: E = EisensteinForms(25, 4)
288
+ sage: E.new_eisenstein_series()
289
+ [q + 7*zeta4*q^2 - 26*zeta4*q^3 - 57*q^4 + O(q^6),
290
+ q - 9*q^2 - 28*q^3 + 73*q^4 + O(q^6),
291
+ q - 7*zeta4*q^2 + 26*zeta4*q^3 - 57*q^4 + O(q^6)]
292
+ """
293
+
294
+ return [x for x in self.eisenstein_series() if x.new_level() == self.level()]
295
+
296
+ def _compute_q_expansion_basis(self, prec=None, new=False):
297
+ """
298
+ Compute a `q`-expansion basis for ``self`` to precision ``prec``.
299
+
300
+ EXAMPLES::
301
+
302
+ sage: EisensteinForms(22,4)._compute_q_expansion_basis(6)
303
+ [1 + O(q^6),
304
+ q + 28*q^3 - 8*q^4 + 126*q^5 + O(q^6),
305
+ q^2 + 9*q^4 + O(q^6),
306
+ O(q^6)]
307
+ sage: EisensteinForms(22,4)._compute_q_expansion_basis(15)
308
+ [1 + O(q^15),
309
+ q + 28*q^3 - 8*q^4 + 126*q^5 + 344*q^7 - 72*q^8 + 757*q^9 - 224*q^12 + 2198*q^13 + O(q^15),
310
+ q^2 + 9*q^4 + 28*q^6 + 73*q^8 + 126*q^10 + 252*q^12 + 344*q^14 + O(q^15),
311
+ q^11 + O(q^15)]
312
+ """
313
+ if prec is None:
314
+ prec = self.prec()
315
+ else:
316
+ prec = Integer(prec)
317
+
318
+ if new:
319
+ E = self.new_eisenstein_series()
320
+ else:
321
+ E = self.eisenstein_series()
322
+ K = self.base_ring()
323
+ V = K**prec
324
+ G = []
325
+ for e in E:
326
+ f = e.q_expansion(prec)
327
+ w = f.padded_list(prec)
328
+ L = f.base_ring()
329
+ if K.has_coerce_map_from(L):
330
+ G.append(V(w))
331
+ else:
332
+ # restrict scalars from L to K
333
+ r,d = cyclotomic_restriction(L,K)
334
+ s = [r(x) for x in w]
335
+ for i in range(d):
336
+ G.append(V([x[i] for x in s]))
337
+
338
+ W = V.submodule(G, check=False)
339
+ R = self._q_expansion_ring()
340
+ X = [R(f.list(), prec) for f in W.basis()]
341
+ if not new:
342
+ return X + [R(0,prec)]*(self.dimension() - len(X))
343
+ else:
344
+ return X
345
+
346
+ def _q_expansion(self, element, prec):
347
+ """
348
+ Compute a `q`-expansion for a given element of self, expressed
349
+ as a vector of coefficients for the basis vectors of self,
350
+ viewing ``self`` as a subspace of the corresponding space of
351
+ modular forms.
352
+
353
+ EXAMPLES::
354
+
355
+ sage: E = EisensteinForms(17,4)
356
+ sage: (11*E.0 + 3*E.1).q_expansion(20)
357
+ 11 + 3*q + 27*q^2 + 84*q^3 + 219*q^4 + 378*q^5 + 756*q^6 + 1032*q^7 + 1755*q^8 + 2271*q^9 + 3402*q^10 + 3996*q^11 + 6132*q^12 + 6594*q^13 + 9288*q^14 + 10584*q^15 + 14043*q^16 + 17379*q^17 + 20439*q^18 + 20580*q^19 + O(q^20)
358
+ sage: E._q_expansion([0,0,0,0,11,3],20)
359
+ 11 + 3*q + 27*q^2 + 84*q^3 + 219*q^4 + 378*q^5 + 756*q^6 + 1032*q^7 + 1755*q^8 + 2271*q^9 + 3402*q^10 + 3996*q^11 + 6132*q^12 + 6594*q^13 + 9288*q^14 + 10584*q^15 + 14043*q^16 + 17379*q^17 + 20439*q^18 + 20580*q^19 + O(q^20)
360
+ """
361
+ B = self.q_expansion_basis(prec)
362
+ f = self._q_expansion_zero()
363
+ for i in range(self._start_position, len(element)):
364
+ if element[i] != 0:
365
+ f += element[i] * B[i - self._start_position]
366
+ return f
367
+
368
+
369
+ class EisensteinSubmodule_g0_Q(EisensteinSubmodule_params):
370
+ r"""
371
+ Space of Eisenstein forms for `\Gamma_0(N)`.
372
+ """
373
+ def _pari_init_(self):
374
+ """
375
+ Conversion to Pari.
376
+
377
+ EXAMPLES::
378
+
379
+ sage: E = EisensteinForms(17,4)
380
+ sage: pari.mfdim(E)
381
+ 2
382
+ sage: pari.mfparams(E)
383
+ [17, 4, 1, 3, t - 1]
384
+ """
385
+ from sage.libs.pari import pari
386
+ return pari.mfinit([self.level(), self.weight()], 3)
387
+
388
+
389
+ class EisensteinSubmodule_gH_Q(EisensteinSubmodule_params):
390
+ r"""
391
+ Space of Eisenstein forms for `\Gamma_H(N)`.
392
+ """
393
+ def _parameters_character(self):
394
+ """
395
+ Return the character defining ``self``. Since ``self`` is
396
+ a space of Eisenstein forms on GammaH(N) rather than a space with fixed
397
+ character, we return the group GammaH(N) itself.
398
+
399
+ EXAMPLES::
400
+
401
+ sage: EisensteinForms(GammaH(9, [4]),4)._parameters_character()
402
+ Congruence Subgroup Gamma_H(9) with H generated by [4]
403
+ """
404
+ return self.group()
405
+
406
+ def _convert_matrix_from_modsyms_eis(self, A):
407
+ r"""
408
+ Given a matrix acting on the space of modular symbols corresponding to
409
+ this space, calculate the matrix of the operator it induces on this
410
+ space itself. Used for Hecke and diamond operators.
411
+
412
+ This is a minor modification of the code used for cusp forms, which is
413
+ required because modular symbols "don't see the constant term": the
414
+ modular symbol method calculates the matrix of the operator with
415
+ respect to the unique basis of the modular forms space for which the
416
+ *non-constant* coefficients are in echelon form, and we need to modify
417
+ this to get a matrix with respect to the basis we're actually using.
418
+
419
+ EXAMPLES::
420
+
421
+ sage: EisensteinForms(Gamma1(6), 3).hecke_matrix(3) # indirect doctest
422
+ [ 1 0 72 0]
423
+ [ 0 0 36 -9]
424
+ [ 0 0 9 0]
425
+ [ 0 1 -4 10]
426
+ """
427
+ from .cuspidal_submodule import _convert_matrix_from_modsyms
428
+ symbs = self.modular_symbols(sign=0)
429
+ d = self.rank()
430
+ wrong_mat, pivs = _convert_matrix_from_modsyms(symbs, A)
431
+ c = Matrix(self.base_ring(), d, [self.basis()[i][j+1] for i in range(d) for j in pivs])
432
+ return c * wrong_mat * ~c
433
+
434
+ def _compute_hecke_matrix(self, n, bound=None):
435
+ r"""
436
+ Calculate the matrix of the Hecke operator `T_n` acting on this
437
+ space, via modular symbols.
438
+
439
+ INPUT:
440
+
441
+ - ``n`` -- positive integer
442
+
443
+ - ``bound`` -- integer such that any element of this space with
444
+ coefficients a_1, ..., a_b all zero must be the zero
445
+ element. If this turns out not to be true, the code will
446
+ increase the bound and try again. Setting bound = None is
447
+ equivalent to setting bound = self.dimension().
448
+
449
+ OUTPUT: matrix (over `\QQ`)
450
+
451
+ ALGORITHM:
452
+
453
+ This uses the usual pairing between modular symbols and
454
+ modular forms, but in a slightly non-standard way. As for
455
+ cusp forms, we can find a basis for this space made up of
456
+ forms with `q`-expansions `c_m(f) = a_{i,j}(T_m)`, where
457
+ `T_m` denotes the matrix of the Hecke operator on the
458
+ corresponding modular symbols space. Then `c_m(T_n f) =
459
+ a_{i,j}(T_n* T_m)`. But we can't find the constant terms
460
+ by this method, so an extra step is required.
461
+
462
+ EXAMPLES::
463
+
464
+ sage: EisensteinForms(Gamma1(6), 3).hecke_matrix(3) # indirect doctest
465
+ [ 1 0 72 0]
466
+ [ 0 0 36 -9]
467
+ [ 0 0 9 0]
468
+ [ 0 1 -4 10]
469
+ """
470
+ symbs = self.modular_symbols(sign=0)
471
+ T = symbs.hecke_matrix(n)
472
+ return self._convert_matrix_from_modsyms_eis(T)
473
+
474
+ def _compute_diamond_matrix(self, d):
475
+ r"""
476
+ Calculate the matrix of the diamond bracket operator <d> on this space,
477
+ using modular symbols.
478
+
479
+ EXAMPLES::
480
+
481
+ sage: E = EisensteinForms(Gamma1(7), 3)
482
+ sage: E._compute_diamond_matrix(3)
483
+ [ 27 126 294 770 2142 3528]
484
+ [56/3 85 200 530 1445 2408]
485
+ [11/3 14 22 66 233 392]
486
+ [ -1 -3 -3 -11 -51 -87]
487
+ [ -1 -4 -7 -20 -67 -112]
488
+ [-1/3 -2 -6 -15 -34 -56]
489
+ """
490
+ symbs = self.modular_symbols(sign=0)
491
+ T = symbs.diamond_bracket_matrix(d)
492
+ return self._convert_matrix_from_modsyms_eis(T)
493
+
494
+
495
+ class EisensteinSubmodule_g1_Q(EisensteinSubmodule_gH_Q):
496
+ r"""
497
+ Space of Eisenstein forms for `\Gamma_1(N)`.
498
+ """
499
+ def _parameters_character(self):
500
+ r"""
501
+ Return the character defining ``self``.
502
+
503
+ Since ``self`` is a space of Eisenstein
504
+ forms on `\Gamma_1(N)`, all characters modulo the level are possible,
505
+ so we return the level.
506
+
507
+ EXAMPLES::
508
+
509
+ sage: EisensteinForms(Gamma1(7),4)._parameters_character()
510
+ 7
511
+ """
512
+ return self.level()
513
+
514
+
515
+ class EisensteinSubmodule_eps(EisensteinSubmodule_params):
516
+ """
517
+ Space of Eisenstein forms with given Dirichlet character.
518
+
519
+ EXAMPLES::
520
+
521
+ sage: e = DirichletGroup(27,CyclotomicField(3)).0**2
522
+ sage: M = ModularForms(e,2,prec=10).eisenstein_subspace()
523
+ sage: M.dimension()
524
+ 6
525
+
526
+ sage: M.eisenstein_series()
527
+ [-1/3*zeta6 - 1/3 + q + (2*zeta6 - 1)*q^2 + q^3 + (-2*zeta6 - 1)*q^4 + (-5*zeta6 + 1)*q^5 + O(q^6),
528
+ -1/3*zeta6 - 1/3 + q^3 + O(q^6),
529
+ q + (-2*zeta6 + 1)*q^2 + (-2*zeta6 - 1)*q^4 + (5*zeta6 - 1)*q^5 + O(q^6),
530
+ q + (zeta6 + 1)*q^2 + 3*q^3 + (zeta6 + 2)*q^4 + (-zeta6 + 5)*q^5 + O(q^6),
531
+ q^3 + O(q^6),
532
+ q + (-zeta6 - 1)*q^2 + (zeta6 + 2)*q^4 + (zeta6 - 5)*q^5 + O(q^6)]
533
+ sage: M.eisenstein_subspace().T(2).matrix().fcp()
534
+ (x + 2*zeta3 + 1) * (x + zeta3 + 2) * (x - zeta3 - 2)^2 * (x - 2*zeta3 - 1)^2
535
+ sage: ModularSymbols(e,2).eisenstein_subspace().T(2).matrix().fcp()
536
+ (x + 2*zeta3 + 1) * (x + zeta3 + 2) * (x - zeta3 - 2)^2 * (x - 2*zeta3 - 1)^2
537
+
538
+ sage: M.basis()
539
+ [1 - 3*zeta3*q^6 + (-2*zeta3 + 2)*q^9 + O(q^10),
540
+ q + (5*zeta3 + 5)*q^7 + O(q^10),
541
+ q^2 - 2*zeta3*q^8 + O(q^10),
542
+ q^3 + (zeta3 + 2)*q^6 + 3*q^9 + O(q^10),
543
+ q^4 - 2*zeta3*q^7 + O(q^10),
544
+ q^5 + (zeta3 + 1)*q^8 + O(q^10)]
545
+ """
546
+ def _pari_init_(self):
547
+ """
548
+ Conversion to Pari.
549
+
550
+ EXAMPLES::
551
+
552
+ sage: e = DirichletGroup(27,CyclotomicField(3)).0**2
553
+ sage: M = ModularForms(e,2,prec=10).eisenstein_subspace()
554
+ sage: pari.mfdim(M)
555
+ 6
556
+ sage: pari.mfparams(M)
557
+ [27, 2, Mod(10, 27), 3, t^2 + t + 1]
558
+ """
559
+ from sage.libs.pari import pari
560
+ return pari.mfinit([self.level(), self.weight(), self.character()], 3)
561
+
562
+ # TODO
563
+ # def _compute_q_expansion_basis(self, prec):
564
+ # B = EisensteinSubmodule_params._compute_q_expansion_basis(self, prec)
565
+ # raise NotImplementedError("must restrict scalars down correctly.")
566
+
567
+
568
+ def cyclotomic_restriction(L, K):
569
+ r"""
570
+ Given two cyclotomic fields `L` and `K`, compute the compositum
571
+ `M` of `K` and `L`, and return a function `f` and the index `[M:K]`.
572
+
573
+ The function `f` is a map that acts as follows (here `M =\QQ(\zeta_m)`):
574
+
575
+ INPUT: element alpha in `L`
576
+ OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`,
577
+ where we view alpha as living in `M`. (Note that `\zeta_m` generates
578
+ `M`, not `L`.)
579
+
580
+ EXAMPLES::
581
+
582
+ sage: L = CyclotomicField(12); N = CyclotomicField(33); M = CyclotomicField(132)
583
+ sage: z, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L, N)
584
+ sage: n
585
+ 2
586
+
587
+ sage: z(L.0)
588
+ -zeta33^19*x
589
+ sage: z(L.0)(M.0)
590
+ zeta132^11
591
+
592
+ sage: z(L.0^3 - L.0 + 1)
593
+ (zeta33^19 + zeta33^8)*x + 1
594
+ sage: z(L.0^3 - L.0 + 1)(M.0)
595
+ zeta132^33 - zeta132^11 + 1
596
+ sage: z(L.0^3 - L.0 + 1)(M.0) - M(L.0^3 - L.0 + 1)
597
+ 0
598
+ """
599
+ if not L.has_coerce_map_from(K):
600
+ M = CyclotomicField(lcm(L.zeta_order(), K.zeta_order()))
601
+ f = cyclotomic_restriction_tower(M,K)
602
+
603
+ def g(x):
604
+ r"""
605
+ Function returned by cyclotomic restriction.
606
+
607
+ EXAMPLES::
608
+
609
+ sage: L = CyclotomicField(12)
610
+ sage: N = CyclotomicField(33)
611
+ sage: g, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N)
612
+ sage: g(L.0)
613
+ -zeta33^19*x
614
+ """
615
+ return f(M(x))
616
+ return g, euler_phi(M.zeta_order())//euler_phi(K.zeta_order())
617
+ else:
618
+ return cyclotomic_restriction_tower(L,K), \
619
+ euler_phi(L.zeta_order())//euler_phi(K.zeta_order())
620
+
621
+
622
+ def cyclotomic_restriction_tower(L, K):
623
+ r"""
624
+ Suppose `L/K` is an extension of cyclotomic fields and `L=Q(\zeta_m)`.
625
+ This function computes a map with the following property:
626
+
627
+ INPUT: element alpha in `L`
628
+ OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = alpha`
629
+
630
+ EXAMPLES::
631
+
632
+ sage: L = CyclotomicField(12) ; K = CyclotomicField(6)
633
+ sage: z = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction_tower(L,K)
634
+ sage: z(L.0)
635
+ x
636
+ sage: z(L.0^2+L.0)
637
+ x + zeta6
638
+ """
639
+ if not L.has_coerce_map_from(K):
640
+ raise ValueError("K must be contained in L")
641
+ f = L.defining_polynomial()
642
+ R = K['x']
643
+ g = R(f)
644
+ h_ls = [t[0] for t in g.factor() if t[0](L.gen(0)) == 0]
645
+ if not h_ls:
646
+ raise ValueError(r"K (= Q(\zeta_%s)) is not contained in L (= Q(\zeta_%s))" % (K._n(), L._n()))
647
+ h = h_ls[0]
648
+
649
+ def z(a):
650
+ """
651
+ Function returned by cyclotomic_restriction_tower.
652
+
653
+ EXAMPLES::
654
+
655
+ sage: L = CyclotomicField(121); K = CyclotomicField(11)
656
+ sage: z = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction_tower(L,K)
657
+ sage: z(L.0)
658
+ x
659
+ sage: z(L.0^11)
660
+ zeta11
661
+ """
662
+ return R(a.polynomial()) % h
663
+ return z