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,1793 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs eclib sage.rings.padics
3
+ r"""
4
+ `p`-adic `L`-functions of elliptic curves
5
+
6
+ To an elliptic curve `E` over the rational numbers and a prime `p`, one
7
+ can associate a `p`-adic `L`-function; at least if `E` does not have additive
8
+ reduction at `p`. This function is defined by interpolation of L-values of `E`
9
+ at twists. Through the main conjecture of Iwasawa theory it should also be
10
+ equal to a characteristic series of a certain Selmer group.
11
+
12
+ If `E` is ordinary, then it is an element of the Iwasawa algebra
13
+ `\Lambda(\ZZ_p^\times) = \ZZ_p[\Delta][\![T]\!]`, where `\Delta` is the group
14
+ of `(p-1)`-st roots of unity in `\ZZ_p^\times`, and `T = [\gamma] - 1` where
15
+ `\gamma = 1 + p` is a generator of `1 + p\ZZ_p`. (There is a slightly different
16
+ description for `p = 2`.)
17
+
18
+ One can decompose this algebra as the direct product of the subalgebras
19
+ corresponding to the characters of `\Delta`, which are simply the powers
20
+ `\tau^\eta` (`0 \le \eta \le p-2`) of the Teichmueller character `\tau: \Delta
21
+ \to \ZZ_p^\times`. Projecting the `L`-function into these components gives `p-1`
22
+ power series in `T`, each with coefficients in `\ZZ_p`.
23
+
24
+ If `E` is supersingular, the series will have coefficients in a quadratic
25
+ extension of `\QQ_p`, and the coefficients will be unbounded. In this case we
26
+ have only implemented the series for `\eta = 0`. We have also implemented the
27
+ `p`-adic `L`-series as formulated by Perrin-Riou [BP1993]_, which has
28
+ coefficients in the Dieudonné module `D_pE = H^1_{dR}(E/\QQ_p)` of `E`. There
29
+ is a different description by Pollack [Pol2003]_ which is not available here.
30
+
31
+ According to the `p`-adic version of the Birch and Swinnerton-Dyer conjecture
32
+ [MTT1986]_, the order of vanishing of the `L`-function at the trivial character
33
+ (i.e. of the series for `\eta = 0` at `T = 0`) is just the rank of `E(\QQ)`, or
34
+ this rank plus one if the reduction at `p` is split multiplicative.
35
+
36
+ See [SW2013]_ for more details.
37
+
38
+ AUTHORS:
39
+
40
+ - William Stein (2007-01-01): first version
41
+
42
+ - Chris Wuthrich (22/05/2007): changed minor issues and added supersingular things
43
+
44
+ - Chris Wuthrich (11/2008): added quadratic_twists
45
+
46
+ - David Loeffler (01/2011): added nontrivial Teichmueller components
47
+ """
48
+
49
+ ######################################################################
50
+ # Copyright (C) 2007 William Stein <wstein@gmail.com>
51
+ #
52
+ # Distributed under the terms of the GNU General Public License (GPL)
53
+ #
54
+ # This code is distributed in the hope that it will be useful,
55
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
56
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
57
+ # General Public License for more details.
58
+ #
59
+ # The full text of the GPL is available at:
60
+ #
61
+ # https://www.gnu.org/licenses/
62
+ ######################################################################
63
+
64
+ from sage.matrix.constructor import matrix
65
+ import sage.schemes.hyperelliptic_curves.monsky_washnitzer
66
+
67
+ from sage.arith.functions import lcm as LCM
68
+ from sage.arith.misc import (binomial,
69
+ GCD as gcd,
70
+ prime_divisors,
71
+ kronecker as kronecker_symbol,
72
+ valuation)
73
+ from sage.misc.cachefunc import cached_method
74
+ from sage.misc.functional import denominator
75
+ from sage.misc.lazy_import import lazy_import
76
+ from sage.misc.verbose import get_verbose, verbose
77
+ from sage.modules.free_module_element import vector
78
+ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing as Integers
79
+ from sage.rings.infinity import infinity
80
+ from sage.rings.integer import Integer
81
+ from sage.rings.integer_ring import ZZ
82
+ from sage.rings.laurent_series_ring import LaurentSeriesRing
83
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
84
+ from sage.rings.power_series_ring import PowerSeriesRing
85
+ from sage.rings.rational_field import QQ
86
+ from sage.structure.richcmp import richcmp_method, richcmp
87
+ from sage.structure.sage_object import SageObject
88
+
89
+ lazy_import("sage.functions.log", "log")
90
+ lazy_import("sage.functions.other", "floor")
91
+ lazy_import('sage.rings.padics.factory', 'Qp')
92
+
93
+
94
+ @richcmp_method
95
+ class pAdicLseries(SageObject):
96
+ r"""
97
+ The `p`-adic `L`-series of an elliptic curve.
98
+
99
+ EXAMPLES:
100
+
101
+ An ordinary example::
102
+
103
+ sage: e = EllipticCurve('389a')
104
+ sage: L = e.padic_lseries(5)
105
+ sage: L.series(0)
106
+ Traceback (most recent call last):
107
+ ...
108
+ ValueError: n (=0) must be a positive integer
109
+ sage: L.series(1)
110
+ O(T^1)
111
+ sage: L.series(2)
112
+ O(5^4) + O(5)*T + (4 + O(5))*T^2 + (2 + O(5))*T^3 + (3 + O(5))*T^4 + O(T^5)
113
+ sage: L.series(3, prec=10)
114
+ O(5^5) + O(5^2)*T + (4 + 4*5 + O(5^2))*T^2 + (2 + 4*5 + O(5^2))*T^3 + (3 + O(5^2))*T^4 + (1 + O(5))*T^5 + O(5)*T^6 + (4 + O(5))*T^7 + (2 + O(5))*T^8 + O(5)*T^9 + O(T^10)
115
+ sage: L.series(2, quadratic_twist=-3) # needs sage.graphs
116
+ 2 + 4*5 + 4*5^2 + O(5^4) + O(5)*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + O(5)*T^4 + O(T^5)
117
+
118
+ A prime p such that E[p] is reducible::
119
+
120
+ sage: L = EllipticCurve('11a').padic_lseries(5)
121
+ sage: L.series(1)
122
+ 5 + O(5^2) + O(T)
123
+ sage: L.series(2)
124
+ 5 + 4*5^2 + O(5^3) + O(5^0)*T + O(5^0)*T^2 + O(5^0)*T^3 + O(5^0)*T^4 + O(T^5)
125
+ sage: L.series(3)
126
+ 5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
127
+
128
+ An example showing the calculation of nontrivial Teichmueller twists::
129
+
130
+ sage: # needs sage.graphs
131
+ sage: E = EllipticCurve('11a1')
132
+ sage: lp = E.padic_lseries(7)
133
+ sage: lp.series(4, eta=1)
134
+ 3 + 7^3 + 6*7^4 + 3*7^5 + O(7^6)
135
+ + (2*7 + 7^2 + O(7^3))*T + (1 + 5*7^2 + O(7^3))*T^2
136
+ + (4 + 4*7 + 4*7^2 + O(7^3))*T^3 + (4 + 3*7 + 7^2 + O(7^3))*T^4 + O(T^5)
137
+ sage: lp.series(4, eta=2)
138
+ 5 + 6*7 + 4*7^2 + 2*7^3 + 3*7^4 + 2*7^5 + O(7^6)
139
+ + (6 + 4*7 + 7^2 + O(7^3))*T + (3 + 2*7^2 + O(7^3))*T^2
140
+ + (1 + 4*7 + 7^2 + O(7^3))*T^3 + (6 + 6*7 + 6*7^2 + O(7^3))*T^4 + O(T^5)
141
+ sage: lp.series(4, eta=3)
142
+ O(7^6) + (5 + 4*7 + 2*7^2 + O(7^3))*T + (6 + 5*7 + 2*7^2 + O(7^3))*T^2
143
+ + (5*7 + O(7^3))*T^3 + (7 + 4*7^2 + O(7^3))*T^4 + O(T^5)
144
+
145
+ (Note that the last series vanishes at `T = 0`, which is consistent with ::
146
+
147
+ sage: E.quadratic_twist(-7).rank() # needs sage.graphs
148
+ 1
149
+
150
+ This proves that `E` has rank 1 over `\QQ(\zeta_7)`.)
151
+
152
+ TESTS:
153
+
154
+ The load-dumps test::
155
+
156
+ sage: lp = EllipticCurve('11a').padic_lseries(5)
157
+ sage: lp == loads(dumps(lp))
158
+ True
159
+ """
160
+ def __init__(self, E, p, implementation='eclib', normalize='L_ratio'):
161
+ r"""
162
+ INPUT:
163
+
164
+ - ``E`` -- an elliptic curve
165
+ - ``p`` -- a prime of good reduction
166
+ - ``implementation`` -- string (default: ``'eclib'``); either
167
+ ``'eclib'`` to use John Cremona's ``eclib`` for the computation of
168
+ modular symbols, 'num' to use numerical modular symbols or ``'sage'``
169
+ to use Sage's own implementation
170
+ - ``normalize`` -- ``'L_ratio'`` (default), ``'period'`` or ``'none'``;
171
+ this is describes the way the modular symbols are normalized. See
172
+ ``modular_symbol`` of an elliptic curve over Q for more details.
173
+
174
+ EXAMPLES::
175
+
176
+ sage: E = EllipticCurve('11a1')
177
+ sage: Lp = E.padic_lseries(3)
178
+ sage: Lp.series(2,prec=3)
179
+ 2 + 3 + 3^2 + 2*3^3 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
180
+ """
181
+ self._E = E
182
+ self._p = ZZ(p)
183
+ self._normalize = normalize
184
+ if implementation not in ['eclib', 'sage', 'num']:
185
+ raise ValueError("Implementation should be one of 'eclib', 'num' or 'sage'")
186
+ self._implementation = implementation
187
+ if not self._p.is_prime():
188
+ raise ValueError("p (=%s) must be a prime" % p)
189
+ if E.conductor() % (self._p)**2 == 0:
190
+ raise NotImplementedError("p (=%s) must be a prime of semi-stable reduction" % p)
191
+
192
+ try:
193
+ E.label()
194
+ except LookupError:
195
+ if implementation != 'num':
196
+ print("Warning : Curve outside Cremona's table. Computations of modular symbol space might take very long !")
197
+
198
+ self._modular_symbol = E.modular_symbol(sign=+1,
199
+ implementation=implementation,
200
+ normalize=normalize)
201
+
202
+ def __add_negative_space(self):
203
+ r"""
204
+ A helper function not designed for direct use.
205
+
206
+ This function add the attribute ``_negative_modular_symbol`` to the class. This may take time
207
+ and will only be needed when twisting with negative fundamental discriminants.
208
+
209
+ EXAMPLES::
210
+
211
+ sage: E = EllipticCurve('11a1')
212
+ sage: lp = E.padic_lseries(5)
213
+ sage: lp.modular_symbol(1/7, sign=-1) # indirect doctest # needs sage.graphs
214
+ -1/2
215
+ """
216
+ self._negative_modular_symbol = self._E.modular_symbol(sign=-1, implementation='sage', normalize=self._normalize)
217
+
218
+ def __richcmp__(self, other, op):
219
+ r"""
220
+ Compare ``self`` and ``other``.
221
+
222
+ TESTS::
223
+
224
+ sage: lp1 = EllipticCurve('11a1').padic_lseries(5)
225
+ sage: lp2 = EllipticCurve('11a1').padic_lseries(7)
226
+ sage: lp3 = EllipticCurve('11a2').padic_lseries(5)
227
+ sage: lp1 == lp1
228
+ True
229
+ sage: lp1 == lp2
230
+ False
231
+ sage: lp1 == lp3
232
+ False
233
+ """
234
+ if type(self) is not type(other):
235
+ return NotImplemented
236
+ return richcmp((self._E, self._p), (other._E, other._p), op)
237
+
238
+ def elliptic_curve(self):
239
+ r"""
240
+ Return the elliptic curve to which this `p`-adic `L`-series is associated.
241
+
242
+ EXAMPLES::
243
+
244
+ sage: L = EllipticCurve('11a').padic_lseries(5)
245
+ sage: L.elliptic_curve()
246
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
247
+ """
248
+ return self._E
249
+
250
+ def prime(self):
251
+ r"""
252
+ Return the prime `p` as in `p`-adic `L`-function'.
253
+
254
+ EXAMPLES::
255
+
256
+ sage: L = EllipticCurve('11a').padic_lseries(5)
257
+ sage: L.prime()
258
+ 5
259
+ """
260
+ return self._p
261
+
262
+ def _repr_(self):
263
+ r"""
264
+ Return print representation.
265
+
266
+ EXAMPLES::
267
+
268
+ sage: e = EllipticCurve('37a')
269
+ sage: e.padic_lseries(3)._repr_()
270
+ '3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field'
271
+ sage: e.padic_lseries(3,normalize='none')
272
+ 3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field (not normalized)
273
+ sage: L = e.padic_lseries(3,normalize='none')
274
+ sage: L.rename('(factor)*L_3(T)')
275
+ sage: L
276
+ (factor)*L_3(T)
277
+ """
278
+ s = "%s-adic L-series of %s" % (self._p, self._E)
279
+ if not self._normalize == 'L_ratio':
280
+ s += ' (not normalized)'
281
+ return s
282
+
283
+ def modular_symbol(self, r, sign=+1, quadratic_twist=+1):
284
+ r"""
285
+ Return the modular symbol evaluated at `r`.
286
+
287
+ This is used to compute this `p`-adic `L`-series.
288
+
289
+ Note that the normalization is not correct at this
290
+ stage: use ``_quotient_of periods_to_twist`` to correct.
291
+
292
+ Note also that this function does not check if the condition
293
+ on the quadratic_twist=D is satisfied. So the result will only
294
+ be correct if for each prime `\ell` dividing `D`, we have
295
+ `ord_{\ell}(N)<= ord_{\ell}(D)`, where `N` is the conductor of the curve.
296
+
297
+ INPUT:
298
+
299
+ - ``r`` -- a cusp given as either a rational number or oo
300
+
301
+ - ``sign`` -- +1 (default) or -1 (only implemented without twists)
302
+
303
+ - ``quadratic_twist`` -- a fundamental discriminant of a quadratic field or +1 (default)
304
+
305
+ EXAMPLES::
306
+
307
+ sage: E = EllipticCurve('11a1')
308
+ sage: lp = E.padic_lseries(5)
309
+ sage: [lp.modular_symbol(r) for r in [0,1/5,oo,1/11]]
310
+ [1/5, 6/5, 0, 0]
311
+ sage: [lp.modular_symbol(r, sign=-1) for r in [0,1/3,oo,1/7]] # needs sage.graphs
312
+ [0, 1/2, 0, -1/2]
313
+ sage: [lp.modular_symbol(r, quadratic_twist=-20) for r in [0,1/5,oo,1/11]] # needs sage.graphs
314
+ [1, 1, 0, 1/2]
315
+
316
+ sage: E = EllipticCurve('20a1')
317
+ sage: Et = E.quadratic_twist(-4)
318
+ sage: lpt = Et.padic_lseries(5)
319
+ sage: eta = lpt._quotient_of_periods_to_twist(-4)
320
+ sage: lpt.modular_symbol(0) == lp.modular_symbol(0, quadratic_twist=-4) / eta # needs sage.graphs
321
+ True
322
+ """
323
+ if quadratic_twist == +1:
324
+ if sign == +1:
325
+ return self._modular_symbol(r)
326
+ elif sign == -1:
327
+ try:
328
+ m = self._negative_modular_symbol
329
+ except (KeyError, AttributeError):
330
+ if not hasattr(self, '_modular_symbol_negative'):
331
+ self.__add_negative_space()
332
+ m = self._negative_modular_symbol
333
+ return m(r)
334
+ else:
335
+ D = quadratic_twist
336
+ if sign == -1:
337
+ raise NotImplementedError("Quadratic twists for negative modular symbols are not yet implemented.")
338
+ if D > 0:
339
+ m = self._modular_symbol
340
+ return sum([kronecker_symbol(D, u) * m(r + ZZ(u) / D)
341
+ for u in range(1, D)])
342
+
343
+ else:
344
+ try:
345
+ m = self._negative_modular_symbol
346
+ except (KeyError, AttributeError):
347
+ if not hasattr(self, '_modular_symbol_negative'):
348
+ self.__add_negative_space()
349
+ m = self._negative_modular_symbol
350
+ return -sum([kronecker_symbol(D, u) * m(r + ZZ(u) / D)
351
+ for u in range(1, -D)])
352
+
353
+ def measure(self, a, n, prec, quadratic_twist=+1, sign=+1):
354
+ r"""
355
+ Return the measure on `\ZZ_p^{\times}` defined by
356
+
357
+ `\mu_{E,\alpha}^+ ( a + p^n \ZZ_p ) =
358
+ \frac{1}{\alpha^n} \left [\frac{a}{p^n}\right]^{+} -
359
+ \frac{1}{\alpha^{n+1}} \left[\frac{a}{p^{n-1}}\right]^{+}`
360
+
361
+ where `[\cdot]^{+}` is the modular symbol. This is used to define
362
+ this `p`-adic `L`-function (at least when the reduction is good).
363
+
364
+ The optional argument ``sign`` allows the minus symbol `[\cdot]^{-}` to
365
+ be substituted for the plus symbol.
366
+
367
+ The optional argument ``quadratic_twist`` replaces `E` by the twist in
368
+ the above formula, but the twisted modular symbol is computed using a
369
+ sum over modular symbols of `E` rather than finding the modular symbols
370
+ for the twist. Quadratic twists are only implemented if the sign is
371
+ `+1`.
372
+
373
+ Note that the normalization is not correct at this
374
+ stage: use ``_quotient_of periods`` and ``_quotient_of periods_to_twist``
375
+ to correct.
376
+
377
+ Note also that this function does not check if the condition
378
+ on the ``quadratic_twist=D`` is satisfied. So the result will only
379
+ be correct if for each prime `\ell` dividing `D`, we have
380
+ `ord_{\ell}(N)<= ord_{\ell}(D)`, where `N` is the conductor of the curve.
381
+
382
+ INPUT:
383
+
384
+ - ``a`` -- integer
385
+
386
+ - ``n`` -- nonnegative integer
387
+
388
+ - ``prec`` -- integer
389
+
390
+ - ``quadratic_twist`` -- (default: 1) a fundamental discriminant of a
391
+ quadratic field, should be coprime to the conductor of `E`
392
+
393
+ - ``sign`` -- integer (default: 1) which should be `\pm 1`
394
+
395
+ EXAMPLES::
396
+
397
+ sage: E = EllipticCurve('37a')
398
+ sage: L = E.padic_lseries(5)
399
+ sage: L.measure(1,2, prec=9)
400
+ 2 + 3*5 + 4*5^3 + 2*5^4 + 3*5^5 + 3*5^6 + 4*5^7 + 4*5^8 + O(5^9)
401
+ sage: L.measure(1,2, quadratic_twist=8, prec=15)
402
+ O(5^15)
403
+ sage: L.measure(1,2, quadratic_twist=-4, prec=15) # needs sage.graphs
404
+ 4 + 4*5 + 4*5^2 + 3*5^3 + 2*5^4 + 5^5 + 3*5^6 + 5^8 + 2*5^9 + 3*5^12 + 2*5^13 + 4*5^14 + O(5^15)
405
+
406
+ sage: # needs sage.graphs
407
+ sage: E = EllipticCurve('11a1')
408
+ sage: a = E.quadratic_twist(-3).padic_lseries(5).measure(1,2, prec=15)
409
+ sage: b = E.padic_lseries(5).measure(1,2, quadratic_twist=-3, prec=15)
410
+ sage: a == b * E.padic_lseries(5)._quotient_of_periods_to_twist(-3)
411
+ True
412
+ """
413
+ s = ZZ(sign)
414
+ if s not in [1, -1]:
415
+ raise ValueError("Sign must be +- 1")
416
+ if quadratic_twist != 1 and s != 1:
417
+ raise NotImplementedError("Quadratic twists not implemented for sign -1")
418
+
419
+ if quadratic_twist < 0:
420
+ s = ZZ(-1)
421
+
422
+ try:
423
+ p, alpha, z, w, f = self.__measure_data[(n, prec, s)]
424
+ except (KeyError, AttributeError):
425
+ if not hasattr(self, '__measure_data'):
426
+ self.__measure_data = {}
427
+ p = self._p
428
+ alpha = self.alpha(prec=prec)
429
+ z = 1/(alpha**n)
430
+ w = p**(n-1)
431
+ if s == +1:
432
+ f = self._modular_symbol
433
+ else:
434
+ try:
435
+ f = self._negative_modular_symbol
436
+ except (KeyError, AttributeError):
437
+ if not hasattr(self, '_modular_symbol_negative'):
438
+ self.__add_negative_space()
439
+ f = self._negative_modular_symbol
440
+ self.__measure_data[(n, prec, s)] = (p, alpha, z, w, f)
441
+
442
+ if quadratic_twist == 1:
443
+ if self._E.conductor() % p == 0:
444
+ return z * f(a/(p*w))
445
+ return z * ( f(a/(p*w)) - f(a/w) / alpha)
446
+ else:
447
+ D = quadratic_twist
448
+ if self.is_ordinary():
449
+ chip = kronecker_symbol(D,p)
450
+ else:
451
+ chip = 1 # alpha is +- sqrt(-p) anyway
452
+ if self._E.conductor() % p == 0:
453
+ mu = chip**n * z * sum([kronecker_symbol(D,u) * f(a/(p*w)+ZZ(u)/D) for u in range(1,D.abs())])
454
+ else:
455
+ mu = chip**n * z * sum([kronecker_symbol(D,u) * ( f(a/(p*w)+ZZ(u)/D) - chip / alpha * f(a/w+ZZ(u)/D) ) for u in range(1,D.abs())])
456
+ return s*mu
457
+
458
+ def alpha(self, prec=20):
459
+ r"""
460
+ Return a `p`-adic root `\alpha` of the polynomial `x^2 - a_p x
461
+ + p` with `ord_p(\alpha) < 1`. In the ordinary case this is
462
+ just the unit root.
463
+
464
+ INPUT:
465
+
466
+ - ``prec`` -- positive integer; the `p`-adic precision of the root
467
+
468
+ EXAMPLES:
469
+
470
+ Consider the elliptic curve 37a::
471
+
472
+ sage: E = EllipticCurve('37a')
473
+
474
+ An ordinary prime::
475
+
476
+ sage: L = E.padic_lseries(5)
477
+ sage: alpha = L.alpha(10); alpha
478
+ 3 + 2*5 + 4*5^2 + 2*5^3 + 5^4 + 4*5^5 + 2*5^7 + 5^8 + 5^9 + O(5^10)
479
+ sage: alpha^2 - E.ap(5)*alpha + 5
480
+ O(5^10)
481
+
482
+ A supersingular prime::
483
+
484
+ sage: L = E.padic_lseries(3)
485
+ sage: alpha = L.alpha(10); alpha
486
+ alpha + O(alpha^21)
487
+ sage: alpha^2 - E.ap(3)*alpha + 3
488
+ O(alpha^22)
489
+
490
+ A reducible prime::
491
+
492
+ sage: L = EllipticCurve('11a').padic_lseries(5)
493
+ sage: L.alpha(5)
494
+ 1 + 4*5 + 3*5^2 + 2*5^3 + 4*5^4 + O(5^5)
495
+ """
496
+ try:
497
+ return self._alpha[prec]
498
+ except AttributeError:
499
+ self._alpha = {}
500
+ except KeyError:
501
+ pass
502
+ E = self._E
503
+ p = self._p
504
+ a_p = E.ap(p)
505
+ K = Qp(p, prec, print_mode='series')
506
+
507
+ if E.conductor() % p == 0:
508
+ self._alpha[prec] = K(a_p)
509
+ return K(a_p)
510
+
511
+ R = ZZ['x']
512
+ f = R([p, -a_p, 1])
513
+ if E.is_ordinary(p):
514
+ G = f.factor_padic(p, prec + 5)
515
+ for pr, e in G:
516
+ a = -pr[0]
517
+ if a.valuation() < 1:
518
+ self._alpha[prec] = K(a)
519
+ return K(a)
520
+ raise RuntimeError("bug in p-adic L-function alpha")
521
+ else: # supersingular case
522
+ f = f.change_ring(K)
523
+ A = K.extension(f, names='alpha')
524
+ a = A.gen()
525
+ self._alpha[prec] = a
526
+ return a
527
+
528
+ def order_of_vanishing(self):
529
+ r"""
530
+ Return the order of vanishing of this `p`-adic `L`-series.
531
+
532
+ The output of this function is provably correct, due to a
533
+ theorem of Kato [Kat2004]_.
534
+
535
+ .. NOTE:: currently `p` must be a prime of good ordinary reduction.
536
+
537
+ REFERENCES:
538
+
539
+ - [MTT1986]_
540
+
541
+ - [Kat2004]_
542
+
543
+ EXAMPLES::
544
+
545
+ sage: L = EllipticCurve('11a').padic_lseries(3)
546
+ sage: L.order_of_vanishing()
547
+ 0
548
+ sage: L = EllipticCurve('11a').padic_lseries(5)
549
+ sage: L.order_of_vanishing()
550
+ 0
551
+ sage: L = EllipticCurve('37a').padic_lseries(5)
552
+ sage: L.order_of_vanishing()
553
+ 1
554
+ sage: L = EllipticCurve('43a').padic_lseries(3)
555
+ sage: L.order_of_vanishing()
556
+ 1
557
+ sage: L = EllipticCurve('37b').padic_lseries(3)
558
+ sage: L.order_of_vanishing()
559
+ 0
560
+ sage: L = EllipticCurve('389a').padic_lseries(3)
561
+ sage: L.order_of_vanishing()
562
+ 2
563
+ sage: L = EllipticCurve('389a').padic_lseries(5)
564
+ sage: L.order_of_vanishing()
565
+ 2
566
+ sage: L = EllipticCurve('5077a').padic_lseries(5, implementation = 'eclib')
567
+ sage: L.order_of_vanishing()
568
+ 3
569
+ """
570
+ try:
571
+ return self.__ord
572
+ except AttributeError:
573
+ pass
574
+
575
+ if not self.is_ordinary():
576
+ raise NotImplementedError
577
+ E = self.elliptic_curve()
578
+ if not E.is_good(self.prime()):
579
+ raise ValueError("prime must be of good reduction")
580
+ r = E.rank()
581
+ n = 1
582
+ while True:
583
+ f = self.series(n)
584
+ v = f.valuation()
585
+ if v < n and v < r:
586
+ raise RuntimeError("while computing p-adic order of vanishing, got a contradiction: the curve is %s, the curve has rank %s, but the p-adic L-series vanishes to order <= %s" % (E, r, v))
587
+ if v == r:
588
+ self.__ord = v
589
+ return v
590
+ n += 1
591
+
592
+ def teichmuller(self, prec):
593
+ r"""
594
+ Return Teichmuller lifts to the given precision.
595
+
596
+ INPUT:
597
+
598
+ - ``prec`` -- positive integer
599
+
600
+ OUTPUT: list of `p`-adic numbers; the cached Teichmuller lifts
601
+
602
+ EXAMPLES::
603
+
604
+ sage: L = EllipticCurve('11a').padic_lseries(7)
605
+ sage: L.teichmuller(1)
606
+ [0, 1, 2, 3, 4, 5, 6]
607
+ sage: L.teichmuller(2)
608
+ [0, 1, 30, 31, 18, 19, 48]
609
+ """
610
+ p = self._p
611
+ K = Qp(p, prec, print_mode='series')
612
+ return [Integer(0)] + \
613
+ [a.residue(prec).lift() for a in K.teichmuller_system()]
614
+
615
+ def _e_bounds(self, n, prec):
616
+ r"""
617
+ A helper function not designed for direct use.
618
+
619
+ It computes the valuations of the coefficients of `\omega_n = (1+T)^{p^n}-1`.
620
+
621
+ EXAMPLES::
622
+
623
+ sage: E = EllipticCurve('11a1')
624
+ sage: Lp = E.padic_lseries(2)
625
+ sage: Lp._e_bounds(1,10)
626
+ [+Infinity, 1, 0, 0, 0, 0, 0, 0, 0, 0]
627
+ sage: Lp._e_bounds(2,10)
628
+ [+Infinity, 2, 1, 1, 0, 0, 0, 0, 0, 0]
629
+ sage: Lp._e_bounds(3,10)
630
+ [+Infinity, 3, 2, 2, 1, 1, 1, 1, 0, 0]
631
+ sage: Lp._e_bounds(4,10)
632
+ [+Infinity, 4, 3, 3, 2, 2, 2, 2, 1, 1]
633
+ """
634
+ # trac 10280: replace with new corrected code, note that the sequence has to be decreasing.
635
+ pn = self._p**n
636
+ enj = infinity
637
+ res = [enj]
638
+ for j in range(1,prec):
639
+ bino = valuation(binomial(pn,j),self._p)
640
+ enj = min(bino, enj)
641
+ res.append(enj)
642
+ return res
643
+
644
+ def _get_series_from_cache(self, n, prec, D, eta):
645
+ r"""
646
+ A helper function not designed for direct use.
647
+
648
+ It picks up the series in the cache if it has been previously computed.
649
+
650
+ EXAMPLES::
651
+
652
+ sage: E = EllipticCurve('11a1')
653
+ sage: Lp = E.padic_lseries(5)
654
+ sage: Lp._pAdicLseries__series = {} # clear cached series
655
+ sage: Lp._get_series_from_cache(3,5,1,0)
656
+ sage: Lp.series(3,prec=5)
657
+ 5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
658
+ sage: Lp._get_series_from_cache(3,5,1,0)
659
+ 5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
660
+ """
661
+ try:
662
+ return self.__series[(n,prec,D,eta)]
663
+ except AttributeError:
664
+ self.__series = {}
665
+ except KeyError:
666
+ for _n, _prec, _D, _eta in self.__series:
667
+ if _n == n and _D == D and _eta == eta and _prec >= prec:
668
+ return self.__series[(_n,_prec,_D,_eta)].add_bigoh(prec)
669
+ return None
670
+
671
+ def _set_series_in_cache(self, n, prec, D, eta, f):
672
+ r"""
673
+ A helper function not designed for direct use.
674
+
675
+ It picks up the series in the cache if it has been previously computed.
676
+
677
+ EXAMPLES::
678
+
679
+ sage: E = EllipticCurve('11a1')
680
+ sage: Lp = E.padic_lseries(5)
681
+ sage: Lp.series(3,prec=5)
682
+ 5 + 4*5^2 + 4*5^3 + O(5^4) + O(5)*T + O(5)*T^2 + O(5)*T^3 + O(5)*T^4 + O(T^5)
683
+ sage: Lp._set_series_in_cache(3,5,1,0,0)
684
+ sage: Lp.series(3,prec=5)
685
+ 0
686
+ """
687
+ self.__series[(n, prec, D, eta)] = f
688
+
689
+ def _quotient_of_periods_to_twist(self, D):
690
+ r"""
691
+ For a fundamental discriminant `D` of a quadratic number field this
692
+ computes the constant `\eta` such that
693
+ `\sqrt{\vert D\vert }\cdot\Omega_{E_D}^{+} =\eta\cdot \Omega_E^{sign(D)}`.
694
+ As in [MTT1986]_ page 40. This is either 1 or 2 unless the condition
695
+ on the twist is not satisfied, e.g. if we are 'twisting back' to a
696
+ semi-stable curve.
697
+
698
+ .. NOTE::
699
+
700
+ No check on precision is made, so this may fail for huge `D`.
701
+
702
+ EXAMPLES::
703
+
704
+ sage: E = EllipticCurve('37b1')
705
+ sage: lp = E.padic_lseries(3)
706
+ sage: lp._quotient_of_periods_to_twist(-20)
707
+ 1
708
+ sage: lp._quotient_of_periods_to_twist(-4)
709
+ 1
710
+ sage: lp._quotient_of_periods_to_twist(-3)
711
+ 1
712
+ sage: lp._quotient_of_periods_to_twist(-8)
713
+ 2
714
+ sage: lp._quotient_of_periods_to_twist(8)
715
+ 2
716
+ sage: lp._quotient_of_periods_to_twist(5)
717
+ 1
718
+ sage: lp._quotient_of_periods_to_twist(12)
719
+ 1
720
+
721
+ sage: E = EllipticCurve('11a1')
722
+ sage: Et = E.quadratic_twist(-3)
723
+ sage: lpt = Et.padic_lseries(5)
724
+ sage: lpt._quotient_of_periods_to_twist(-3)
725
+ 3
726
+ """
727
+ # This function does not depend on p and could be moved out of
728
+ # this file but it is needed only here
729
+
730
+ # Note that the number of real components does not change by twisting.
731
+ if D == 1:
732
+ return 1
733
+ Et = self._E.quadratic_twist(D)
734
+ if D > 1:
735
+ qt = Et.period_lattice().basis()[0] / self._E.period_lattice().basis()[0]
736
+ qt *= qt.parent()(D).sqrt()
737
+ else:
738
+ qt = Et.period_lattice().basis()[1].imag() / self._E.period_lattice().basis()[0]
739
+ if Et.real_components() == 1:
740
+ qt *= 2
741
+ qt *= qt.parent()(-D).sqrt()
742
+ verbose('the real approximation is %s' % qt)
743
+ # we know from MTT that the result has a denominator 1
744
+ return QQ((8 * qt).round()) / 8
745
+
746
+
747
+ class pAdicLseriesOrdinary(pAdicLseries):
748
+ def series(self, n=2, quadratic_twist=+1, prec=5, eta=0):
749
+ r"""
750
+ Return the `n`-th approximation to the `p`-adic `L`-series, in the
751
+ component corresponding to the `\eta`-th power of the Teichmueller
752
+ character, as a power series in `T` (corresponding to `\gamma-1` with
753
+ `\gamma=1+p` as a generator of `1+p\ZZ_p`). Each coefficient is a
754
+ `p`-adic number whose precision is provably correct.
755
+
756
+ Here the normalization of the `p`-adic `L`-series is chosen
757
+ such that `L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E`
758
+ where `\alpha` is the unit root of the characteristic
759
+ polynomial of Frobenius on `T_pE` and `\Omega_E` is the
760
+ Néron period of `E`.
761
+
762
+ INPUT:
763
+
764
+ - ``n`` -- (default: 2) a positive integer
765
+ - ``quadratic_twist`` -- (default: +1) a fundamental discriminant of a
766
+ quadratic field, coprime to the conductor of the curve
767
+ - ``prec`` -- (default: 5) maximal number of terms of the series to
768
+ compute; to compute as many as possible just give a very large
769
+ number for ``prec``; the result will still be correct.
770
+ - ``eta`` -- (default: 0) an integer (specifying the power of the
771
+ Teichmueller character on the group of roots of unity in
772
+ `\ZZ_p^\times`)
773
+
774
+ :meth:`power_series` is identical to ``series``.
775
+
776
+ EXAMPLES:
777
+
778
+ We compute some `p`-adic `L`-functions associated to the elliptic
779
+ curve 11a::
780
+
781
+ sage: E = EllipticCurve('11a')
782
+ sage: p = 3
783
+ sage: E.is_ordinary(p)
784
+ True
785
+ sage: L = E.padic_lseries(p)
786
+ sage: L.series(3)
787
+ 2 + 3 + 3^2 + 2*3^3 + O(3^5) + (1 + 3 + O(3^2))*T + (1 + 2*3 + O(3^2))*T^2 + O(3)*T^3 + O(3)*T^4 + O(T^5)
788
+
789
+ Another example at a prime of bad reduction, where the
790
+ `p`-adic `L`-function has an extra 0 (compared to the non
791
+ `p`-adic `L`-function)::
792
+
793
+ sage: E = EllipticCurve('11a')
794
+ sage: p = 11
795
+ sage: E.is_ordinary(p)
796
+ True
797
+ sage: L = E.padic_lseries(p)
798
+ sage: L.series(2)
799
+ O(11^4) + (10 + O(11))*T + (6 + O(11))*T^2 + (2 + O(11))*T^3 + (5 + O(11))*T^4 + O(T^5)
800
+
801
+ We compute a `p`-adic `L`-function that vanishes to order 2::
802
+
803
+ sage: E = EllipticCurve('389a')
804
+ sage: p = 3
805
+ sage: E.is_ordinary(p)
806
+ True
807
+ sage: L = E.padic_lseries(p)
808
+ sage: L.series(1)
809
+ O(T^1)
810
+ sage: L.series(2)
811
+ O(3^4) + O(3)*T + (2 + O(3))*T^2 + O(T^3)
812
+ sage: L.series(3)
813
+ O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + O(T^5)
814
+
815
+ Checks if the precision can be changed (:issue:`5846`)::
816
+
817
+ sage: L.series(3,prec=4)
818
+ O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + O(T^4)
819
+ sage: L.series(3,prec=6)
820
+ O(3^5) + O(3^2)*T + (2 + 2*3 + O(3^2))*T^2 + (2 + O(3))*T^3 + (1 + O(3))*T^4 + (1 + O(3))*T^5 + O(T^6)
821
+
822
+ Rather than computing the `p`-adic `L`-function for the curve '15523a1', one can
823
+ compute it as a quadratic_twist::
824
+
825
+ sage: E = EllipticCurve('43a1')
826
+ sage: lp = E.padic_lseries(3)
827
+ sage: lp.series(2, quadratic_twist=-19) # needs sage.graphs
828
+ 2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
829
+ sage: E.quadratic_twist(-19).label() # optional -- database_cremona_ellcurve, needs sage.graphs
830
+ '15523a1'
831
+
832
+ This proves that the rank of '15523a1' is zero, even if ``mwrank`` cannot determine this.
833
+
834
+ We calculate the `L`-series in the nontrivial Teichmueller components::
835
+
836
+ sage: # needs sage.graphs
837
+ sage: L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
838
+ sage: for j in [0..3]: print(L.series(4, eta=j))
839
+ O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
840
+ 4 + 3*5 + 2*5^2 + 3*5^3 + 5^4 + O(5^6) + (1 + 3*5 + 4*5^2 + O(5^3))*T + (3 + 4*5 + 3*5^2 + O(5^3))*T^2 + (3 + 3*5^2 + O(5^3))*T^3 + (1 + 2*5 + 2*5^2 + O(5^3))*T^4 + O(T^5)
841
+ 2 + O(5^6) + (1 + 5 + O(5^3))*T + (2 + 4*5 + 3*5^2 + O(5^3))*T^2 + (4 + 5 + 2*5^2 + O(5^3))*T^3 + (4 + O(5^3))*T^4 + O(T^5)
842
+ 3 + 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + O(5^6) + (1 + 2*5 + 4*5^2 + O(5^3))*T + (1 + 4*5 + O(5^3))*T^2 + (3 + 2*5 + 2*5^2 + O(5^3))*T^3 + (5 + 5^2 + O(5^3))*T^4 + O(T^5)
843
+
844
+ It should now also work with `p=2` (:issue:`20798`)::
845
+
846
+ sage: E = EllipticCurve("53a1")
847
+ sage: lp = E.padic_lseries(2)
848
+ sage: lp.series(7) # needs sage.graphs
849
+ O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)
850
+
851
+ sage: E = EllipticCurve("109a1")
852
+ sage: lp = E.padic_lseries(2)
853
+ sage: lp.series(6) # needs sage.graphs
854
+ 2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
855
+
856
+ Check that twists by odd Teichmuller characters are ok (:issue:`32258`)::
857
+
858
+ sage: # needs sage.graphs
859
+ sage: E = EllipticCurve("443c1")
860
+ sage: lp = E.padic_lseries(17, implementation='num')
861
+ sage: l8 = lp.series(2,eta=8,prec=3)
862
+ sage: l8.list()[0] - 1/lp.alpha()
863
+ O(17^4)
864
+ sage: lp = E.padic_lseries(2, implementation='num')
865
+ sage: l1 = lp.series(8,eta=1,prec=3)
866
+ sage: l1.list()[0] - 4/lp.alpha()^2
867
+ O(2^9)
868
+ """
869
+ n = ZZ(n)
870
+ if n < 1:
871
+ raise ValueError("n (=%s) must be a positive integer" % n)
872
+ if self._p == 2 and n == 1:
873
+ raise ValueError("n (=%s) must be a at least 2 if p is 2" % n)
874
+ if prec < 1:
875
+ raise ValueError("Insufficient precision (%s)" % prec)
876
+
877
+ # check if the conditions on quadratic_twist are satisfied
878
+ eta = ZZ(eta) % (self._p - 1) if self._p != 2 else ZZ(eta) % 2
879
+ D = ZZ(quadratic_twist)
880
+ if D != 1:
881
+ if eta != 0:
882
+ raise NotImplementedError("quadratic twists only implemented for the 0th Teichmueller component")
883
+ if D % 4 == 0:
884
+ d = D//4
885
+ if not d.is_squarefree() or d % 4 == 1:
886
+ raise ValueError("quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field" % D)
887
+ else:
888
+ if not D.is_squarefree() or D % 4 != 1:
889
+ raise ValueError("quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field" % D)
890
+ if gcd(D,self._p) != 1:
891
+ raise ValueError("quadratic twist (=%s) must be coprime to p (=%s) " % (D,self._p))
892
+ if gcd(D, self._E.conductor()) != 1:
893
+ for ell in prime_divisors(D):
894
+ if valuation(self._E.conductor(), ell) > valuation(D, ell):
895
+ raise ValueError("cannot twist a curve of conductor (=%s) by the quadratic twist (=%s)." % (self._E.conductor(),D))
896
+ p = self._p
897
+ si = 1-2*(eta % 2)
898
+
899
+ # verbose("computing L-series for p=%s, n=%s, and prec=%s" % (p,n,prec))
900
+
901
+ if prec == 1:
902
+ if eta == 0:
903
+ # trac 15737: if we only ask for the leading term we don't
904
+ # need to do any sum as L_p(E,0) = (1-1/alpha)^2 * m(0) (good case)
905
+ # set prec arbitrary to 20.
906
+ K = Qp(p, 20, print_mode='series')
907
+ R = PowerSeriesRing(K,'T',1)
908
+ L = self.modular_symbol(0, sign=+1, quadratic_twist=D)
909
+ chip = kronecker_symbol(D,p)
910
+ if self._E.conductor() % p == 0:
911
+ L *= 1 - chip/self.alpha()
912
+ else:
913
+ L *= (1-chip/self.alpha())**2
914
+ L /= self._quotient_of_periods_to_twist(D)*self._E.real_components()
915
+ L = R(L, 1)
916
+ return L
917
+ else:
918
+ # here we need some sums anyway
919
+ bounds = self._prec_bounds(n,prec,sign=si)
920
+ padic_prec = 20
921
+ else:
922
+ bounds = self._prec_bounds(n,prec,sign=si)
923
+ padic_prec = max(bounds[1:]) + 5
924
+
925
+ verbose("using p-adic precision of %s" % padic_prec)
926
+
927
+ if p == 2:
928
+ res_series_prec = min(p**(n-2), prec)
929
+ else:
930
+ res_series_prec = min(p**(n-1), prec)
931
+ verbose("using series precision of %s" % res_series_prec)
932
+
933
+ ans = self._get_series_from_cache(n, res_series_prec,D,eta)
934
+ if ans is not None:
935
+ verbose("found series in cache")
936
+ return ans
937
+
938
+ K = QQ
939
+ R = PowerSeriesRing(K,'T',res_series_prec)
940
+ T = R(R.gen(),res_series_prec )
941
+ L = R(0)
942
+ one_plus_T_factor = R(1)
943
+ gamma_power = K(1)
944
+ teich = self.teichmuller(padic_prec)
945
+ if p == 2:
946
+ teich = [0, 1, -1]
947
+ gamma = K(5)
948
+ p_power = 2**(n-2)
949
+ a_range = 3
950
+ else:
951
+ teich = self.teichmuller(padic_prec)
952
+ gamma = K(1 + p)
953
+ p_power = p**(n-1)
954
+ a_range = p
955
+
956
+ verbose("Now iterating over %s summands" % ((p-1)*p_power))
957
+ verbose_level = get_verbose()
958
+ count_verb = 0
959
+ for j in range(p_power):
960
+ s = K(0)
961
+ if verbose_level >= 2 and j/p_power*100 > count_verb + 3:
962
+ verbose("%.2f percent done" % (float(j)/p_power*100))
963
+ count_verb += 3
964
+ for a in range(1,a_range):
965
+ b = teich[a] * gamma_power
966
+ s += teich[a]**eta * self.measure(b, n, padic_prec, quadratic_twist=D, sign=si).lift()
967
+ L += s * one_plus_T_factor
968
+ one_plus_T_factor *= 1+T
969
+ gamma_power *= gamma
970
+
971
+ verbose("the series before adjusting the precision is %s" % L)
972
+ # Now create series but with each coefficient truncated
973
+ # so it is proven correct:
974
+ K = Qp(p, padic_prec, print_mode='series')
975
+ R = PowerSeriesRing(K,'T',res_series_prec)
976
+ L = R(L,res_series_prec)
977
+ aj = L.list()
978
+ if aj:
979
+ aj = [aj[0].add_bigoh(padic_prec-2)] + \
980
+ [aj[j].add_bigoh(bounds[j]) for j in range(1,len(aj))]
981
+ L = R(aj,res_series_prec )
982
+
983
+ L /= self._quotient_of_periods_to_twist(D)
984
+ if si == +1:
985
+ L /= self._E.real_components()
986
+
987
+ self._set_series_in_cache(n, res_series_prec, D, eta, L)
988
+
989
+ return L
990
+
991
+ power_series = series
992
+
993
+ def is_ordinary(self):
994
+ r"""
995
+ Return ``True`` if the elliptic curve that this `L`-function is attached
996
+ to is ordinary.
997
+
998
+ EXAMPLES::
999
+
1000
+ sage: L = EllipticCurve('11a').padic_lseries(5)
1001
+ sage: L.is_ordinary()
1002
+ True
1003
+ """
1004
+ return True
1005
+
1006
+ def is_supersingular(self):
1007
+ r"""
1008
+ Return ``True`` if the elliptic curve that this L function is attached
1009
+ to is supersingular.
1010
+
1011
+ EXAMPLES::
1012
+
1013
+ sage: L = EllipticCurve('11a').padic_lseries(5)
1014
+ sage: L.is_supersingular()
1015
+ False
1016
+ """
1017
+ return False
1018
+
1019
+ @cached_method
1020
+ def _c_bound(self, sign=+1):
1021
+ r"""
1022
+ A helper function not designed for direct use.
1023
+
1024
+ It returns an upper bound to the maximal `p`-adic valuation
1025
+ of the possible denominators of the modular symbols appearing
1026
+ in the sum for the `p`-adic `L`-function with the given ``sign``.
1027
+
1028
+ If the implementation of modular symbols used is 'sage', this is
1029
+ simply the maximum over all modular symbols. For others,
1030
+ we rely on the fact that the `p`-adic `L`-function is a sum of
1031
+ unitary modular symbols. These cusps are defined over `\QQ` and
1032
+ we know only need to find a torsion points on the `X_0`-optimal
1033
+ curve and compare the periods.
1034
+
1035
+ EXAMPLES::
1036
+
1037
+ sage: # needs sage.graphs
1038
+ sage: E = EllipticCurve('11a1')
1039
+ sage: Lp = E.padic_lseries(5)
1040
+ sage: Lp._c_bound()
1041
+ 1
1042
+ sage: EllipticCurve('11a2').padic_lseries(5)._c_bound()
1043
+ 0
1044
+ sage: EllipticCurve('11a3').padic_lseries(5)._c_bound()
1045
+ 2
1046
+ sage: EllipticCurve('11a3').padic_lseries(5, implementation='sage')._c_bound()
1047
+ 2
1048
+ sage: EllipticCurve('50b1').padic_lseries(3)._c_bound()
1049
+ 0
1050
+ sage: EllipticCurve('50b1').padic_lseries(3, implementation='sage')._c_bound()
1051
+ 1
1052
+ sage: l = EllipticCurve("11a1").padic_lseries(5)
1053
+ sage: ls = l.series(1,eta=1);
1054
+ sage: l._c_bound(sign=-1)
1055
+ 0
1056
+ """
1057
+ E = self._E
1058
+ p = self._p
1059
+ N = self._E.conductor()
1060
+ if E.galois_representation().is_irreducible(p):
1061
+ return 0
1062
+
1063
+ if self._implementation == "sage":
1064
+ m = E.modular_symbol_space(sign=1)
1065
+ b = m.boundary_map().codomain()
1066
+ C = b._known_cusps() # all known, since computed the boundary map
1067
+ if sign == +1:
1068
+ return max([valuation(self.modular_symbol(a).denominator(), p) for a in C])
1069
+ else:
1070
+ try:
1071
+ m = self._negative_modular_symbol
1072
+ except (KeyError, AttributeError):
1073
+ if not hasattr(self, '_modular_symbol_negative'):
1074
+ self._add_negative_space()
1075
+ m = self._negative_modular_symbol
1076
+ return max([valuation(m(a).denominator(), p) for a in C])
1077
+
1078
+ # else the same reasoning as in _set_denom in numerical
1079
+ # modular symbol. We rely on the fact that p is semistable
1080
+ from sage.databases.cremona import CremonaDatabase
1081
+ isog = E.isogeny_class()
1082
+ t = 0
1083
+ if N <= CremonaDatabase().largest_conductor():
1084
+ E0 = E.optimal_curve()
1085
+ else:
1086
+ # we can't know which is the X_0-optimal curve
1087
+ # so we take one of the worst cases
1088
+ # if p=2 this may not be unique so we are cautious.
1089
+ ff = lambda C: C.period_lattice().complex_area()
1090
+ E0 = min(isog.curves, key=ff)
1091
+ if p == 2:
1092
+ t = 1
1093
+ # all modular symbols evaluated in a p-adic L-series
1094
+ # have denominator a power of p. Hence they come from
1095
+ # unitary cusps if p is semistable. Unitary cusps
1096
+ # are defined over Q, so they map to rational
1097
+ # torsion points on the X_0-optimal curve.
1098
+ if sign == 1:
1099
+ t += E.torsion_order().valuation(p)
1100
+ else:
1101
+ # no torsion point other than 2-torsion
1102
+ # can be non-real in the lattice
1103
+ if p == 2:
1104
+ t += 1
1105
+ if p == 2 and E0.real_components() == 1:
1106
+ t += 1 # slanted lattice
1107
+
1108
+ # this was the bound for E0 now compare periods
1109
+ # to get the bound for E
1110
+ L0 = E0.period_lattice().basis()
1111
+ L = E.period_lattice().basis()
1112
+ if sign == 1:
1113
+ om = L[0]
1114
+ om0 = L0[0]
1115
+ else:
1116
+ om = L[1].imag()
1117
+ if E.real_components() == 1:
1118
+ om *= 2
1119
+ om0 = L[1].imag()
1120
+ if E0.real_components() == 1:
1121
+ om0 *= 2
1122
+ m = max(isog.matrix().list())
1123
+ q = (om/om0 * m).round()/m
1124
+ t += valuation(q,p)
1125
+ return max(t,0)
1126
+
1127
+ def _prec_bounds(self, n, prec, sign=+1):
1128
+ r"""
1129
+ A helper function not designed for direct use.
1130
+
1131
+ It returns the `p`-adic precisions of the approximation
1132
+ to the `p`-adic `L`-function.
1133
+
1134
+ EXAMPLES::
1135
+
1136
+ sage: E = EllipticCurve('11a1')
1137
+ sage: Lp = E.padic_lseries(5)
1138
+ sage: Lp._prec_bounds(3,10)
1139
+ [+Infinity, 1, 1, 1, 1, 0, 0, 0, 0, 0]
1140
+ sage: Lp._prec_bounds(3,12)
1141
+ [+Infinity, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
1142
+ sage: Lp._prec_bounds(4,5)
1143
+ [+Infinity, 2, 2, 2, 2]
1144
+ sage: Lp._prec_bounds(15,10)
1145
+ [+Infinity, 13, 13, 13, 13, 12, 12, 12, 12, 12]
1146
+
1147
+ sage: Lp = E.padic_lseries(3)
1148
+ sage: Lp._prec_bounds(15,10)
1149
+ [+Infinity, 14, 14, 13, 13, 13, 13, 13, 13, 12]
1150
+ """
1151
+ if self._p == 2:
1152
+ e = self._e_bounds(n - 2, prec)
1153
+ else:
1154
+ e = self._e_bounds(n - 1, prec)
1155
+ c = self._c_bound()
1156
+ return [e[j] - c for j in range(len(e))]
1157
+
1158
+
1159
+ class pAdicLseriesSupersingular(pAdicLseries):
1160
+ def series(self, n=3, quadratic_twist=+1, prec=5, eta=0):
1161
+ r"""
1162
+ Return the `n`-th approximation to the `p`-adic `L`-series as a
1163
+ power series in `T` (corresponding to `\gamma-1` with
1164
+ `\gamma=1+p` as a generator of `1+p\ZZ_p`). Each
1165
+ coefficient is an element of a quadratic extension of the `p`-adic
1166
+ number whose precision is provably correct.
1167
+
1168
+ Here the normalization of the `p`-adic `L`-series is chosen
1169
+ such that `L_p(E,1) = (1-1/\alpha)^2 L(E,1)/\Omega_E`
1170
+ where `\alpha` is a root of the characteristic
1171
+ polynomial of Frobenius on `T_pE` and `\Omega_E` is the
1172
+ Néron period of `E`.
1173
+
1174
+ INPUT:
1175
+
1176
+ - ``n`` -- (default: 2) a positive integer
1177
+ - ``quadratic_twist`` -- (default: +1) a fundamental discriminant of a
1178
+ quadratic field, coprime to the conductor of the curve
1179
+ - ``prec`` -- (default: 5) maximal number of terms of the series to
1180
+ compute; to compute as many as possible just give a very large
1181
+ number for ``prec``; the result will still be correct.
1182
+ - ``eta`` -- (default: 0) an integer (specifying the power of the
1183
+ Teichmueller character on the group of roots of unity in
1184
+ `\ZZ_p^\times`)
1185
+
1186
+ OUTPUT:
1187
+
1188
+ a power series with coefficients in a quadratic ramified extension of
1189
+ the `p`-adic numbers generated by a root `alpha` of the characteristic
1190
+ polynomial of Frobenius on `T_pE`.
1191
+
1192
+ ALIAS: power_series is identical to series.
1193
+
1194
+ EXAMPLES:
1195
+
1196
+ A supersingular example, where we must compute to higher precision to see anything::
1197
+
1198
+ sage: e = EllipticCurve('37a')
1199
+ sage: L = e.padic_lseries(3); L
1200
+ 3-adic L-series of Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
1201
+ sage: L.series(2)
1202
+ O(T^3)
1203
+ sage: L.series(4) # takes a long time (several seconds)
1204
+ O(alpha) + (alpha^-2 + O(alpha^0))*T + (alpha^-2 + O(alpha^0))*T^2 + O(T^5)
1205
+ sage: L.alpha(2).parent()
1206
+ 3-adic Eisenstein Extension Field in alpha defined by x^2 + 3*x + 3
1207
+
1208
+ An example where we only compute the leading term (:issue:`15737`)::
1209
+
1210
+ sage: E = EllipticCurve("17a1")
1211
+ sage: L = E.padic_lseries(3)
1212
+ sage: L.series(4,prec=1)
1213
+ alpha^-2 + alpha^-1 + 2 + 2*alpha + ... + O(alpha^38) + O(T)
1214
+
1215
+ It works also for `p=2`::
1216
+
1217
+ sage: E = EllipticCurve("11a1")
1218
+ sage: lp = E.padic_lseries(2)
1219
+ sage: lp.series(10)
1220
+ O(alpha^-3) + (alpha^-4 + O(alpha^-3))*T + (alpha^-4 + O(alpha^-3))*T^2 + (alpha^-5 + alpha^-4 + O(alpha^-3))*T^3 + (alpha^-4 + O(alpha^-3))*T^4 + O(T^5)
1221
+ """
1222
+ n = ZZ(n)
1223
+ if n < 1:
1224
+ raise ValueError("n (=%s) must be a positive integer" % n)
1225
+ if self._p == 2 and n == 1:
1226
+ raise ValueError("n (=%s) must be at least 2 when p=2" % n)
1227
+ if prec < 1:
1228
+ raise ValueError("Insufficient precision (%s)" % prec)
1229
+
1230
+ # check if the conditions on quadratic_twist are satisfied
1231
+ D = ZZ(quadratic_twist)
1232
+ if D != 1:
1233
+ if eta != 0:
1234
+ raise NotImplementedError("quadratic twists only implemented for the 0th Teichmueller component")
1235
+ if D % 4 == 0:
1236
+ d = D//4
1237
+ if not d.is_squarefree() or d % 4 == 1:
1238
+ raise ValueError("quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field" % D)
1239
+ else:
1240
+ if not D.is_squarefree() or D % 4 != 1:
1241
+ raise ValueError("quadratic_twist (=%s) must be a fundamental discriminant of a quadratic field" % D)
1242
+ if gcd(D, self._E.conductor()) != 1:
1243
+ for ell in prime_divisors(D):
1244
+ if valuation(self._E.conductor(), ell) > valuation(D, ell):
1245
+ raise ValueError("cannot twist a curve of conductor (=%s) by the quadratic twist (=%s)." % (self._E.conductor(), D))
1246
+
1247
+ p = self._p
1248
+ eta = ZZ(eta) % (p - 1) if p != 2 else ZZ(eta) % 2
1249
+
1250
+ if prec == 1:
1251
+ if eta == 0:
1252
+ # trac 15737: if we only ask for the leading term we don't
1253
+ # need to do any sum as L_p(E,0) = (1-1/alpha)^2 * m(0) (good case)
1254
+ # set prec arbitrary to 20.
1255
+ alpha = self.alpha(prec=20)
1256
+ K = alpha.parent()
1257
+ R = PowerSeriesRing(K,'T',1)
1258
+ L = self.modular_symbol(0, sign=+1, quadratic_twist=D)
1259
+ L *= (1-1/self.alpha())**2
1260
+ L /= self._quotient_of_periods_to_twist(D)*self._E.real_components()
1261
+ L = R(L, 1)
1262
+ return L
1263
+ else:
1264
+ # here we need some sums anyway
1265
+ bounds = self._prec_bounds(n,prec)
1266
+ alphaadic_prec = 20
1267
+ else:
1268
+ prec = min(p**(n-1), prec)
1269
+ bounds = self._prec_bounds(n,prec)
1270
+ alphaadic_prec = max(bounds[1:]) + 5
1271
+
1272
+ padic_prec = alphaadic_prec//2+1
1273
+ verbose("using alpha-adic precision of %s" % padic_prec)
1274
+ ans = self._get_series_from_cache(n, prec, quadratic_twist,eta)
1275
+ if ans is not None:
1276
+ verbose("found series in cache")
1277
+ return ans
1278
+
1279
+ alpha = self.alpha(prec=padic_prec)
1280
+ K = alpha.parent()
1281
+ R = PowerSeriesRing(K,'T',prec)
1282
+ T = R(R.gen(), prec)
1283
+ L = R(0)
1284
+ one_plus_T_factor = R(1)
1285
+ gamma_power = 1
1286
+ teich = self.teichmuller(padic_prec)
1287
+ if p == 2:
1288
+ teich = [0, 1,-1]
1289
+ gamma = 5
1290
+ p_power = 2**(n-2)
1291
+ a_range = 3
1292
+ else:
1293
+ teich = self.teichmuller(padic_prec)
1294
+ gamma = 1 + p
1295
+ p_power = p**(n-1)
1296
+ a_range = p
1297
+ si = 1-2*(eta % 2)
1298
+
1299
+ verbose("Now iterating over %s summands" % ((p-1)*p_power))
1300
+ verbose_level = get_verbose()
1301
+ count_verb = 0
1302
+ for j in range(p_power):
1303
+ s = K(0)
1304
+ if verbose_level >= 2 and j/p_power*100 > count_verb + 3:
1305
+ verbose("%.2f percent done" % (float(j)/p_power*100))
1306
+ count_verb += 3
1307
+ for a in range(1,a_range):
1308
+ b = teich[a] * gamma_power
1309
+ s += teich[a]**eta * self.measure(b, n, padic_prec, quadratic_twist=D, sign=si)
1310
+ L += s * one_plus_T_factor
1311
+ one_plus_T_factor *= 1+T
1312
+ gamma_power *= gamma
1313
+
1314
+ # Now create series but with each coefficient truncated
1315
+ # so it is proven correct:
1316
+ # the coefficients are now treated as alpha-adic numbers (trac 20254)
1317
+ L = R(L,prec)
1318
+ aj = L.list()
1319
+ if aj:
1320
+ bj = [aj[0].add_bigoh(2*(padic_prec-2))]
1321
+ j = 1
1322
+ while j < len(aj):
1323
+ bj.append( aj[j].add_bigoh(bounds[j]) )
1324
+ j += 1
1325
+ L = R(bj, prec)
1326
+ L /= self._quotient_of_periods_to_twist(D)
1327
+ if si == +1:
1328
+ L /= self._E.real_components()
1329
+ self._set_series_in_cache(n, prec, quadratic_twist, eta, L)
1330
+ return L
1331
+
1332
+ power_series = series
1333
+
1334
+ def is_ordinary(self):
1335
+ r"""
1336
+ Return ``True`` if the elliptic curve that this `L`-function is attached
1337
+ to is ordinary.
1338
+
1339
+ EXAMPLES::
1340
+
1341
+ sage: L = EllipticCurve('11a').padic_lseries(19)
1342
+ sage: L.is_ordinary()
1343
+ False
1344
+ """
1345
+ return False
1346
+
1347
+ def is_supersingular(self):
1348
+ r"""
1349
+ Return ``True`` if the elliptic curve that this L function is attached
1350
+ to is supersingular.
1351
+
1352
+ EXAMPLES::
1353
+
1354
+ sage: L = EllipticCurve('11a').padic_lseries(19)
1355
+ sage: L.is_supersingular()
1356
+ True
1357
+ """
1358
+ return True
1359
+
1360
+ def _prec_bounds(self, n, prec):
1361
+ r"""
1362
+ A helper function not designed for direct use.
1363
+
1364
+ It returns the `\alpha`-adic precisions of the approximation
1365
+ to the `p`-adic `L`-function.
1366
+
1367
+ EXAMPLES::
1368
+
1369
+ sage: E = EllipticCurve('11a1')
1370
+ sage: Lp = E.padic_lseries(19)
1371
+ sage: Lp._prec_bounds(3,5)
1372
+ [+Infinity, -1, -1, -1, -1]
1373
+ sage: Lp._prec_bounds(2,5)
1374
+ [+Infinity, -2, -2, -2, -2]
1375
+ sage: Lp._prec_bounds(10,5)
1376
+ [+Infinity, 6, 6, 6, 6]
1377
+ """
1378
+ if self._p == 2:
1379
+ e = self._e_bounds(n - 2, prec)
1380
+ else:
1381
+ e = self._e_bounds(n - 1, prec)
1382
+ c0 = ZZ(n + 2)
1383
+ return [infinity] + [2 * e[j] - c0 for j in range(1, len(e))]
1384
+
1385
+ def _poly(self, a):
1386
+ r"""
1387
+ Given an element a in Qp[alpha] this returns the list
1388
+ containing the two coordinates in Qp.
1389
+
1390
+ EXAMPLES::
1391
+
1392
+ sage: E = EllipticCurve("14a1")
1393
+ sage: lp = E.padic_lseries(5)
1394
+ sage: K = lp.alpha().parent()
1395
+ sage: a = K(5)
1396
+ sage: a
1397
+ 4*alpha^2 + alpha^4 + O(alpha^42)
1398
+ sage: lp._poly(a)
1399
+ [5 + O(5^21), O(5^21)]
1400
+ """
1401
+ # this should be implemented in elements of Eisenstein rings at some point trac 20248
1402
+
1403
+ if a.is_zero():
1404
+ return [0, 0]
1405
+ v, k = a._ntl_rep_abs()
1406
+ K = a.base_ring()
1407
+ pi = K.uniformiser()
1408
+ v0 = K(v[0]._sage_()) * pi**k
1409
+ v1 = K(v[1]._sage_()) * pi**k
1410
+ alpha = a.parent().gen()
1411
+ assert v0 + v1 * alpha == a
1412
+ return [v0, v1]
1413
+
1414
+ def Dp_valued_series(self, n=3, quadratic_twist=+1, prec=5):
1415
+ r"""
1416
+ Return a vector of two components which are `p`-adic power series.
1417
+
1418
+ The answer v is such that
1419
+
1420
+ `(1-\varphi)^{-2}\cdot L_p(E,T) =` ``v[1]`` `\cdot \omega +` ``v[2]`` `\cdot \varphi(\omega)`
1421
+
1422
+ as an element of the Dieudonné module `D_p(E) = H^1_{dR}(E/\QQ_p)` where
1423
+ `\omega` is the invariant differential and `\varphi` is the Frobenius on `D_p(E)`.
1424
+
1425
+ According to the `p`-adic Birch and Swinnerton-Dyer
1426
+ conjecture [BP1993]_ this function has a zero of order
1427
+ rank of `E(\QQ)` and it's leading term is contains the order of
1428
+ the Tate-Shafarevich group, the Tamagawa numbers, the order of the
1429
+ torsion subgroup and the `D_p`-valued `p`-adic regulator.
1430
+
1431
+ INPUT:
1432
+
1433
+ - ``n`` -- (default: 3) a positive integer
1434
+ - ``prec`` -- (default: 5) a positive integer
1435
+
1436
+ EXAMPLES::
1437
+
1438
+ sage: E = EllipticCurve('14a')
1439
+ sage: L = E.padic_lseries(5)
1440
+ sage: L.Dp_valued_series(4) # long time (9s on sage.math, 2011)
1441
+ (1 + 4*5 + O(5^2) + (4 + O(5))*T + (1 + O(5))*T^2 + (4 + O(5))*T^3 + (2 + O(5))*T^4 + O(T^5), 5^2 + O(5^3) + O(5^2)*T + (4*5 + O(5^2))*T^2 + (2*5 + O(5^2))*T^3 + (2 + 2*5 + O(5^2))*T^4 + O(T^5))
1442
+ """
1443
+ E = self._E
1444
+ p = self._p
1445
+ lps = self.series(n, quadratic_twist=quadratic_twist, prec=prec)
1446
+
1447
+ # now split up the series in two lps = G + H * alpha
1448
+ R = lps.base_ring().base_ring() # Qp
1449
+ QpT, T = PowerSeriesRing(R, 'T', prec).objgen()
1450
+ Gli = []
1451
+ Hli = []
1452
+ for n in range(lps.prec()):
1453
+ v = self._poly(lps[n])
1454
+ Gli.append(v[0])
1455
+ Hli.append(v[1])
1456
+ G = QpT(Gli, prec)
1457
+ H = QpT(Hli, prec)
1458
+
1459
+ # now compute phi
1460
+ phi = matrix([[0, -1 / p], [1, E.ap(p) / p]])
1461
+ lpv = vector([G + (E.ap(p)) * H, - R(p) * H]) # this is L_p
1462
+ eps = (1 - phi)**(-2)
1463
+ resu = lpv * eps.transpose()
1464
+ return resu
1465
+
1466
+ def frobenius(self, prec=20, algorithm='mw'):
1467
+ r"""
1468
+ Return a geometric Frobenius `\varphi` on the Dieudonné module `D_p(E)`
1469
+ with respect to the basis `\omega`, the invariant differential, and `\eta=x\omega`.
1470
+
1471
+ It satisfies `\varphi^2 - a_p/p\, \varphi + 1/p = 0`.
1472
+
1473
+ INPUT:
1474
+
1475
+ - ``prec`` -- (default: 20) a positive integer
1476
+
1477
+ - ``algorithm`` -- either 'mw' (default) for Monsky-Washnitzer
1478
+ or 'approx' for the algorithm described by Bernardi and Perrin-Riou
1479
+ (much slower and not fully tested)
1480
+
1481
+ EXAMPLES::
1482
+
1483
+ sage: # needs sage.symbolic
1484
+ sage: E = EllipticCurve('14a')
1485
+ sage: L = E.padic_lseries(5)
1486
+ sage: phi = L.frobenius(5)
1487
+ sage: phi
1488
+ [ 2 + 5^2 + 5^4 + O(5^5) 3*5^-1 + 3 + 5 + 4*5^2 + 5^3 + O(5^4)]
1489
+ [ 3 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5) 3 + 4*5 + 3*5^2 + 4*5^3 + 3*5^4 + O(5^5)]
1490
+ sage: -phi^2
1491
+ [5^-1 + O(5^4) O(5^4)]
1492
+ [ O(5^5) 5^-1 + O(5^4)]
1493
+ """
1494
+ E = self._E
1495
+ p = self._p
1496
+ if algorithm != "mw" and algorithm != "approx":
1497
+ raise ValueError("Unknown algorithm %s." % algorithm)
1498
+ if algorithm == "approx":
1499
+ return self.__phi_bpr(prec=prec)
1500
+ if p < 4 and algorithm == "mw":
1501
+ print("Warning: If this fails try again using algorithm=\"approx\"")
1502
+ Ew = E.integral_short_weierstrass_model()
1503
+ adjusted_prec = sage.schemes.hyperelliptic_curves.monsky_washnitzer.adjusted_prec(p, prec)
1504
+ modprecring = Integers(p**adjusted_prec)
1505
+ output_ring = Qp(p, prec)
1506
+ R, x = PolynomialRing(modprecring, 'x').objgen()
1507
+ Q = x**3 + modprecring(Ew.a4()) * x + modprecring(Ew.a6())
1508
+ trace = Ew.ap(p)
1509
+ fr = sage.schemes.hyperelliptic_curves.monsky_washnitzer.matrix_of_frobenius(Q, p, adjusted_prec, trace)
1510
+ fr = matrix(output_ring,2,2,fr)
1511
+
1512
+ # return a vector for PARI's ellchangecurve to pass from e1 to e2
1513
+ def isom(e1, e2):
1514
+ if not e1.is_isomorphic(e2):
1515
+ raise ValueError("Curves must be isomorphic.")
1516
+ usq = (e1.discriminant() / e2.discriminant()).nth_root(6)
1517
+ u = usq.sqrt()
1518
+ s = (u * e2.a1() - e1.a1()) / ZZ(2)
1519
+ r = (usq * e2.a2() - e1.a2() + s**2 + e1.a1()*s) / ZZ(3)
1520
+ t = (u**3 * e2.a3() - e1.a3() - e1.a1()*r) / ZZ(2)
1521
+ return [u, r, s, t]
1522
+
1523
+ v = isom(E, Ew)
1524
+ u = v[0]
1525
+ r = v[1]
1526
+
1527
+ # change basis
1528
+ A = matrix([[u, -r/u], [0, 1/u]])
1529
+ frn = A * fr * A**(-1)
1530
+ return 1 / p*frn
1531
+
1532
+ def __phi_bpr(self, prec=0):
1533
+ r"""
1534
+ This returns a geometric Frobenius `\varphi` on the Dieudonné module `D_p(E)`
1535
+ with respect to the basis `\omega`, the invariant differential, and `\eta=x\omega`.
1536
+ It satisfies `\varphi^2 - a_p/p\, \varphi + 1/p = 0`.
1537
+
1538
+ The algorithm used here is described in bernardi-perrin-riou on page 232.
1539
+
1540
+ .. WARNING::
1541
+
1542
+ This function has not been sufficiently tested. It is very slow.
1543
+
1544
+ EXAMPLES::
1545
+
1546
+ sage: E = EllipticCurve('11a1')
1547
+ sage: lp = E.padic_lseries(19)
1548
+ sage: lp.frobenius(prec=1,algorithm='approx') #indirect doctest
1549
+ [ O(19^0) 4*19^-1 + O(19^0)]
1550
+ [ 14 + O(19) O(19^0)]
1551
+
1552
+ sage: E = EllipticCurve('17a1')
1553
+ sage: lp = E.padic_lseries(3)
1554
+ sage: lp.frobenius(prec=3,algorithm='approx')
1555
+ [ O(3) 2*3^-1 + 2 + O(3)]
1556
+ [ 1 + O(3^2) O(3)]
1557
+ sage: lp.frobenius(prec=5,algorithm='approx')
1558
+ [ 3 + O(3^2) 2*3^-1 + 2 + 3 + O(3^2)]
1559
+ [ 1 + 2*3^2 + O(3^3) 2*3 + O(3^2)]
1560
+ """
1561
+ E = self._E
1562
+ p = self._p
1563
+ if prec > 10:
1564
+ print("Warning: Very large value for the precision.")
1565
+ if prec == 0:
1566
+ prec = floor(log(10000)/log(p))
1567
+ verbose("prec set to %s" % prec)
1568
+ eh = E.formal()
1569
+ om = eh.differential(prec=p**prec+3)
1570
+ verbose("differential computed")
1571
+ xt = eh.x(prec=p**prec + 3)
1572
+ et = xt*om
1573
+ # c_(p^k) = cs[k] d...
1574
+ cs = [om[p**k-1] for k in range(prec + 1)]
1575
+ ds = [et[p**k-1] for k in range(prec + 1)]
1576
+ delta = 0
1577
+ dpr = 0
1578
+ gamma = 0
1579
+ dga = 0
1580
+ for k in range(1,prec+1):
1581
+ # this is the equation eq[0]*x+eq[1]*y+eq[2] == 0
1582
+ # such that delta_ = delta + d^dpr*x ...
1583
+ eq = [(p**dpr*cs[k]) % p**k,
1584
+ (-p**dga*ds[k]) % p**k,
1585
+ (delta*cs[k]-gamma*ds[k]-cs[k-1]) % p**k]
1586
+ verbose("valuations : %s" % ([x.valuation(p) for x in eq]))
1587
+ v = min(x.valuation(p) for x in eq)
1588
+ if v == infinity:
1589
+ verbose("no new information at step k=%s" % k)
1590
+ else:
1591
+ eq = [ZZ(x/p**v) for x in eq]
1592
+ verbose("renormalised eq mod p^%s is now %s" % (k-v,eq))
1593
+ if eq[0].valuation(p) == 0:
1594
+ l = min(eq[1].valuation(p),k-v)
1595
+ if l == 0:
1596
+ verbose("not uniquely determined at step k=%s" % k)
1597
+ else:
1598
+ ainv = eq[0].inverse_mod(p**l)
1599
+ delta = delta - eq[2]*ainv*p**dpr
1600
+ dpr = dpr + l
1601
+ delta = delta % p**dpr
1602
+ verbose("delta_prec increased to %s\n delta is now %s" % (dpr,delta))
1603
+ elif eq[1].valuation(p) == 0:
1604
+ l = min(eq[0].valuation(p),k-v)
1605
+ ainv = eq[1].inverse_mod(p**l)
1606
+ gamma = gamma - eq[2]*ainv*p**dga
1607
+ dga = dga + l
1608
+ gamma = gamma % p**dga
1609
+ verbose("gamma_prec increased to %s\n gamma is now %s" % (dga,gamma))
1610
+ else:
1611
+ raise RuntimeError("Bug: no delta or gamma can exist")
1612
+
1613
+ # end of approximation of delta and gamma
1614
+ R = Qp(p,max(dpr,dga)+1)
1615
+ delta = R(delta,absprec=dpr)
1616
+ gamma = R(gamma,absprec=dga)
1617
+ verbose("result delta = %s\n gamma = %s\n check : %s" % (delta,gamma, [Qp(p,k)(delta * cs[k] - gamma * ds[k] - cs[k-1]) for k in range(1,prec+1)] ))
1618
+ a = delta
1619
+ c = -gamma
1620
+ d = E.ap(p) - a
1621
+ b = (-1/p+a*d)/c
1622
+ phi = matrix([[a,b],[c,d]])
1623
+ return phi
1624
+
1625
+ def bernardi_sigma_function(self, prec=20):
1626
+ r"""
1627
+ Return the `p`-adic sigma function of Bernardi in terms of `z = log(t)`.
1628
+
1629
+ This is the same as ``padic_sigma`` with ``E2 = 0``.
1630
+
1631
+ EXAMPLES::
1632
+
1633
+ sage: E = EllipticCurve('14a')
1634
+ sage: L = E.padic_lseries(5)
1635
+ sage: L.bernardi_sigma_function(prec=5) # Todo: some sort of consistency check!?
1636
+ z + 1/24*z^3 + 29/384*z^5 - 8399/322560*z^7 - 291743/92897280*z^9 + O(z^10)
1637
+ """
1638
+ E = self._E
1639
+
1640
+ Eh = E.formal()
1641
+ lo = Eh.log(prec + 5)
1642
+ F = lo.reverse()
1643
+
1644
+ S = LaurentSeriesRing(QQ,'z')
1645
+ z = S.gen()
1646
+ F = F(z)
1647
+ xofF = Eh.x(prec + 2)(F)
1648
+ #r = ( E.a1()**2 + 4*E.a2() ) / ZZ(12)
1649
+ g = (1/z**2 - xofF ).power_series()
1650
+ h = g.integral().integral()
1651
+ sigma_of_z = z.power_series() * h.exp()
1652
+
1653
+ return sigma_of_z
1654
+
1655
+ def Dp_valued_height(self, prec=20):
1656
+ r"""
1657
+ Return the canonical `p`-adic height with values in the Dieudonné module `D_p(E)`.
1658
+
1659
+ It is defined to be
1660
+
1661
+ `h_{\eta} \cdot \omega - h_{\omega} \cdot \eta`
1662
+
1663
+ where `h_{\eta}` is made out of the sigma function of Bernardi and
1664
+ `h_{\omega}` is `log_E^2`.
1665
+
1666
+ The answer ``v`` is given as ``v[1]*omega + v[2]*eta``.
1667
+ The coordinates of ``v`` are dependent of the
1668
+ Weierstrass equation.
1669
+
1670
+ EXAMPLES::
1671
+
1672
+ sage: E = EllipticCurve('53a')
1673
+ sage: L = E.padic_lseries(5)
1674
+ sage: h = L.Dp_valued_height(7)
1675
+ sage: h(E.gens()[0])
1676
+ (3*5 + 5^2 + 2*5^3 + 3*5^4 + 4*5^5 + 5^6 + 5^7 + O(5^8), 5^2 + 4*5^4 + 2*5^7 + 3*5^8 + O(5^9))
1677
+ """
1678
+ E = self._E
1679
+ p = self._p
1680
+ Ehat = E.formal()
1681
+ elog = Ehat.log(prec + Integer(3))
1682
+
1683
+ # we will have to do it properly with David Harvey's _multiply_point()
1684
+ # import here to avoid circular import
1685
+ from sage.schemes.elliptic_curves.padics import _multiple_to_make_good_reduction
1686
+ n = _multiple_to_make_good_reduction(E)
1687
+ n = LCM(n, E.Np(p)) # allowed here because E has good reduction at p
1688
+
1689
+ def height(P, check=True):
1690
+ if P.is_finite_order():
1691
+ return Qp(p,prec)(0)
1692
+ if check:
1693
+ assert P.curve() == E, 'the point P must lie on the curve from which the height function was created'
1694
+
1695
+ Q = n * P
1696
+ tt = - Q[0]/Q[1]
1697
+ R = Qp(p,prec+5)
1698
+ tt = R(tt)
1699
+ zz = elog(tt)
1700
+
1701
+ homega = -zz**2 / n**2
1702
+
1703
+ eQ = denominator(Q[1]) / denominator(Q[0])
1704
+ si = self.bernardi_sigma_function(prec=prec+4)
1705
+ heta = 2 * log(si(zz)/eQ) / n**2
1706
+
1707
+ R = Qp(p, prec)
1708
+
1709
+ return vector([-R(heta), R(homega)])
1710
+
1711
+ return height
1712
+
1713
+ def Dp_valued_regulator(self, prec=20, v1=0, v2=0):
1714
+ r"""
1715
+ Return the canonical `p`-adic regulator with values in the Dieudonné module `D_p(E)`
1716
+ as defined by Perrin-Riou using the `p`-adic height with values in `D_p(E)`.
1717
+
1718
+ The result is written in the basis `\omega`, `\varphi(\omega)`, and hence the
1719
+ coordinates of the result are independent of the chosen Weierstrass equation.
1720
+
1721
+ .. NOTE::
1722
+
1723
+ The definition here is corrected with respect to
1724
+ Perrin-Riou's article [PR2003]_. See [SW2013]_.
1725
+
1726
+ EXAMPLES::
1727
+
1728
+ sage: # needs sage.symbolic
1729
+ sage: E = EllipticCurve('43a')
1730
+ sage: L = E.padic_lseries(7)
1731
+ sage: L.Dp_valued_regulator(7)
1732
+ (5*7 + 6*7^2 + 4*7^3 + 4*7^4 + 7^5 + 4*7^7 + O(7^8), 4*7^2 + 2*7^3 + 3*7^4 + 7^5 + 6*7^6 + 4*7^7 + O(7^8))
1733
+ """
1734
+ p = self._p
1735
+ E = self._E
1736
+
1737
+ h = self.Dp_valued_height(prec=prec)
1738
+
1739
+ # this is the height_{v} (P) for a v in D_p
1740
+ def hv(vec, P):
1741
+ hP = h(P)
1742
+ return - vec[0]*hP[1] + vec[1]*hP[0]
1743
+
1744
+ # def hvpairing(vec,P,Q):
1745
+ # return (hv(vec, P+Q) - hv(vec,P)-hv(vec,Q))/2
1746
+ K = Qp(p, prec)
1747
+
1748
+ if v1 == 0 and v2 == 0:
1749
+ v1 = vector([K(0), K(1)]) # that is eta
1750
+ v2 = vector([K(-1), K(1)]) # and this is eta-omega.
1751
+ # the rest should not depend on this choice
1752
+ # as long as it is outside Q_p * omega
1753
+
1754
+ rk = E.rank()
1755
+ if rk == 0:
1756
+ return vector([K(1), K(0)])
1757
+
1758
+ basis = E.gens()
1759
+
1760
+ def regv(vec):
1761
+ M = matrix(K, rk, rk, 0)
1762
+ point_height = [hv(vec, P) for P in basis]
1763
+ for i in range(rk):
1764
+ for j in range(i+1, rk):
1765
+ M[i, j] = M[j, i] = (hv(vec,basis[i] + basis[j]) - point_height[i] - point_height[j] )/2
1766
+ for i in range(rk):
1767
+ M[i, i] = point_height[i]
1768
+
1769
+ return M.determinant()
1770
+
1771
+ def Dp_pairing(vec1, vec2):
1772
+ return (vec1[0]*vec2[1]-vec1[1]*vec2[0])
1773
+
1774
+ omega_vec = vector([K(1),K(0)])
1775
+
1776
+ # note the correction here with respect to Perrin-Riou's definition.
1777
+ # only this way the result will be independent of the choice of v1 and v2.
1778
+ reg1 = regv(v1) / Dp_pairing(omega_vec, v1)**(rk - 1)
1779
+
1780
+ reg2 = regv(v2) / Dp_pairing(omega_vec, v2)**(rk - 1)
1781
+
1782
+ # the regulator in the basis omega,eta
1783
+ reg_oe = (reg1 * v2 - reg2 * v1 ) / Dp_pairing(v2, v1)
1784
+
1785
+ if p < 5:
1786
+ phi = self.frobenius(min(6, prec), algorithm='approx')
1787
+ else:
1788
+ phi = self.frobenius(prec + 2, algorithm='mw')
1789
+
1790
+ c = phi[1, 0] # this is the 'period' [omega,phi(omega)]
1791
+ a = phi[0, 0]
1792
+
1793
+ return vector([reg_oe[0] - a/c*reg_oe[1],reg_oe[1]/c])