passagemath-schemes 10.6.47__cp312-cp312-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.
Files changed (311) 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.47.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
  9. passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.47.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-312-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-312-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-312-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-312-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-312-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-312-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-312-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-312-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_nf.py +1241 -0
  154. sage/modular/modsym/relation_matrix.py +591 -0
  155. sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
  156. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  157. sage/modular/modsym/space.py +2468 -0
  158. sage/modular/modsym/subspace.py +455 -0
  159. sage/modular/modsym/tests.py +375 -0
  160. sage/modular/multiple_zeta.py +2632 -0
  161. sage/modular/multiple_zeta_F_algebra.py +786 -0
  162. sage/modular/overconvergent/all.py +6 -0
  163. sage/modular/overconvergent/genus0.py +1878 -0
  164. sage/modular/overconvergent/hecke_series.py +1187 -0
  165. sage/modular/overconvergent/weightspace.py +778 -0
  166. sage/modular/pollack_stevens/all.py +4 -0
  167. sage/modular/pollack_stevens/distributions.py +874 -0
  168. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  169. sage/modular/pollack_stevens/manin_map.py +859 -0
  170. sage/modular/pollack_stevens/modsym.py +1593 -0
  171. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  172. sage/modular/pollack_stevens/sigma0.py +534 -0
  173. sage/modular/pollack_stevens/space.py +1076 -0
  174. sage/modular/quasimodform/all.py +3 -0
  175. sage/modular/quasimodform/element.py +845 -0
  176. sage/modular/quasimodform/ring.py +828 -0
  177. sage/modular/quatalg/all.py +3 -0
  178. sage/modular/quatalg/brandt.py +1642 -0
  179. sage/modular/ssmod/all.py +8 -0
  180. sage/modular/ssmod/ssmod.py +827 -0
  181. sage/rings/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  183. sage/rings/polynomial/binary_form_reduce.py +585 -0
  184. sage/schemes/all.py +41 -0
  185. sage/schemes/berkovich/all.py +6 -0
  186. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  187. sage/schemes/berkovich/berkovich_space.py +748 -0
  188. sage/schemes/curves/affine_curve.py +2928 -0
  189. sage/schemes/curves/all.py +33 -0
  190. sage/schemes/curves/closed_point.py +434 -0
  191. sage/schemes/curves/constructor.py +381 -0
  192. sage/schemes/curves/curve.py +542 -0
  193. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  194. sage/schemes/curves/point.py +463 -0
  195. sage/schemes/curves/projective_curve.py +3026 -0
  196. sage/schemes/curves/zariski_vankampen.py +1932 -0
  197. sage/schemes/cyclic_covers/all.py +2 -0
  198. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  199. sage/schemes/cyclic_covers/constructor.py +137 -0
  200. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  201. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  202. sage/schemes/elliptic_curves/BSD.py +1036 -0
  203. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  204. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  205. sage/schemes/elliptic_curves/all.py +49 -0
  206. sage/schemes/elliptic_curves/cardinality.py +609 -0
  207. sage/schemes/elliptic_curves/cm.py +1102 -0
  208. sage/schemes/elliptic_curves/constructor.py +1552 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  214. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  215. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  216. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  217. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  218. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  219. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  221. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  222. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  223. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  224. sage/schemes/elliptic_curves/formal_group.py +760 -0
  225. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  226. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7335 -0
  229. sage/schemes/elliptic_curves/height.py +2109 -0
  230. sage/schemes/elliptic_curves/hom.py +1406 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  232. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  233. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  234. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  235. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  236. sage/schemes/elliptic_curves/homset.py +271 -0
  237. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  238. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  239. sage/schemes/elliptic_curves/jacobian.py +237 -0
  240. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  241. sage/schemes/elliptic_curves/kraus.py +1014 -0
  242. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  243. sage/schemes/elliptic_curves/mod5family.py +105 -0
  244. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  245. sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  247. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  248. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  249. sage/schemes/elliptic_curves/padics.py +1816 -0
  250. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  251. sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  253. sage/schemes/elliptic_curves/saturation.py +715 -0
  254. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  255. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  256. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  257. sage/schemes/hyperelliptic_curves/all.py +6 -0
  258. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  259. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  264. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  265. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  270. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  271. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  272. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  273. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  274. sage/schemes/jacobians/all.py +2 -0
  275. sage/schemes/overview.py +161 -0
  276. sage/schemes/plane_conics/all.py +22 -0
  277. sage/schemes/plane_conics/con_field.py +1296 -0
  278. sage/schemes/plane_conics/con_finite_field.py +158 -0
  279. sage/schemes/plane_conics/con_number_field.py +456 -0
  280. sage/schemes/plane_conics/con_rational_field.py +406 -0
  281. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  282. sage/schemes/plane_conics/constructor.py +249 -0
  283. sage/schemes/plane_quartics/all.py +2 -0
  284. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  285. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  286. sage/schemes/riemann_surfaces/all.py +1 -0
  287. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  288. sage_wheels/share/cremona/cremona_mini.db +0 -0
  289. sage_wheels/share/ellcurves/rank0 +30427 -0
  290. sage_wheels/share/ellcurves/rank1 +31871 -0
  291. sage_wheels/share/ellcurves/rank10 +6 -0
  292. sage_wheels/share/ellcurves/rank11 +6 -0
  293. sage_wheels/share/ellcurves/rank12 +1 -0
  294. sage_wheels/share/ellcurves/rank14 +1 -0
  295. sage_wheels/share/ellcurves/rank15 +1 -0
  296. sage_wheels/share/ellcurves/rank17 +1 -0
  297. sage_wheels/share/ellcurves/rank19 +1 -0
  298. sage_wheels/share/ellcurves/rank2 +2388 -0
  299. sage_wheels/share/ellcurves/rank20 +1 -0
  300. sage_wheels/share/ellcurves/rank21 +1 -0
  301. sage_wheels/share/ellcurves/rank22 +1 -0
  302. sage_wheels/share/ellcurves/rank23 +1 -0
  303. sage_wheels/share/ellcurves/rank24 +1 -0
  304. sage_wheels/share/ellcurves/rank28 +1 -0
  305. sage_wheels/share/ellcurves/rank3 +836 -0
  306. sage_wheels/share/ellcurves/rank4 +10 -0
  307. sage_wheels/share/ellcurves/rank5 +5 -0
  308. sage_wheels/share/ellcurves/rank6 +5 -0
  309. sage_wheels/share/ellcurves/rank7 +5 -0
  310. sage_wheels/share/ellcurves/rank8 +6 -0
  311. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,1593 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs eclib
3
+ r"""
4
+ Element class for Pollack-Stevens' modular symbols
5
+
6
+ This is the class of elements in the spaces of Pollack-Steven's modular symbols as described in [PS2011]_.
7
+
8
+ EXAMPLES::
9
+
10
+ sage: E = EllipticCurve('11a')
11
+ sage: phi = E.pollack_stevens_modular_symbol(); phi
12
+ Modular symbol of level 11 with values in Sym^0 Q^2
13
+ sage: phi.weight() # Note that weight k=2 of a modular form corresponds here to weight 0
14
+ 0
15
+ sage: phi.values()
16
+ [-1/5, 1, 0]
17
+ sage: phi.is_ordinary(11)
18
+ True
19
+ sage: phi_lift = phi.lift(11, 5, eigensymbol = True) # long time
20
+ sage: phi_lift.padic_lseries().series(5) # long time
21
+ O(11^5) + (10 + 3*11 + 6*11^2 + 9*11^3 + O(11^4))*T + (6 + 3*11 + 2*11^2 + O(11^3))*T^2 + (2 + 2*11 + O(11^2))*T^3 + (5 + O(11))*T^4 + O(T^5)
22
+
23
+ ::
24
+
25
+ sage: A = ModularSymbols(Gamma1(8),4).decomposition()[0].plus_submodule().new_subspace()
26
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
27
+ sage: phi = ps_modsym_from_simple_modsym_space(A)
28
+ sage: phi.values()
29
+ [(-1, 0, 0), (1, 0, 0), (-9, -6, -4)]
30
+ """
31
+ # ****************************************************************************
32
+ # Copyright (C) 2012 Robert Pollack <rpollack@math.bu.edu>
33
+ #
34
+ # Distributed under the terms of the GNU General Public License (GPL)
35
+ # as published by the Free Software Foundation; either version 2 of
36
+ # the License, or (at your option) any later version.
37
+ # https://www.gnu.org/licenses/
38
+ # *****************************************************************************
39
+
40
+ import operator
41
+ try:
42
+ from typing import Self # type: ignore (Python >= 3.11)
43
+ except ImportError:
44
+ from typing_extensions import Self # type: ignore (Python 3.10)
45
+
46
+ from sage.arith.misc import gcd, kronecker, next_prime
47
+ from sage.categories.action import Action
48
+ from sage.misc.cachefunc import cached_method
49
+ from sage.misc.lazy_import import lazy_import
50
+ from sage.misc.verbose import verbose
51
+ from sage.rings.integer_ring import ZZ
52
+ from sage.rings.padics.precision_error import PrecisionError
53
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
54
+ from sage.rings.rational_field import QQ
55
+ from sage.structure.element import ModuleElement
56
+ from sage.structure.richcmp import op_EQ, op_NE
57
+
58
+ lazy_import('sage.rings.padics.factory', 'Qp')
59
+ lazy_import('sage.rings.padics.padic_generic', 'pAdicGeneric')
60
+
61
+ from .fund_domain import M2Z
62
+ from .manin_map import ManinMap
63
+ from .sigma0 import Sigma0
64
+
65
+ minusproj = [1, 0, 0, -1]
66
+
67
+
68
+ def _iterate_Up(Phi, p, M, ap, q, aq, check):
69
+ r"""
70
+ Return an overconvergent Hecke-eigensymbol lifting ``self`` -- ``self``
71
+ must be a `p`-ordinary eigensymbol.
72
+
73
+ INPUT:
74
+
75
+ - ``p`` -- prime
76
+
77
+ - ``M`` -- integer equal to the number of moments
78
+
79
+ - ``ap`` -- Hecke eigenvalue at `p`
80
+
81
+ - ``q`` -- prime
82
+
83
+ - ``aq`` -- Hecke eigenvalue at `q`
84
+
85
+ OUTPUT: Hecke-eigenvalue overconvergent modular symbol lifting ``self``
86
+
87
+ EXAMPLES::
88
+
89
+ sage: E = EllipticCurve('57a')
90
+ sage: p = 5
91
+ sage: prec = 4
92
+ sage: phi = E.pollack_stevens_modular_symbol()
93
+ sage: phi_stabilized = phi.p_stabilize(p,M = prec)
94
+ sage: Phi = phi_stabilized.lift(p,prec) # indirect doctest
95
+ """
96
+ if ap.valuation(p) > 0:
97
+ raise ValueError("Lifting non-ordinary eigensymbols not implemented (issue #20)")
98
+
99
+ # Act by Hecke to ensure values are in D and not D^dag after solving difference equation
100
+ verbose("Applying Hecke", level=2)
101
+
102
+ apinv = ~ap
103
+ Phi = apinv * Phi.hecke(p)
104
+
105
+ # Killing eisenstein part
106
+ verbose("Killing eisenstein part with q = %s" % q, level=2)
107
+ k = Phi.parent().weight()
108
+ Phi = ((q ** (k + 1) + 1) * Phi - Phi.hecke(q))
109
+
110
+ # Iterating U_p
111
+ verbose("Iterating U_p", level=2)
112
+ Psi = apinv * Phi.hecke(p)
113
+
114
+ for attempts in range(M - 1):
115
+ verbose("%s attempt (val = %s/%s)" % (attempts + 1,(Phi-Psi).valuation(),M), level=2)
116
+ Phi = Psi
117
+ Psi = apinv * Phi.hecke(p)
118
+ Psi._normalize()
119
+ return ~(q ** (k + 1) + 1 - aq) * Phi
120
+
121
+
122
+ class PSModSymAction(Action):
123
+ def __init__(self, actor, MSspace):
124
+ r"""
125
+ Create the action.
126
+
127
+ EXAMPLES::
128
+
129
+ sage: E = EllipticCurve('11a')
130
+ sage: phi = E.pollack_stevens_modular_symbol()
131
+ sage: g = phi._map._codomain._act._Sigma0(matrix(ZZ,2,2,[1,2,3,4]))
132
+ sage: phi * g # indirect doctest
133
+ Modular symbol of level 11 with values in Sym^0 Q^2
134
+ """
135
+
136
+ Action.__init__(self, actor, MSspace, False, operator.mul)
137
+
138
+ def _act_(self, g, sym):
139
+ r"""
140
+ Return the result of ``sym * g``.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: E = EllipticCurve('11a')
145
+ sage: phi = E.pollack_stevens_modular_symbol()
146
+ sage: g = phi._map._codomain._act._Sigma0(matrix(ZZ,2,2,[2,1,5,-1]))
147
+ sage: phi * g # indirect doctest
148
+ Modular symbol of level 11 with values in Sym^0 Q^2
149
+ """
150
+
151
+ return sym.__class__(sym._map * g, sym.parent(), construct=True)
152
+
153
+
154
+ class PSModularSymbolElement(ModuleElement):
155
+ def __init__(self, map_data, parent, construct=False):
156
+ r"""
157
+ Initialize a modular symbol.
158
+
159
+ EXAMPLES::
160
+
161
+ sage: E = EllipticCurve('37a')
162
+ sage: phi = E.pollack_stevens_modular_symbol()
163
+ """
164
+ ModuleElement.__init__(self, parent)
165
+ if construct:
166
+ self._map = map_data
167
+ else:
168
+ self._map = ManinMap(parent._coefficients, parent._source, map_data)
169
+
170
+ def _repr_(self):
171
+ r"""
172
+ Return the string representation of the symbol.
173
+
174
+ EXAMPLES::
175
+
176
+ sage: E = EllipticCurve('11a')
177
+ sage: phi = E.pollack_stevens_modular_symbol()
178
+ sage: phi._repr_()
179
+ 'Modular symbol of level 11 with values in Sym^0 Q^2'
180
+ """
181
+ return "Modular symbol of level %s with values in %s" % (self.parent().level(), self.parent().coefficient_module())
182
+
183
+ def dict(self):
184
+ r"""
185
+ Return dictionary on the modular symbol ``self``, where keys are
186
+ generators and values are the corresponding values of ``self`` on
187
+ generators.
188
+
189
+ EXAMPLES::
190
+
191
+ sage: E = EllipticCurve('11a')
192
+ sage: phi = E.pollack_stevens_modular_symbol()
193
+ sage: Set([x.moment(0) for x in phi.dict().values()]) == Set([-1/5, 1, 0])
194
+ True
195
+ """
196
+ D = {}
197
+ for g in self.parent().source().gens():
198
+ D[g] = self._map[g]
199
+ return D
200
+
201
+ def weight(self):
202
+ r"""
203
+ Return the weight of this Pollack-Stevens modular symbol.
204
+
205
+ This is `k-2`, where `k` is the usual notion of weight for modular
206
+ forms!
207
+
208
+ EXAMPLES::
209
+
210
+ sage: E = EllipticCurve('11a')
211
+ sage: phi = E.pollack_stevens_modular_symbol()
212
+ sage: phi.weight()
213
+ 0
214
+ """
215
+ return self.parent().weight()
216
+
217
+ def values(self):
218
+ r"""
219
+ Return the values of the symbol ``self`` on our chosen generators.
220
+
221
+ The generators are listed in ``self.dict()``.
222
+
223
+ EXAMPLES::
224
+
225
+ sage: E = EllipticCurve('11a')
226
+ sage: phi = E.pollack_stevens_modular_symbol()
227
+ sage: phi.values()
228
+ [-1/5, 1, 0]
229
+ sage: sorted(phi.dict())
230
+ [
231
+ [-1 -1] [ 0 -1] [1 0]
232
+ [ 3 2], [ 1 3], [0 1]
233
+ ]
234
+ sage: sorted(phi.values()) == sorted(phi.dict().values())
235
+ True
236
+ """
237
+ return [self._map[g] for g in self.parent().source().gens()]
238
+
239
+ def _normalize(self, **kwds) -> Self:
240
+ """
241
+ Normalize all of the values of the symbol ``self``.
242
+
243
+ EXAMPLES::
244
+
245
+ sage: E = EllipticCurve('11a')
246
+ sage: phi = E.pollack_stevens_modular_symbol()
247
+ sage: phi._normalize()
248
+ Modular symbol of level 11 with values in Sym^0 Q^2
249
+ sage: phi._normalize().values()
250
+ [-1/5, 1, 0]
251
+ """
252
+ for val in self._map:
253
+ val.normalize(**kwds)
254
+ return self
255
+
256
+ def _richcmp_(self, other, op):
257
+ """
258
+ Check if ``self == other``.
259
+
260
+ Here ``self`` and ``other`` have the same parent.
261
+
262
+ EXAMPLES::
263
+
264
+ sage: E = EllipticCurve('11a')
265
+ sage: phi = E.pollack_stevens_modular_symbol()
266
+ sage: phi == phi
267
+ True
268
+ sage: phi == 2*phi
269
+ False
270
+ sage: psi = EllipticCurve('37a').pollack_stevens_modular_symbol()
271
+ sage: psi == phi
272
+ False
273
+ """
274
+ if op not in [op_EQ, op_NE]:
275
+ return NotImplemented
276
+
277
+ b = all(self._map[g] == other._map[g]
278
+ for g in self.parent().source().gens())
279
+
280
+ return b == (op == op_EQ)
281
+
282
+ def _add_(self, right):
283
+ """
284
+ Return ``self + right``.
285
+
286
+ EXAMPLES::
287
+
288
+ sage: E = EllipticCurve('11a')
289
+ sage: phi = E.pollack_stevens_modular_symbol()
290
+ sage: phi.values()
291
+ [-1/5, 1, 0]
292
+ sage: phi + phi
293
+ Modular symbol of level 11 with values in Sym^0 Q^2
294
+ sage: (phi + phi).values()
295
+ [-2/5, 2, 0]
296
+ """
297
+ return self.__class__(self._map + right._map, self.parent(), construct=True)
298
+
299
+ def _lmul_(self, right):
300
+ """
301
+ Return ``self * right``.
302
+
303
+ EXAMPLES::
304
+
305
+ sage: E = EllipticCurve('11a')
306
+ sage: phi = E.pollack_stevens_modular_symbol()
307
+ sage: phi.values()
308
+ [-1/5, 1, 0]
309
+ sage: 2*phi
310
+ Modular symbol of level 11 with values in Sym^0 Q^2
311
+ sage: (2*phi).values()
312
+ [-2/5, 2, 0]
313
+ """
314
+ return self.__class__(self._map * right, self.parent(), construct=True)
315
+
316
+ def _rmul_(self, right):
317
+ """
318
+ Return ``self * right``.
319
+
320
+ EXAMPLES::
321
+
322
+ sage: E = EllipticCurve('11a')
323
+ sage: phi = E.pollack_stevens_modular_symbol()
324
+ sage: phi.values()
325
+ [-1/5, 1, 0]
326
+ sage: phi*2
327
+ Modular symbol of level 11 with values in Sym^0 Q^2
328
+ sage: (phi*2).values()
329
+ [-2/5, 2, 0]
330
+ """
331
+ return self.__class__(self._map * right, self.parent(), construct=True)
332
+
333
+ def _sub_(self, right):
334
+ """
335
+ Return ``self - right``.
336
+
337
+ EXAMPLES::
338
+
339
+ sage: E = EllipticCurve('11a')
340
+ sage: phi = E.pollack_stevens_modular_symbol()
341
+ sage: phi.values()
342
+ [-1/5, 1, 0]
343
+ sage: phi - phi
344
+ Modular symbol of level 11 with values in Sym^0 Q^2
345
+ sage: (phi - phi).values()
346
+ [0, 0, 0]
347
+ """
348
+ return self.__class__(self._map - right._map, self.parent(), construct=True)
349
+
350
+ def _get_prime(self, p=None, alpha=None, allow_none=False):
351
+ """
352
+ Combine a prime specified by the user with the prime from the parent.
353
+
354
+ INPUT:
355
+
356
+ - ``p`` -- integer or ``None`` (default: ``None``); if specified
357
+ needs to match the prime of the parent
358
+
359
+ - ``alpha`` -- an element or None (default: ``None``); if `p`-adic
360
+ can contribute a prime
361
+
362
+ - ``allow_none`` -- boolean (default: ``False``); whether to allow
363
+ no prime to be specified
364
+
365
+ OUTPUT:
366
+
367
+ - a prime or ``None``. If ``allow_none`` is ``False`` then a
368
+ :exc:`ValueError` will be raised rather than returning ``None``
369
+ if no prime can be determined.
370
+
371
+ EXAMPLES::
372
+
373
+ sage: from sage.modular.pollack_stevens.distributions import Symk
374
+ sage: D = OverconvergentDistributions(0, 5, 10)
375
+ sage: M = PollackStevensModularSymbols(Gamma0(5), coefficients=D)
376
+ sage: f = M(1); f._get_prime()
377
+ 5
378
+ sage: f._get_prime(5)
379
+ 5
380
+ sage: f._get_prime(7)
381
+ Traceback (most recent call last):
382
+ ...
383
+ ValueError: inconsistent prime
384
+ sage: f._get_prime(alpha=Qp(5)(1))
385
+ 5
386
+ sage: D = Symk(0)
387
+ sage: M = PollackStevensModularSymbols(Gamma0(2), coefficients=D)
388
+ sage: f = M(1); f._get_prime(allow_none=True) is None
389
+ True
390
+ sage: f._get_prime(alpha=Qp(7)(1))
391
+ 7
392
+ sage: f._get_prime(7,alpha=Qp(7)(1))
393
+ 7
394
+ sage: f._get_prime()
395
+ Traceback (most recent call last):
396
+ ...
397
+ ValueError: you must specify a prime
398
+ """
399
+ pp = self.parent().prime()
400
+ ppp = ((alpha is not None) and hasattr(alpha.parent(), 'prime')
401
+ and alpha.parent().prime()) or None
402
+ p = ZZ(p) or pp or ppp
403
+ if not p:
404
+ if not allow_none:
405
+ raise ValueError("you must specify a prime")
406
+ elif (pp and p != pp) or (ppp and p != ppp):
407
+ raise ValueError("inconsistent prime")
408
+ return p
409
+
410
+ def plus_part(self):
411
+ r"""
412
+ Return the plus part of ``self`` -- i.e.
413
+ ``self + self | [1,0,0,-1]``.
414
+
415
+ Note that we haven't divided by 2. Is this a problem?
416
+
417
+ EXAMPLES::
418
+
419
+ sage: E = EllipticCurve('11a')
420
+ sage: phi = E.pollack_stevens_modular_symbol()
421
+ sage: phi.values()
422
+ [-1/5, 1, 0]
423
+ sage: (phi.plus_part()+phi.minus_part()) == 2 * phi
424
+ True
425
+ """
426
+ S0N = Sigma0(self.parent().level())
427
+ return self + self * S0N(minusproj)
428
+
429
+ def minus_part(self):
430
+ r"""
431
+ Return the minus part of self -- i.e. self - self | [1,0,0,-1]
432
+
433
+ Note that we haven't divided by 2. Is this a problem?
434
+
435
+ OUTPUT:
436
+
437
+ - self -- self | [1,0,0,-1]
438
+
439
+ EXAMPLES::
440
+
441
+ sage: E = EllipticCurve('11a')
442
+ sage: phi = E.pollack_stevens_modular_symbol()
443
+ sage: phi.values()
444
+ [-1/5, 1, 0]
445
+ sage: (phi.plus_part()+phi.minus_part()) == phi * 2
446
+ True
447
+ """
448
+ S0N = Sigma0(self.parent().level())
449
+ return self - self * S0N(minusproj)
450
+
451
+ def hecke(self, ell, algorithm='prep'):
452
+ r"""
453
+ Return ``self`` | `T_{\ell}` by making use of the precomputations in
454
+ ``self.prep_hecke()``.
455
+
456
+ INPUT:
457
+
458
+ - ``ell`` -- a prime
459
+
460
+ - ``algorithm`` -- string, either 'prep' (default) or
461
+ 'naive'
462
+
463
+ OUTPUT:
464
+
465
+ - The image of this element under the Hecke operator
466
+ `T_{\ell}`
467
+
468
+ ALGORITHMS:
469
+
470
+ - If ``algorithm == 'prep'``, precomputes a list of matrices
471
+ that only depend on the level, then uses them to speed up
472
+ the action.
473
+
474
+ - If ``algorithm == 'naive'``, just acts by the matrices
475
+ defining the Hecke operator. That is, it computes
476
+ sum_a self | [1,a,0,ell] + self | [ell,0,0,1],
477
+ the last term occurring only if the level is prime to ell.
478
+
479
+ EXAMPLES::
480
+
481
+ sage: E = EllipticCurve('11a')
482
+ sage: phi = E.pollack_stevens_modular_symbol()
483
+ sage: phi.values()
484
+ [-1/5, 1, 0]
485
+ sage: phi.hecke(2) == phi * E.ap(2)
486
+ True
487
+ sage: phi.hecke(3) == phi * E.ap(3)
488
+ True
489
+ sage: phi.hecke(5) == phi * E.ap(5)
490
+ True
491
+ sage: phi.hecke(101) == phi * E.ap(101)
492
+ True
493
+
494
+ sage: all(phi.hecke(p, algorithm='naive') == phi * E.ap(p) for p in [2,3,5,101]) # long time
495
+ True
496
+ """
497
+ return self.__class__(self._map.hecke(ell, algorithm),
498
+ self.parent(), construct=True)
499
+
500
+ def valuation(self, p=None):
501
+ r"""
502
+ Return the valuation of ``self`` at `p`.
503
+
504
+ Here the valuation is the minimum of the valuations of the
505
+ values of ``self``.
506
+
507
+ INPUT:
508
+
509
+ - ``p`` -- prime
510
+
511
+ OUTPUT: the valuation of ``self`` at `p`
512
+
513
+ EXAMPLES::
514
+
515
+ sage: E = EllipticCurve('11a')
516
+ sage: phi = E.pollack_stevens_modular_symbol()
517
+ sage: phi.values()
518
+ [-1/5, 1, 0]
519
+ sage: phi.valuation(2)
520
+ 0
521
+ sage: phi.valuation(3)
522
+ 0
523
+ sage: phi.valuation(5)
524
+ -1
525
+ sage: phi.valuation(7)
526
+ 0
527
+ sage: phi.valuation()
528
+ Traceback (most recent call last):
529
+ ...
530
+ ValueError: you must specify a prime
531
+
532
+ sage: phi2 = phi.lift(11, M=2)
533
+ sage: phi2.valuation()
534
+ 0
535
+ sage: phi2.valuation(3)
536
+ Traceback (most recent call last):
537
+ ...
538
+ ValueError: inconsistent prime
539
+ sage: phi2.valuation(11)
540
+ 0
541
+ """
542
+ q = self._get_prime(p)
543
+ return min([val.valuation(q) for val in self._map])
544
+
545
+ def diagonal_valuation(self, p):
546
+ """
547
+ Return the minimum of the diagonal valuation on the values of ``self``.
548
+
549
+ INPUT:
550
+
551
+ - ``p`` -- a positive integral prime
552
+
553
+ EXAMPLES::
554
+
555
+ sage: E = EllipticCurve('11a')
556
+ sage: phi = E.pollack_stevens_modular_symbol()
557
+ sage: phi.values()
558
+ [-1/5, 1, 0]
559
+ sage: phi.diagonal_valuation(2)
560
+ 0
561
+ sage: phi.diagonal_valuation(3)
562
+ 0
563
+ sage: phi.diagonal_valuation(5)
564
+ -1
565
+ sage: phi.diagonal_valuation(7)
566
+ 0
567
+ """
568
+ return min([val.diagonal_valuation(p) for val in self._map])
569
+
570
+ @cached_method
571
+ def is_Tq_eigensymbol(self, q, p=None, M=None):
572
+ r"""
573
+ Determine if ``self`` is an eigenvector for `T_q` modulo `p^M`.
574
+
575
+ INPUT:
576
+
577
+ - ``q`` -- prime of the Hecke operator
578
+
579
+ - ``p`` -- prime we are working modulo
580
+
581
+ - ``M`` -- degree of accuracy of approximation
582
+
583
+ OUTPUT: boolean
584
+
585
+ EXAMPLES::
586
+
587
+ sage: E = EllipticCurve('11a')
588
+ sage: phi = E.pollack_stevens_modular_symbol()
589
+ sage: phi.values()
590
+ [-1/5, 1, 0]
591
+ sage: phi_ord = phi.p_stabilize(p = 3, ap = E.ap(3), M = 10, ordinary = True)
592
+ sage: phi_ord.is_Tq_eigensymbol(2,3,10)
593
+ True
594
+ sage: phi_ord.is_Tq_eigensymbol(2,3,100)
595
+ False
596
+ sage: phi_ord.is_Tq_eigensymbol(2,3,1000)
597
+ False
598
+ sage: phi_ord.is_Tq_eigensymbol(3,3,10)
599
+ True
600
+ sage: phi_ord.is_Tq_eigensymbol(3,3,100)
601
+ False
602
+ """
603
+ try:
604
+ self.Tq_eigenvalue(q, p, M)
605
+ return True
606
+ except ValueError:
607
+ return False
608
+
609
+ # what happens if a cached method raises an error? Is it
610
+ # recomputed each time?
611
+ @cached_method
612
+ def Tq_eigenvalue(self, q, p=None, M=None, check=True):
613
+ r"""
614
+ Eigenvalue of `T_q` modulo `p^M`.
615
+
616
+ INPUT:
617
+
618
+ - ``q`` -- prime of the Hecke operator
619
+
620
+ - ``p`` -- prime we are working modulo (default: ``None``)
621
+
622
+ - ``M`` -- degree of accuracy of approximation (default: ``None``)
623
+
624
+ - ``check`` -- check that ``self`` is an eigensymbol
625
+
626
+ OUTPUT:
627
+
628
+ - Constant `c` such that `self|T_q - c * self` has valuation greater than
629
+ or equal to `M` (if it exists), otherwise raises ValueError
630
+
631
+ EXAMPLES::
632
+
633
+ sage: E = EllipticCurve('11a')
634
+ sage: phi = E.pollack_stevens_modular_symbol()
635
+ sage: phi.values()
636
+ [-1/5, 1, 0]
637
+ sage: phi_ord = phi.p_stabilize(p = 3, ap = E.ap(3), M = 10, ordinary = True)
638
+ sage: phi_ord.Tq_eigenvalue(2,3,10) + 2
639
+ O(3^10)
640
+
641
+ sage: phi_ord.Tq_eigenvalue(3,3,10)
642
+ 2 + 3^2 + 2*3^3 + 2*3^4 + 2*3^6 + 3^8 + 2*3^9 + O(3^10)
643
+ sage: phi_ord.Tq_eigenvalue(3,3,100)
644
+ Traceback (most recent call last):
645
+ ...
646
+ ValueError: result not determined to high enough precision
647
+ """
648
+ qhecke = self.hecke(q)
649
+ gens = self.parent().source().gens()
650
+ if p is None:
651
+ p = self.parent().prime()
652
+ i = 0
653
+
654
+ g = gens[i]
655
+ verbose("Computing eigenvalue", level=2)
656
+ while self._map[g].moment(0).is_zero():
657
+ if not qhecke._map[g].moment(0).is_zero():
658
+ raise ValueError("not a scalar multiple")
659
+ i += 1
660
+ try:
661
+ g = gens[i]
662
+ except IndexError:
663
+ raise ValueError("self is zero")
664
+ aq = self.parent().base_ring()(self._map[g].find_scalar_from_zeroth_moment(qhecke._map[g], p, M, check))
665
+
666
+ verbose("Found eigenvalues of %s" % aq, level=2)
667
+ if check:
668
+ verbose("Checking that this is actually an eigensymbol", level=2)
669
+ if p is None or M is None or not ZZ(p).is_prime():
670
+ for g in gens[1:]:
671
+ try:
672
+ if not (qhecke._map[g] - aq * self._map[g]).is_zero():
673
+ # using != did not work
674
+ raise ValueError("not a scalar multiple")
675
+ except PrecisionError:
676
+ if qhecke._map[g] != aq * self._map[g]:
677
+ raise ValueError("not a scalar multiple")
678
+ else:
679
+ verbose('p = %s, M = %s' % (p, M), level=2)
680
+ if qhecke != aq * self:
681
+ raise ValueError("not a scalar multiple")
682
+ # if not aq.parent().is_exact() and M is not None:
683
+ # aq.add_bigoh(M)
684
+ return aq
685
+
686
+ def is_ordinary(self, p=None, P=None) -> bool:
687
+ r"""
688
+ Return ``True`` if the `p`-th eigenvalue is a `p`-adic unit.
689
+
690
+ INPUT:
691
+
692
+ - ``p`` -- a positive integral prime, or ``None`` (default: ``None``)
693
+ - ``P`` -- a prime of the base ring above `p`, or ``None``.
694
+ This is ignored unless the base ring is a number field
695
+
696
+ OUTPUT: boolean
697
+
698
+ EXAMPLES::
699
+
700
+ sage: E = EllipticCurve('11a1')
701
+ sage: phi = E.pollack_stevens_modular_symbol()
702
+ sage: phi.is_ordinary(2)
703
+ False
704
+ sage: E.ap(2)
705
+ -2
706
+ sage: phi.is_ordinary(3)
707
+ True
708
+ sage: E.ap(3)
709
+ -1
710
+ sage: phip = phi.p_stabilize(3,20)
711
+ sage: phip.is_ordinary()
712
+ True
713
+
714
+ A number field example. Here there are multiple primes above `p`, and
715
+ `\phi` is ordinary at one but not the other.::
716
+
717
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
718
+ sage: f = Newforms(32, 8, names='a')[1]
719
+ sage: phi = ps_modsym_from_simple_modsym_space(f.modular_symbols(1))
720
+ sage: (p1, _), (p2, _) = phi.base_ring().ideal(3).factor()
721
+ sage: phi.is_ordinary(p1) != phi.is_ordinary(p2)
722
+ True
723
+ sage: phi.is_ordinary(3)
724
+ Traceback (most recent call last):
725
+ ...
726
+ TypeError: P must be an ideal
727
+ """
728
+ # q is the prime below p, if base is a number field; q = p otherwise
729
+ if p is None:
730
+ if self.parent().prime() == 0:
731
+ raise ValueError("need to specify a prime")
732
+ q = p = self.parent().prime()
733
+ elif p in ZZ:
734
+ q = p
735
+ else:
736
+ q = p.smallest_integer()
737
+ if not q.is_prime():
738
+ raise ValueError("p is not prime")
739
+ if (self.parent().prime() != q) and (self.parent().prime() != 0):
740
+ raise ValueError("prime does not match coefficient module's prime")
741
+ aq = self.Tq_eigenvalue(q)
742
+ return aq.valuation(p) == 0
743
+
744
+ def evaluate_twisted(self, a, chi):
745
+ r"""
746
+ Return `\Phi_{\chi}(\{a/p\}-\{\infty\})` where `\Phi` is ``self`` and
747
+ `\chi` is a quadratic character
748
+
749
+ INPUT:
750
+
751
+ - ``a`` -- integer in the range range(p)
752
+ - ``chi`` -- the modulus of a quadratic character
753
+
754
+ OUTPUT:
755
+
756
+ The distribution `\Phi_{\chi}(\{a/p\}-\{\infty\})`.
757
+
758
+ EXAMPLES::
759
+
760
+ sage: E = EllipticCurve('17a1')
761
+ sage: L = E.padic_lseries(5, implementation='pollackstevens', precision=4) #long time
762
+ sage: D = L.quadratic_twist() # long time
763
+ sage: L.symbol().evaluate_twisted(1,D) # long time
764
+ (1 + 5 + 3*5^2 + 5^3 + O(5^4), 5^2 + O(5^3), 1 + O(5^2), 2 + O(5))
765
+
766
+ sage: E = EllipticCurve('40a4')
767
+ sage: L = E.padic_lseries(7, implementation='pollackstevens', precision=4) #long time
768
+ sage: D = L.quadratic_twist() # long time
769
+ sage: L.symbol().evaluate_twisted(1,D) # long time
770
+ (4 + 6*7 + 3*7^2 + O(7^4), 6*7 + 6*7^2 + O(7^3), 6 + O(7^2), 1 + O(7))
771
+
772
+ TESTS:
773
+
774
+ Check for :issue:`32878`::
775
+
776
+ sage: E = EllipticCurve('11a1')
777
+ sage: L = E.padic_lseries(3, implementation='pollackstevens', precision=4)
778
+ sage: D = 5
779
+ sage: L.symbol().evaluate_twisted(1, D)
780
+ (2 + 3 + 2*3^2 + O(3^4), 2 + 3 + O(3^3), 2 + 3 + O(3^2), 2 + O(3))
781
+ """
782
+ p = self.parent().prime()
783
+ S0p = Sigma0(p)
784
+ Dists = self.parent().coefficient_module()
785
+ M = Dists.precision_cap()
786
+ p = Dists.prime()
787
+ twisted_dist = Dists.zero()
788
+ m_map = self._map
789
+ for b in range(1, abs(chi) + 1):
790
+ if gcd(b, chi) == 1:
791
+ M1 = S0p([1, (b / abs(chi)) % p**M, 0, 1])
792
+ new_dist = m_map(M2Z([a * abs(chi) + p * b,
793
+ 1, p * abs(chi), 0])) * M1
794
+ new_dist = new_dist.scale(kronecker(chi, b)).normalize()
795
+ twisted_dist += new_dist
796
+ return twisted_dist.normalize()
797
+
798
+ def _consistency_check(self):
799
+ """
800
+ Check that the map really does satisfy the Manin relations loop (for debugging).
801
+ The two and three torsion relations are checked and it is checked that the symbol
802
+ adds up correctly around the fundamental domain
803
+
804
+ EXAMPLES::
805
+
806
+ sage: E = EllipticCurve('37a1')
807
+ sage: phi = E.pollack_stevens_modular_symbol()
808
+ sage: phi._consistency_check()
809
+ This modular symbol satisfies the Manin relations
810
+ """
811
+ f = self._map
812
+ MR = self._map._manin
813
+ # Test two torsion relations
814
+ for g in MR.reps_with_two_torsion():
815
+ gamg = MR.two_torsion_matrix(g)
816
+ if not (f[g] * gamg + f[g]).is_zero():
817
+ raise ValueError("Two torsion relation failed with", g)
818
+
819
+ # Test three torsion relations
820
+ for g in MR.reps_with_three_torsion():
821
+ gamg = MR.three_torsion_matrix(g)
822
+ if not (f[g] * (gamg ** 2) + f[g] * gamg + f[g]).is_zero():
823
+ raise ValueError("Three torsion relation failed with", g)
824
+
825
+ # Test that the symbol adds to 0 around the boundary of the
826
+ # fundamental domain
827
+ t = self.parent().coefficient_module().zero()
828
+ for g in MR.gens()[1:]:
829
+ if not (g in MR.reps_with_two_torsion()
830
+ or g in MR.reps_with_three_torsion()):
831
+ t += f[g] * MR.gammas[g] - f[g]
832
+ elif g in MR.reps_with_two_torsion():
833
+ t -= f[g]
834
+ else:
835
+ t -= f[g] # what ?? same thing ??
836
+
837
+ id = MR.gens()[0]
838
+ if f[id] * MR.gammas[id] - f[id] != -t:
839
+ print(t)
840
+ print(f[id] * MR.gammas[id] - f[id])
841
+ raise ValueError("does not add up correctly around loop")
842
+
843
+ print("This modular symbol satisfies the Manin relations")
844
+
845
+
846
+ class PSModularSymbolElement_symk(PSModularSymbolElement):
847
+ def _find_alpha(self, p, k, M=None, ap=None, new_base_ring=None, ordinary=True, check=True, find_extraprec=True):
848
+ r"""
849
+ Find `\alpha`, a `U_p` eigenvalue, which is found as a root of
850
+ the polynomial `x^2 - a_p * x + p^{k+1} \chi(p)`.
851
+
852
+ INPUT:
853
+
854
+ - ``p`` -- prime
855
+
856
+ - ``k`` -- Pollack-Stevens weight
857
+
858
+ - ``M`` -- precision (default: ``None``); of `\QQ_p`
859
+
860
+ - ``ap`` -- Hecke eigenvalue at `p` (default: ``None``)
861
+
862
+ - ``new_base_ring`` -- field of definition of `\alpha` (default: ``None``)
863
+
864
+ - ``ordinary`` -- ``True`` if the prime is ordinary (default: ``True``)
865
+
866
+ - ``check`` -- check to see if the prime is ordinary (default: ``True``)
867
+
868
+ - ``find_extraprec`` -- setting this to ``True`` finds extra precision
869
+ (default: ``True``)
870
+
871
+ OUTPUT:
872
+
873
+ The output is a tuple (``alpha``, ``new_base_ring``, ``newM``,
874
+ ``eisenloss``, ``q``,``aq``), with
875
+
876
+ - ``alpha`` -- `U_p` eigenvalue
877
+
878
+ - ``new_base_ring`` -- field of definition of `\alpha` with precision at least ``newM``
879
+
880
+ - ``newM`` -- new precision
881
+
882
+ - ``eisenloss`` -- loss of precision
883
+
884
+ - ``q`` -- a prime not equal to `p` which was used to find extra precision
885
+
886
+ - ``aq`` -- the Hecke eigenvalue `a_q` corresponding to `q`
887
+
888
+ EXAMPLES::
889
+
890
+ sage: E = EllipticCurve('11a')
891
+ sage: p = 5
892
+ sage: M = 10
893
+ sage: k = 0
894
+ sage: phi = E.pollack_stevens_modular_symbol()
895
+ sage: phi._find_alpha(p,k,M)
896
+ (1 + 4*5 + 3*5^2 + 2*5^3 + 4*5^4 + 4*5^5 + 4*5^6 + 3*5^7 + 2*5^8 + 3*5^9 + 3*5^10 + 3*5^12 + 2*5^13 + O(5^14), 5-adic Field with capped relative precision 14, 13, 1, 2, -2)
897
+ """
898
+ if ap is None:
899
+ ap = self.Tq_eigenvalue(p, check=check)
900
+ if check and ap.valuation(p) > 0:
901
+ raise ValueError("p is not ordinary")
902
+
903
+ chi = self._map._codomain._character
904
+ if chi is not None:
905
+ eps = chi(p)
906
+ else:
907
+ eps = 1
908
+ poly = PolynomialRing(ap.parent(), 'x')([p ** (k + 1) * eps, -ap, 1])
909
+ if new_base_ring is None:
910
+ # These should actually be completions of disc.parent()
911
+ if p == 2:
912
+ # is this the right precision adjustment for p=2?
913
+ new_base_ring = Qp(2, M + 1)
914
+ else:
915
+ new_base_ring = Qp(p, M)
916
+ set_padicbase = True
917
+ else:
918
+ set_padicbase = False
919
+ try:
920
+ verbose("finding alpha: rooting %s in %s" % (poly, new_base_ring), level=2)
921
+ poly = poly.change_ring(new_base_ring)
922
+ (v0, e0), (v1, e1) = poly.roots()
923
+ except (TypeError, ValueError):
924
+ raise ValueError("new base ring must contain a root of x^2 - ap * x + p^(k+1)")
925
+ if v0.valuation(p) > 0:
926
+ v0, v1 = v1, v0
927
+ if ordinary:
928
+ alpha = v0
929
+ else:
930
+ alpha = v1
931
+ if find_extraprec:
932
+ newM, eisenloss, q, aq = self._find_extraprec(p, M, alpha, check)
933
+ else:
934
+ newM, eisenloss, q, aq = M, None, None, None
935
+ if set_padicbase:
936
+ # We want to ensure that the relative precision of alpha
937
+ # and (alpha-1) are both at least *newM*, where newM is
938
+ # obtained from self._find_extraprec
939
+ prec_cap = None
940
+ verbose("testing prec_rel: newM = %s, alpha = %s" % (newM, alpha),
941
+ level=2)
942
+ if alpha.precision_relative() < newM:
943
+ prec_cap = newM + alpha.valuation(p) + (1 if p == 2 else 0)
944
+ if ordinary:
945
+ a1val = (alpha - 1).valuation(p)
946
+ verbose("a1val = %s" % a1val, level=2)
947
+ if a1val > 0 and ap != 1 + p ** (k + 1):
948
+ # if ap = 1 + p**(k+1) then alpha=1 and we need to give up.
949
+ if prec_cap is None:
950
+ prec_cap = newM + a1val + (1 if p == 2 else 0)
951
+ else:
952
+ prec_cap = max(prec_cap, newM + a1val + (1 if p == 2 else 0))
953
+ verbose("prec_cap = %s" % prec_cap, level=2)
954
+ if prec_cap is not None:
955
+ new_base_ring = Qp(p, prec_cap)
956
+ return self._find_alpha(p=p, k=k, M=M, ap=ap, new_base_ring=new_base_ring, ordinary=ordinary, check=False, find_extraprec=find_extraprec)
957
+ return alpha, new_base_ring, newM, eisenloss, q, aq
958
+
959
+ def p_stabilize(self, p=None, M=20, alpha=None, ap=None, new_base_ring=None, ordinary=True, check=True):
960
+ r"""
961
+ Return the `p`-stabilization of ``self`` to level `N p` on which `U_p`
962
+ acts by `\alpha`.
963
+
964
+ Note that since `\alpha` is `p`-adic, the resulting symbol
965
+ is just an approximation to the true `p`-stabilization
966
+ (depending on how well `\alpha` is approximated).
967
+
968
+ INPUT:
969
+
970
+ - ``p`` -- prime not dividing the level of self
971
+
972
+ - ``M`` -- (default: 20) precision of `\QQ_p`
973
+
974
+ - ``alpha`` -- `U_p` eigenvalue
975
+
976
+ - ``ap`` -- Hecke eigenvalue
977
+
978
+ - ``new_base_ring`` -- change of base ring
979
+
980
+ - ``ordinary`` -- boolean (default: ``True``); whether to return the
981
+ ordinary (at ``p``) eigensymbol
982
+
983
+ - ``check`` -- boolean (default: ``True``); whether to perform extra
984
+ sanity checks
985
+
986
+ OUTPUT:
987
+
988
+ A modular symbol with the same Hecke eigenvalues as
989
+ ``self`` away from `p` and eigenvalue `\alpha` at `p`.
990
+ The eigenvalue `\alpha` depends on the parameter ``ordinary``.
991
+
992
+ If ``ordinary`` == True: the unique modular symbol of level
993
+ `N p` with the same Hecke eigenvalues as ``self`` away from
994
+ `p` and unit eigenvalue at `p`; else the unique modular
995
+ symbol of level `N p` with the same Hecke eigenvalues as
996
+ ``self`` away from `p` and non-unit eigenvalue at `p`.
997
+
998
+ EXAMPLES::
999
+
1000
+ sage: E = EllipticCurve('11a')
1001
+ sage: p = 5
1002
+ sage: prec = 4
1003
+ sage: phi = E.pollack_stevens_modular_symbol()
1004
+ sage: phis = phi.p_stabilize(p,M = prec)
1005
+ sage: phis
1006
+ Modular symbol of level 55 with values in Sym^0 Q_5^2
1007
+ sage: phis.hecke(7) == phis*E.ap(7)
1008
+ True
1009
+ sage: phis.hecke(5) == phis*E.ap(5)
1010
+ False
1011
+ sage: phis.hecke(3) == phis*E.ap(3)
1012
+ True
1013
+ sage: phis.Tq_eigenvalue(5)
1014
+ 1 + 4*5 + 3*5^2 + 2*5^3 + O(5^4)
1015
+ sage: phis.Tq_eigenvalue(5,M = 3)
1016
+ 1 + 4*5 + 3*5^2 + O(5^3)
1017
+
1018
+ sage: phis = phi.p_stabilize(p,M = prec,ordinary=False)
1019
+ sage: phis.Tq_eigenvalue(5)
1020
+ 5 + 5^2 + 2*5^3 + O(5^5)
1021
+
1022
+ A complicated example (with nontrivial character)::
1023
+
1024
+ sage: chi = DirichletGroup(24)([-1, -1, -1])
1025
+ sage: f = Newforms(chi,names='a')[0]
1026
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
1027
+ sage: phi = ps_modsym_from_simple_modsym_space(f.modular_symbols(1))
1028
+ sage: phi11, h11 = phi.completions(11,20)[0]
1029
+ sage: phi11s = phi11.p_stabilize()
1030
+ sage: phi11s.is_Tq_eigensymbol(11) # long time
1031
+ True
1032
+ """
1033
+ if check:
1034
+ p = self._get_prime(p, alpha)
1035
+ k = self.parent().weight()
1036
+ M = ZZ(M)
1037
+ verbose("p stabilizing: M = %s" % M, level=2)
1038
+ if alpha is None:
1039
+ alpha, new_base_ring, newM, eisenloss, q, aq = self._find_alpha(p, k, M + 1, ap, new_base_ring, ordinary, check, find_extraprec=False)
1040
+ new_base_ring = Qp(p, M) if p != 2 else Qp(p, M + 1)
1041
+ else:
1042
+ if new_base_ring is None:
1043
+ new_base_ring = alpha.parent()
1044
+ if check:
1045
+ if ap is None:
1046
+ ap = self.base_ring()(alpha + p ** (k + 1) / alpha)
1047
+ elif alpha ** 2 - ap * alpha + p ** (k + 1) != 0:
1048
+ raise ValueError("alpha must be a root of x^2 - a_p*x + p^(k+1)")
1049
+ if self.hecke(p) != ap * self:
1050
+ raise ValueError("alpha must be a root of x^2 - a_p*x + p^(k+1)")
1051
+ verbose("found alpha = %s" % alpha, level=2)
1052
+
1053
+ V = self.parent()._p_stabilize_parent_space(p, new_base_ring)
1054
+ return self.__class__(self._map.p_stabilize(p, alpha, V), V, construct=True)
1055
+
1056
+ def completions(self, p, M):
1057
+ r"""
1058
+ If `K` is the base_ring of self, this function takes all maps
1059
+ `K\to \QQ_p` and applies them to ``self`` return a list of
1060
+ (modular symbol,map: `K\to \QQ_p`) as map varies over all such maps.
1061
+
1062
+ .. NOTE::
1063
+
1064
+ This only returns all completions when `p` splits completely in `K`
1065
+
1066
+ INPUT:
1067
+
1068
+ - ``p`` -- prime
1069
+
1070
+ - ``M`` -- precision
1071
+
1072
+ OUTPUT:
1073
+
1074
+ - A list of tuples (modular symbol,map: `K\to \QQ_p`) as map varies over all such maps
1075
+
1076
+ EXAMPLES::
1077
+
1078
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
1079
+ sage: D = ModularSymbols(67,2,1).cuspidal_submodule().new_subspace().decomposition()[1]
1080
+ sage: f = ps_modsym_from_simple_modsym_space(D)
1081
+ sage: S = f.completions(41,10); S
1082
+ [(Modular symbol of level 67 with values in Sym^0 Q_41^2, Ring morphism:
1083
+ From: Number Field in alpha with defining polynomial x^2 + 3*x + 1
1084
+ To: 41-adic Field with capped relative precision 10
1085
+ Defn: alpha |--> 5 + 22*41 + 19*41^2 + 10*41^3 + 28*41^4 + 22*41^5 + 9*41^6 + 25*41^7 + 40*41^8 + 8*41^9 + O(41^10)), (Modular symbol of level 67 with values in Sym^0 Q_41^2, Ring morphism:
1086
+ From: Number Field in alpha with defining polynomial x^2 + 3*x + 1
1087
+ To: 41-adic Field with capped relative precision 10
1088
+ Defn: alpha |--> 33 + 18*41 + 21*41^2 + 30*41^3 + 12*41^4 + 18*41^5 + 31*41^6 + 15*41^7 + 32*41^9 + O(41^10))]
1089
+ sage: TestSuite(S[0][0]).run(skip=['_test_category'])
1090
+ """
1091
+ K = self.base_ring()
1092
+ R = Qp(p, M + 10)['x']
1093
+ x = R.gen()
1094
+ if K == QQ:
1095
+ f = x - 1
1096
+ else:
1097
+ f = K.defining_polynomial()
1098
+ v = R(f).roots()
1099
+ if len(v) == 0:
1100
+ L = Qp(p, M).extension(f, names='a')
1101
+ # a = L.gen()
1102
+ V = self.parent().change_ring(L)
1103
+ Dist = V.coefficient_module()
1104
+ psi = K.hom([K.gen()], L)
1105
+ embedded_sym = self.parent().element_class(self._map.apply(psi, codomain=Dist, to_moments=True), V, construct=True)
1106
+ return [embedded_sym, psi]
1107
+ else:
1108
+ roots = [r[0] for r in v]
1109
+ ans = []
1110
+ V = self.parent().change_ring(Qp(p, M))
1111
+ Dist = V.coefficient_module()
1112
+ for r in roots:
1113
+ psi = K.hom([r], Qp(p, M))
1114
+ embedded_sym = self.parent().element_class(self._map.apply(psi, codomain=Dist, to_moments=True), V, construct=True)
1115
+ ans.append((embedded_sym, psi))
1116
+ return ans
1117
+
1118
+ def lift(self, p=None, M=None, alpha=None, new_base_ring=None,
1119
+ algorithm=None, eigensymbol=False, check=True):
1120
+ r"""
1121
+ Return a (`p`-adic) overconvergent modular symbol with
1122
+ `M` moments which lifts ``self`` up to an Eisenstein error.
1123
+
1124
+ Here the Eisenstein error is a symbol whose system of Hecke
1125
+ eigenvalues equals `\ell+1` for `T_\ell` when `\ell`
1126
+ does not divide `Np` and 1 for `U_q` when `q` divides `Np`.
1127
+
1128
+ INPUT:
1129
+
1130
+ - ``p`` -- prime
1131
+
1132
+ - ``M`` -- integer equal to the number of moments
1133
+
1134
+ - ``alpha`` -- `U_p` eigenvalue
1135
+
1136
+ - ``new_base_ring`` -- change of base ring
1137
+
1138
+ - ``algorithm`` -- ``'stevens'`` or ``'greenberg'`` (default:
1139
+ ``'stevens'``)
1140
+
1141
+ - ``eigensymbol`` -- if ``True``, lifts to Hecke eigensymbol (self must
1142
+ be a `p`-ordinary eigensymbol)
1143
+
1144
+ (Note: ``eigensymbol = True`` does *not* just indicate to the code that
1145
+ ``self`` is an eigensymbol; it solves a wholly different problem, lifting
1146
+ an eigensymbol to an eigensymbol.)
1147
+
1148
+ OUTPUT:
1149
+
1150
+ An overconvergent modular symbol whose specialization equals self, up
1151
+ to some Eisenstein error if ``eigensymbol`` is False. If ``eigensymbol
1152
+ = True`` then the output will be an overconvergent Hecke eigensymbol
1153
+ (and it will lift the input exactly, the Eisenstein error disappears).
1154
+
1155
+ EXAMPLES::
1156
+
1157
+ sage: E = EllipticCurve('11a')
1158
+ sage: f = E.pollack_stevens_modular_symbol()
1159
+ sage: g = f.lift(11,4,algorithm='stevens',eigensymbol=True)
1160
+ sage: g.is_Tq_eigensymbol(2)
1161
+ True
1162
+ sage: g.Tq_eigenvalue(3)
1163
+ 10 + 10*11 + 10*11^2 + 10*11^3 + O(11^4)
1164
+ sage: g.Tq_eigenvalue(11)
1165
+ 1 + O(11^4)
1166
+
1167
+ We check that lifting and then specializing gives back the original symbol::
1168
+
1169
+ sage: g.specialize() == f
1170
+ True
1171
+
1172
+ Another example, which showed precision loss in an earlier version of the code::
1173
+
1174
+ sage: E = EllipticCurve('37a')
1175
+ sage: p = 5
1176
+ sage: prec = 4
1177
+ sage: phi = E.pollack_stevens_modular_symbol()
1178
+ sage: Phi = phi.p_stabilize_and_lift(p,prec, algorithm='stevens', eigensymbol=True) # long time
1179
+ sage: Phi.Tq_eigenvalue(5,M = 4) # long time
1180
+ 3 + 2*5 + 4*5^2 + 2*5^3 + O(5^4)
1181
+
1182
+ Another example::
1183
+
1184
+ sage: from sage.modular.pollack_stevens.padic_lseries import pAdicLseries
1185
+ sage: E = EllipticCurve('37a')
1186
+ sage: p = 5
1187
+ sage: prec = 6
1188
+ sage: phi = E.pollack_stevens_modular_symbol()
1189
+ sage: Phi = phi.p_stabilize_and_lift(p=p,M=prec,alpha=None,algorithm='stevens',eigensymbol=True) #long time
1190
+ sage: L = pAdicLseries(Phi) # long time
1191
+ sage: L.symbol() is Phi # long time
1192
+ True
1193
+
1194
+ Examples using Greenberg's algorithm::
1195
+
1196
+ sage: E = EllipticCurve('11a')
1197
+ sage: phi = E.pollack_stevens_modular_symbol()
1198
+ sage: Phi = phi.lift(11,8,algorithm='greenberg',eigensymbol=True)
1199
+ sage: Phi2 = phi.lift(11,8,algorithm='stevens',eigensymbol=True)
1200
+ sage: Phi == Phi2
1201
+ True
1202
+
1203
+ An example in higher weight::
1204
+
1205
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
1206
+ sage: f = ps_modsym_from_simple_modsym_space(Newforms(7, 4)[0].modular_symbols(1))
1207
+ sage: fs = f.p_stabilize(5)
1208
+ sage: FsG = fs.lift(M=6, eigensymbol=True,algorithm='greenberg') # long time
1209
+ sage: FsG.values()[0] # long time
1210
+ 5^-1 * (2*5 + 5^2 + 3*5^3 + 4*5^4 + O(5^7), O(5^6), 2*5^2 + 3*5^3 + O(5^5), O(5^4), 5^2 + O(5^3), O(5^2))
1211
+ sage: FsS = fs.lift(M=6, eigensymbol=True,algorithm='stevens') # long time
1212
+ sage: FsS == FsG # long time
1213
+ True
1214
+ """
1215
+ if p is None:
1216
+ p = self.parent().prime()
1217
+ if p == 0:
1218
+ raise ValueError("must specify a prime")
1219
+ elif (self.parent().prime() != 0) and p != self.parent().prime():
1220
+ raise ValueError("inconsistent prime")
1221
+ if M is None:
1222
+ M = self.parent().precision_cap() + 1
1223
+ elif M <= 1:
1224
+ raise ValueError("M must be at least 2")
1225
+ else:
1226
+ M = ZZ(M)
1227
+ if new_base_ring is None:
1228
+ if isinstance(self.parent().base_ring(), pAdicGeneric):
1229
+ new_base_ring = self.parent().base_ring()
1230
+ else:
1231
+ # We may need extra precision in solving the difference equation
1232
+ if algorithm == 'greenberg':
1233
+ extraprec = 0
1234
+ else:
1235
+ extraprec = (M - 1).exact_log(p) # DEBUG: was M-1
1236
+ # should eventually be a completion
1237
+ new_base_ring = Qp(p, M + extraprec)
1238
+ if algorithm is None:
1239
+ # The default algorithm is Greenberg's, if possible.
1240
+ algorithm = 'greenberg' if eigensymbol else 'stevens'
1241
+ elif algorithm == 'greenberg':
1242
+ if not eigensymbol:
1243
+ raise ValueError("Greenberg's algorithm only works"
1244
+ " for eigensymbols. Try 'stevens'")
1245
+ elif algorithm != 'stevens':
1246
+ raise ValueError("algorithm %s not recognized" % algorithm)
1247
+ if eigensymbol:
1248
+ # We need some extra precision due to the fact that solving
1249
+ # the difference equation can give denominators.
1250
+ if alpha is None:
1251
+ verbose('Finding alpha with M = %s' % M, level=2)
1252
+ alpha = self.Tq_eigenvalue(p, M=M + 1, check=check)
1253
+ newM, eisenloss, q, aq = self._find_extraprec(p, M + 1, alpha, check)
1254
+ Phi = self._lift_to_OMS(p, newM, new_base_ring, algorithm)
1255
+ Phi = _iterate_Up(Phi, p, newM, alpha, q, aq, check)
1256
+ Phi = Phi.reduce_precision(M)
1257
+ return Phi._normalize(include_zeroth_moment=True)
1258
+ else:
1259
+ return self._lift_to_OMS(p, M, new_base_ring, algorithm)
1260
+
1261
+ def _lift_to_OMS(self, p, M, new_base_ring, algorithm='greenberg'):
1262
+ r"""
1263
+ Return a (`p`-adic) overconvergent modular symbol with
1264
+ `M` moments which lifts ``self`` up to an Eisenstein error.
1265
+
1266
+ Here the Eisenstein error is a symbol whose system of Hecke
1267
+ eigenvalues equals `\ell+1` for `T_\ell` when `\ell`
1268
+ does not divide `Np` and 1 for `U_q` when `q` divides `Np`.
1269
+
1270
+ INPUT:
1271
+
1272
+ - ``p`` -- prime
1273
+
1274
+ - ``M`` -- integer equal to the number of moments
1275
+
1276
+ - ``new_base_ring`` -- new base ring
1277
+
1278
+ - ``algorithm`` -- string (default: ``'greenberg'``); either
1279
+ ``'greenberg'`` or ``'stevens'``, specifying whether to use
1280
+ the lifting algorithm of M.Greenberg or that of Pollack--Stevens.
1281
+ The latter one solves the difference equation, which is not needed. The
1282
+ option to use Pollack--Stevens' algorithm here is just for historical reasons.
1283
+
1284
+ OUTPUT:
1285
+
1286
+ An overconvergent modular symbol whose specialization
1287
+ equals ``self`` up to some Eisenstein error.
1288
+
1289
+ EXAMPLES::
1290
+
1291
+ sage: E = EllipticCurve('11a')
1292
+ sage: f = E.pollack_stevens_modular_symbol()
1293
+ sage: f._lift_to_OMS(11,4,Qp(11,4))
1294
+ Modular symbol of level 11 with values in Space of 11-adic distributions with k=0 action and precision cap 4
1295
+ """
1296
+ D = {}
1297
+ manin = self.parent().source()
1298
+ MSS = self.parent()._lift_parent_space(p, M, new_base_ring)
1299
+ if algorithm == 'greenberg':
1300
+ for g in manin.gens():
1301
+ D[g] = self._map[g].lift(p, M, new_base_ring)
1302
+ elif algorithm == 'stevens':
1303
+ half = ZZ(1) / ZZ(2)
1304
+ for g in manin.gens()[1:]:
1305
+ twotor = g in manin.reps_with_two_torsion()
1306
+ threetor = g in manin.reps_with_three_torsion()
1307
+ if twotor:
1308
+ # See [PS2011] section 4.1
1309
+ gam = manin.two_torsion_matrix(g)
1310
+ mu = self._map[g].lift(p, M, new_base_ring)
1311
+ D[g] = (mu - mu * gam) * half
1312
+ elif threetor:
1313
+ # See [PS2011] section 4.1
1314
+ gam = manin.three_torsion_matrix(g)
1315
+ mu = self._map[g].lift(p, M, new_base_ring)
1316
+ D[g] = (2 * mu - mu * gam - mu * (gam ** 2)) * half
1317
+ else:
1318
+ # no two or three torsion
1319
+ D[g] = self._map[g].lift(p, M, new_base_ring)
1320
+
1321
+ t = self.parent().coefficient_module().lift(p, M, new_base_ring).zero()
1322
+ # This loops adds up around the boundary of fundamental
1323
+ # domain except the two vertical lines
1324
+ for g in manin.gens()[1:]:
1325
+ twotor = g in manin.reps_with_two_torsion()
1326
+ threetor = g in manin.reps_with_three_torsion()
1327
+ if twotor or threetor:
1328
+ t = t - D[g]
1329
+ else:
1330
+ t += D[g] * manin.gammas[g] - D[g]
1331
+ # t now should be sum Phi(D_i) | (gamma_i - 1) - sum
1332
+ # Phi(D'_i) - sum Phi(D''_i)
1333
+
1334
+ # (Here I'm using the opposite sign convention of [PS2011]
1335
+ # regarding D'_i and D''_i)
1336
+
1337
+ D[manin.gen(0)] = -t.solve_difference_equation() # Check this!
1338
+ else:
1339
+ raise NotImplementedError
1340
+
1341
+ return MSS(D)
1342
+
1343
+ def _find_aq(self, p, M, check):
1344
+ r"""
1345
+ Helper function for finding Hecke eigenvalue `aq` for a prime `q`
1346
+ not equal to `p`. This is called in the case when `alpha = 1 (mod p^M)`
1347
+ (with `alpha` a `U_p`-eigenvalue), which creates the need to use
1348
+ other Hecke eigenvalues (and `alpha`s), because of division by `(alpha - 1)`.
1349
+
1350
+ INPUT:
1351
+
1352
+ - ``p`` -- working prime
1353
+
1354
+ - ``M`` -- precision
1355
+
1356
+ - ``check`` -- checks that ``self`` is a `T_q` eigensymbol
1357
+
1358
+ OUTPUT:
1359
+
1360
+ Tuple ``(q, aq, eisenloss)``, with
1361
+
1362
+ - ``q`` -- a prime not equal to `p`
1363
+
1364
+ - ``aq`` -- Hecke eigenvalue at `q`
1365
+
1366
+ - ``eisenloss`` -- the `p`-adic valuation of `a_q - q^{k+1} - 1`
1367
+
1368
+ EXAMPLES::
1369
+
1370
+ sage: E = EllipticCurve('11a')
1371
+ sage: f = E.pollack_stevens_modular_symbol()
1372
+ sage: f._find_aq(5,10,True)
1373
+ (2, -2, 1)
1374
+ """
1375
+ N = self.parent().level()
1376
+ q = ZZ(2)
1377
+ k = self.parent().weight()
1378
+ aq = self.Tq_eigenvalue(q, check=check)
1379
+ eisenloss = (aq - q ** (k + 1) - 1).valuation(p)
1380
+ while ((q == p) or (N % q == 0) or (eisenloss >= M)) and (q < 50):
1381
+ q = next_prime(q)
1382
+ aq = self.Tq_eigenvalue(q, check=check)
1383
+ if q != p:
1384
+ eisenloss = (aq - q ** (k + 1) - 1).valuation(p)
1385
+ else:
1386
+ eisenloss = (aq - 1).valuation(p)
1387
+ if q >= 50:
1388
+ raise ValueError("The symbol appears to be eisenstein -- "
1389
+ "not implemented yet")
1390
+ return q, aq, eisenloss
1391
+
1392
+ def _find_extraprec(self, p, M, alpha, check):
1393
+ r"""
1394
+ Find the extra precision needed to account for:
1395
+
1396
+ 1) The denominators in the Hecke eigenvalue
1397
+ 2) the denominators appearing when solving the difference equation,
1398
+ 3) those denominators who might be also present in ``self``.
1399
+
1400
+ INPUT:
1401
+
1402
+ - ``p`` -- working prime
1403
+ - ``M`` -- precision
1404
+ - ``alpha`` -- the Up-eigenvalue
1405
+ - ``check`` -- whether to check that ``self`` is a `T_q` eigensymbol
1406
+
1407
+ OUTPUT:
1408
+
1409
+ A tuple (newM, eisenloss, q, aq), where ``newM`` is the new precision, `q` is
1410
+ a prime different from `p`, and ``aq`` is the eigenvalue of `T_q` of the eigensymbol.
1411
+ The value ``eisenloss`` is the loss of precision accounted for in the denominators of the Hecke
1412
+ eigenvalue.
1413
+
1414
+ EXAMPLES::
1415
+
1416
+ sage: E = EllipticCurve('11a')
1417
+ sage: p = 5
1418
+ sage: M = 10
1419
+ sage: k = 0
1420
+ sage: phi = E.pollack_stevens_modular_symbol()
1421
+ sage: alpha = phi.Tq_eigenvalue(p)
1422
+ sage: phi._find_extraprec(p,M,alpha,True)
1423
+ (13, 1, 2, -2)
1424
+ """
1425
+ q, aq, eisenloss = self._find_aq(p, M, check)
1426
+ newM = M + eisenloss
1427
+ # We also need to add precision to account for denominators appearing while solving the difference equation.
1428
+ eplog = (newM - 1).exact_log(p)
1429
+ while eplog < (newM + eplog).exact_log(p):
1430
+ eplog = (newM + eplog).exact_log(p)
1431
+ verbose("M = %s, newM = %s, eplog=%s" % (M, newM, eplog), level=2)
1432
+ newM += eplog
1433
+
1434
+ # We also need to add precision to account for denominators that might be present in self
1435
+ s = self.valuation(p)
1436
+ if s < 0:
1437
+ newM += -s
1438
+ return newM, eisenloss, q, aq
1439
+
1440
+ def p_stabilize_and_lift(self, p, M, alpha=None, ap=None,
1441
+ new_base_ring=None,
1442
+ ordinary=True, algorithm='greenberg', eigensymbol=False,
1443
+ check=True):
1444
+ """
1445
+ `p`-stabilize and lift ``self``.
1446
+
1447
+ INPUT:
1448
+
1449
+ - ``p`` -- prime, not dividing the level of self
1450
+
1451
+ - ``M`` -- precision
1452
+
1453
+ - ``alpha`` -- (default: ``None``) the `U_p` eigenvalue, if known
1454
+
1455
+ - ``ap`` -- (default: ``None``) the Hecke eigenvalue at p (before
1456
+ stabilizing), if known
1457
+
1458
+ - ``new_base_ring`` -- (default: ``None``) if specified, force the
1459
+ resulting eigensymbol to take values in the given ring
1460
+
1461
+ - ``ordinary`` -- boolean (default: ``True``); whether to return the
1462
+ ordinary (at ``p``) eigensymbol
1463
+
1464
+ - ``algorithm`` -- string (default: ``'greenberg'``); either
1465
+ ``'greenberg'`` or ``'stevens'``, specifying whether to use
1466
+ the lifting algorithm of M.Greenberg or that of Pollack--Stevens.
1467
+ The latter one solves the difference equation, which is not needed.
1468
+ The option to use Pollack--Stevens' algorithm here is just for
1469
+ historical reasons.
1470
+
1471
+ - ``eigensymbol`` -- boolean (default: ``False``); if ``True``, return
1472
+ an overconvergent eigensymbol. Otherwise just perform a naive lift
1473
+
1474
+ - ``check`` -- boolean (default: ``True``); whether to perform extra
1475
+ sanity checks
1476
+
1477
+ OUTPUT: `p`-stabilized and lifted version of ``self``
1478
+
1479
+ EXAMPLES::
1480
+
1481
+ sage: E = EllipticCurve('11a')
1482
+ sage: f = E.pollack_stevens_modular_symbol()
1483
+ sage: g = f.p_stabilize_and_lift(3,10) # long time
1484
+ sage: g.Tq_eigenvalue(5) # long time
1485
+ 1 + O(3^10)
1486
+ sage: g.Tq_eigenvalue(7) # long time
1487
+ 1 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + O(3^10)
1488
+ sage: g.Tq_eigenvalue(3) # long time
1489
+ 2 + 3^2 + 2*3^3 + 2*3^4 + 2*3^6 + 3^8 + 2*3^9 + O(3^10)
1490
+ """
1491
+ if check:
1492
+ p = self._get_prime(p, alpha)
1493
+ k = self.parent().weight()
1494
+ M = ZZ(M)
1495
+ # alpha will be the eigenvalue of Up
1496
+ M0 = M + 1
1497
+ if alpha is None:
1498
+ alpha, new_base_ring, newM, eisenloss, q, aq = self._find_alpha(p, k, M0, ap, new_base_ring, ordinary, check)
1499
+ if new_base_ring is None:
1500
+ new_base_ring = alpha.parent()
1501
+ newM, eisenloss, q, aq = self._find_extraprec(p, M0, alpha, check)
1502
+ if hasattr(new_base_ring, 'precision_cap') and newM > new_base_ring.precision_cap():
1503
+ raise ValueError("Not enough precision in new base ring")
1504
+
1505
+ # Now we can stabilize
1506
+ self = self.p_stabilize(p=p, alpha=alpha, ap=ap, M=newM,
1507
+ new_base_ring=new_base_ring, check=check)
1508
+ # And use the standard lifting function for eigensymbols
1509
+ Phi = self._lift_to_OMS(p, newM, new_base_ring, algorithm)
1510
+ Phi = _iterate_Up(Phi, p=p, M=newM, ap=alpha, q=q, aq=aq, check=check)
1511
+ Phi = Phi.reduce_precision(M)
1512
+ return Phi._normalize(include_zeroth_moment=True)
1513
+
1514
+
1515
+ class PSModularSymbolElement_dist(PSModularSymbolElement):
1516
+
1517
+ def reduce_precision(self, M):
1518
+ r"""
1519
+ Only hold on to `M` moments of each value of ``self``.
1520
+
1521
+ EXAMPLES::
1522
+
1523
+ sage: D = OverconvergentDistributions(0, 5, 10)
1524
+ sage: M = PollackStevensModularSymbols(Gamma0(5), coefficients=D)
1525
+ sage: f = M(1)
1526
+ sage: f.reduce_precision(1)
1527
+ Modular symbol of level 5 with values in Space of 5-adic distributions with k=0 action and precision cap 10
1528
+ """
1529
+ return self.__class__(self._map.reduce_precision(M), self.parent(),
1530
+ construct=True)
1531
+
1532
+ def precision_relative(self):
1533
+ r"""
1534
+ Return the number of moments of each value of ``self``.
1535
+
1536
+ EXAMPLES::
1537
+
1538
+ sage: D = OverconvergentDistributions(0, 5, 10)
1539
+ sage: M = PollackStevensModularSymbols(Gamma0(5), coefficients=D)
1540
+ sage: f = M(1)
1541
+ sage: f.precision_relative()
1542
+ 1
1543
+ """
1544
+ return min(len(a._moments) for a in self._map)
1545
+
1546
+ def specialize(self, new_base_ring=None):
1547
+ r"""
1548
+ Return the underlying classical symbol of weight `k`.
1549
+
1550
+ Namely, this applies the canonical map `D_k \to Sym^k` to all
1551
+ values of ``self``.
1552
+
1553
+ EXAMPLES::
1554
+
1555
+ sage: D = OverconvergentDistributions(0, 5, 10); M = PollackStevensModularSymbols(Gamma0(5), coefficients=D); M
1556
+ Space of overconvergent modular symbols for Congruence Subgroup Gamma0(5) with sign 0
1557
+ and values in Space of 5-adic distributions with k=0 action and precision cap 10
1558
+ sage: f = M(1)
1559
+ sage: f.specialize()
1560
+ Modular symbol of level 5 with values in Sym^0 Z_5^2
1561
+ sage: f.specialize().values()
1562
+ [1 + O(5), 1 + O(5), 1 + O(5)]
1563
+ sage: f.values()
1564
+ [1 + O(5), 1 + O(5), 1 + O(5)]
1565
+ sage: f.specialize().parent()
1566
+ Space of modular symbols for Congruence Subgroup Gamma0(5) with sign 0 and values in Sym^0 Z_5^2
1567
+ sage: f.specialize().parent().coefficient_module()
1568
+ Sym^0 Z_5^2
1569
+ sage: f.specialize().parent().coefficient_module().is_symk()
1570
+ True
1571
+ sage: f.specialize(Qp(5,20))
1572
+ Modular symbol of level 5 with values in Sym^0 Q_5^2
1573
+ """
1574
+ if new_base_ring is None:
1575
+ new_base_ring = self.base_ring()
1576
+ return self.__class__(self._map.specialize(new_base_ring),
1577
+ self.parent()._specialize_parent_space(new_base_ring), construct=True)
1578
+
1579
+ def padic_lseries(self, *args, **kwds):
1580
+ """
1581
+ Return the `p`-adic `L`-series of this modular symbol.
1582
+
1583
+ EXAMPLES::
1584
+
1585
+ sage: E = EllipticCurve('37a')
1586
+ sage: phi = E.pollack_stevens_modular_symbol()
1587
+ sage: L = phi.lift(37, M=6, eigensymbol=True).padic_lseries(); L # long time
1588
+ 37-adic L-series of Modular symbol of level 37 with values in Space of 37-adic distributions with k=0 action and precision cap 7
1589
+ sage: L.series(2) # long time
1590
+ O(37^6) + (4 + 37 + 36*37^2 + 19*37^3 + 21*37^4 + O(37^5))*T + O(T^2)
1591
+ """
1592
+ from sage.modular.pollack_stevens.padic_lseries import pAdicLseries
1593
+ return pAdicLseries(self, *args, **kwds)