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,760 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Formal groups of elliptic curves
4
+
5
+ AUTHORS:
6
+
7
+ - William Stein: original implementations
8
+
9
+ - David Harvey: improved asymptotics of some methods
10
+
11
+ - Nick Alexander: separation from ell_generic.py, bugfixes and
12
+ docstrings
13
+ """
14
+
15
+ from sage.structure.sage_object import SageObject
16
+
17
+ from sage.rings.power_series_ring import PowerSeriesRing
18
+ from sage.rings.laurent_series_ring import LaurentSeriesRing
19
+ from sage.rings.big_oh import O
20
+
21
+
22
+ class EllipticCurveFormalGroup(SageObject):
23
+ r"""
24
+ The formal group associated to an elliptic curve.
25
+ """
26
+ def __init__(self, E):
27
+ """
28
+ EXAMPLES::
29
+
30
+ sage: E = EllipticCurve('11a')
31
+ sage: F = E.formal_group(); F
32
+ Formal Group associated to the Elliptic Curve
33
+ defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
34
+ sage: F == loads(dumps(F))
35
+ True
36
+ """
37
+ self.__E = E
38
+
39
+ def __eq__(self, other):
40
+ """
41
+ Check whether ``self`` is equal to ``other``.
42
+
43
+ TESTS::
44
+
45
+ sage: E = EllipticCurve('35a')
46
+ sage: F1 = E.formal_group()
47
+ sage: F2 = E.formal_group()
48
+ sage: F1 == F2
49
+ True
50
+ """
51
+ if not isinstance(other, EllipticCurveFormalGroup):
52
+ return False
53
+
54
+ return self.__E == other.__E
55
+
56
+ def __ne__(self, other):
57
+ """
58
+ Check whether ``self`` is not equal to ``other``.
59
+
60
+ EXAMPLES::
61
+
62
+ sage: E = EllipticCurve('35a')
63
+ sage: F1 = E.formal_group()
64
+ sage: F2 = E.formal_group()
65
+ sage: F1 != F2
66
+ False
67
+ """
68
+ return not (self == other)
69
+
70
+ def _repr_(self):
71
+ """
72
+ Return a string representation.
73
+
74
+ EXAMPLES::
75
+
76
+ sage: E = EllipticCurve('43a')
77
+ sage: F = E.formal_group()
78
+ sage: F._repr_()
79
+ 'Formal Group associated to the Elliptic Curve defined by y^2 + y = x^3 + x^2 over Rational Field'
80
+ """
81
+ return "Formal Group associated to the %s" % self.__E
82
+
83
+ def curve(self):
84
+ r"""
85
+ Return the elliptic curve this formal group is associated to.
86
+
87
+ EXAMPLES::
88
+
89
+ sage: E = EllipticCurve("37a")
90
+ sage: F = E.formal_group()
91
+ sage: F.curve()
92
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
93
+ """
94
+ return self.__E
95
+
96
+ def w(self, prec=20):
97
+ r"""
98
+ Return the formal group power series `w`.
99
+
100
+ INPUT:
101
+
102
+ - ``prec`` -- integer (default: 20)
103
+
104
+ OUTPUT: a power series with given precision
105
+
106
+ Return the formal power series
107
+
108
+ .. MATH::
109
+
110
+ w(t) = t^3 + a_1 t^4 + (a_2 + a_1^2) t^5 + \cdots
111
+
112
+ to precision `O(t^{prec})` of Proposition IV.1.1 of
113
+ [Sil2009]_. This is the formal expansion of
114
+ `w = -1/y` about the formal parameter `t = -x/y` at `\infty`.
115
+
116
+ The result is cached, and a cached version is returned if
117
+ possible.
118
+
119
+ .. WARNING::
120
+
121
+ The resulting power series will have precision ``prec``, but
122
+ its parent PowerSeriesRing will have default precision 20
123
+ (or whatever the default default is).
124
+
125
+ ALGORITHM: Uses Newton's method to solve the elliptic curve
126
+ equation at the origin. Complexity is roughly `O(M(n))`
127
+ where `n` is the precision and `M(n)` is the time
128
+ required to multiply polynomials of length `n` over the
129
+ coefficient ring of `E`.
130
+
131
+ AUTHORS:
132
+
133
+ - David Harvey (2006-09-09): modified to use Newton's
134
+ method instead of a recurrence formula.
135
+
136
+ EXAMPLES::
137
+
138
+ sage: e = EllipticCurve([0, 0, 1, -1, 0])
139
+ sage: e.formal_group().w(10)
140
+ t^3 + t^6 - t^7 + 2*t^9 + O(t^10)
141
+
142
+ Check that caching works::
143
+
144
+ sage: e = EllipticCurve([3, 2, -4, -2, 5])
145
+ sage: e.formal_group().w(20)
146
+ t^3 + 3*t^4 + 11*t^5 + 35*t^6 + 101*t^7 + 237*t^8 + 312*t^9 - 949*t^10 - 10389*t^11 - 57087*t^12 - 244092*t^13 - 865333*t^14 - 2455206*t^15 - 4366196*t^16 + 6136610*t^17 + 109938783*t^18 + 688672497*t^19 + O(t^20)
147
+ sage: e.formal_group().w(7)
148
+ t^3 + 3*t^4 + 11*t^5 + 35*t^6 + O(t^7)
149
+ sage: e.formal_group().w(35)
150
+ t^3 + 3*t^4 + 11*t^5 + 35*t^6 + 101*t^7 + 237*t^8 + 312*t^9 - 949*t^10 - 10389*t^11 - 57087*t^12 - 244092*t^13 - 865333*t^14 - 2455206*t^15 - 4366196*t^16 + 6136610*t^17 + 109938783*t^18 + 688672497*t^19 + 3219525807*t^20 + 12337076504*t^21 + 38106669615*t^22 + 79452618700*t^23 - 33430470002*t^24 - 1522228110356*t^25 - 10561222329021*t^26 - 52449326572178*t^27 - 211701726058446*t^28 - 693522772940043*t^29 - 1613471639599050*t^30 - 421817906421378*t^31 + 23651687753515182*t^32 + 181817896829144595*t^33 + 950887648021211163*t^34 + O(t^35)
151
+ """
152
+ prec = max(prec, 0)
153
+ k = self.curve().base_ring()
154
+
155
+ try:
156
+ # Try cached version
157
+ w = self.__w
158
+ cached_prec = w.prec()
159
+ R = w.parent()
160
+ except AttributeError:
161
+ # No cached version available
162
+ R = PowerSeriesRing(k, "t")
163
+ w = R([k(0), k(0), k(0), k(1)], 4)
164
+ cached_prec = 4
165
+ self.__w = w
166
+
167
+ if prec < cached_prec:
168
+ return R(w, prec)
169
+
170
+ # We use the following iteration, which doubles the precision
171
+ # at each step:
172
+ #
173
+ # z^3 - a_3 w^2 - a_4 z w^2 - 2 a_6 w^3
174
+ # w' = -----------------------------------------------------
175
+ # 1 - a_1 z - a_2 z^2 - 2 a_3 w - 2 a_4 z w - 3 a_6 w^2
176
+
177
+ a1, a2, a3, a4, a6 = self.curve().ainvs()
178
+ current_prec = cached_prec
179
+ w = w.truncate() # work with polynomials instead of power series
180
+
181
+ numerator_const = w.parent()([0, 0, 0, 1]) # z^3
182
+ denominator_const = w.parent()([1, -a1, -a2]) # 1 - a_1 z - a_2 z^2
183
+
184
+ from sage.misc.misc import newton_method_sizes
185
+
186
+ last_prec = 0
187
+ for next_prec in newton_method_sizes(prec):
188
+ if next_prec > current_prec:
189
+ if w.degree() - 1 > last_prec:
190
+ # Here it's best to throw away some precision to get us
191
+ # in sync with the sizes recommended by
192
+ # newton_method_sizes(). This is especially counter-
193
+ # intuitive when we throw away almost half of our
194
+ # cached data!
195
+
196
+ # todo: this might not actually be true, depending on
197
+ # the overhead of truncate(), which is currently very
198
+ # high e.g. for NTL based polynomials (but this is
199
+ # slated to be fixed...)
200
+
201
+ w = w.truncate(last_prec)
202
+
203
+ w_squared = w.square()
204
+ w_cubed = (w_squared * w).truncate(next_prec)
205
+
206
+ numerator = numerator_const \
207
+ - a3 * w_squared \
208
+ - a4 * w_squared.shift(1) \
209
+ - (2*a6) * w_cubed
210
+
211
+ denominator = denominator_const \
212
+ - (2*a3) * w \
213
+ - (2*a4) * w.shift(1) \
214
+ - (3*a6) * w_squared
215
+
216
+ # todo: this is quite inefficient, because it gets
217
+ # converted to a power series, then the power series
218
+ # inversion works with polynomials again, and then
219
+ # it gets converted *back* to a power series, and
220
+ # then we convert it to a polynomial again! That's four
221
+ # useless conversions!!!
222
+
223
+ inverse = ~R(denominator, prec=next_prec)
224
+ inverse = inverse.truncate(next_prec)
225
+
226
+ w = (numerator * inverse).truncate(next_prec)
227
+
228
+ last_prec = next_prec
229
+
230
+ # convert back to power series
231
+ w = R(w, prec)
232
+ self.__w = (prec, w)
233
+ return self.__w[1]
234
+
235
+ def x(self, prec=20):
236
+ r"""
237
+ Return the formal series `x(t) = t/w(t)` in terms of the
238
+ local parameter `t = -x/y` at infinity.
239
+
240
+ INPUT:
241
+
242
+ - ``prec`` -- integer (default: 20)
243
+
244
+ OUTPUT: a Laurent series with given precision
245
+
246
+ Return the formal series
247
+
248
+ .. MATH::
249
+
250
+ x(t) = t^{-2} - a_1 t^{-1} - a_2 - a_3 t - \cdots
251
+
252
+ to precision `O(t^{prec})` of page 113 of [Sil2009]_.
253
+
254
+ .. WARNING::
255
+
256
+ The resulting series will have precision ``prec``, but its
257
+ parent PowerSeriesRing will have default precision 20 (or
258
+ whatever the default default is).
259
+
260
+ EXAMPLES::
261
+
262
+ sage: EllipticCurve([0, 0, 1, -1, 0]).formal_group().x(10)
263
+ t^-2 - t + t^2 - t^4 + 2*t^5 - t^6 - 2*t^7 + 6*t^8 - 6*t^9 + O(t^10)
264
+ """
265
+ prec = max(prec, 0)
266
+ y = self.y(prec)
267
+ t = y.parent().gen()
268
+ return -t*y + O(t**prec)
269
+
270
+ def y(self, prec=20):
271
+ r"""
272
+ Return the formal series `y(t) = -1/w(t)` in terms of the
273
+ local parameter `t = -x/y` at infinity.
274
+
275
+ INPUT:
276
+
277
+ - ``prec`` -- integer (default: 20)
278
+
279
+ OUTPUT: a Laurent series with given precision
280
+
281
+ Return the formal series
282
+
283
+ .. MATH::
284
+
285
+ y(t) = - t^{-3} + a_1 t^{-2} + a_2 t + a_3 + \cdots
286
+
287
+ to precision `O(t^{prec})` of page 113 of [Sil2009]_.
288
+
289
+ The result is cached, and a cached version is returned if
290
+ possible.
291
+
292
+ .. WARNING::
293
+
294
+ The resulting series will have precision ``prec``, but its
295
+ parent PowerSeriesRing will have default precision 20 (or
296
+ whatever the default default is).
297
+
298
+ EXAMPLES::
299
+
300
+ sage: EllipticCurve([0, 0, 1, -1, 0]).formal_group().y(10)
301
+ -t^-3 + 1 - t + t^3 - 2*t^4 + t^5 + 2*t^6 - 6*t^7 + 6*t^8 + 3*t^9 + O(t^10)
302
+ """
303
+ prec = max(prec,0)
304
+ try:
305
+ pr, y = self.__y
306
+ except AttributeError:
307
+ pr = -1
308
+ if prec <= pr:
309
+ t = y.parent().gen()
310
+ return y + O(t**prec)
311
+ w = self.w(prec+6) # XXX why 6?
312
+ t = w.parent().gen()
313
+ y = -(w**(-1)) + O(t**prec)
314
+ self.__y = (prec, y)
315
+ return self.__y[1]
316
+
317
+ def differential(self, prec=20):
318
+ r"""
319
+ Return the power series `f(t) = 1 + \cdots` such that
320
+ `f(t) dt` is the usual invariant differential
321
+ `dx/(2y + a_1 x + a_3)`.
322
+
323
+ INPUT:
324
+
325
+ - ``prec`` -- nonnegative integer (default: 20), answer
326
+ will be returned `O(t^{\mathrm{prec}})`
327
+
328
+ OUTPUT: a power series with given precision
329
+
330
+ Return the formal series
331
+
332
+ .. MATH::
333
+
334
+ f(t) = 1 + a_1 t + ({a_1}^2 + a_2) t^2 + \cdots
335
+
336
+ to precision `O(t^{prec})` of page 113 of [Sil2009]_.
337
+
338
+ The result is cached, and a cached version is returned if
339
+ possible.
340
+
341
+ .. WARNING::
342
+
343
+ The resulting series will have precision ``prec``, but its
344
+ parent PowerSeriesRing will have default precision 20 (or
345
+ whatever the default default is).
346
+
347
+ EXAMPLES::
348
+
349
+ sage: EllipticCurve([-1, 1/4]).formal_group().differential(15)
350
+ 1 - 2*t^4 + 3/4*t^6 + 6*t^8 - 5*t^10 - 305/16*t^12 + 105/4*t^14 + O(t^15)
351
+ sage: EllipticCurve(Integers(53), [-1, 1/4]).formal_group().differential(15)
352
+ 1 + 51*t^4 + 14*t^6 + 6*t^8 + 48*t^10 + 24*t^12 + 13*t^14 + O(t^15)
353
+
354
+ AUTHORS:
355
+
356
+ - David Harvey (2006-09-10): factored out of log
357
+ """
358
+ prec = max(prec,0)
359
+ try:
360
+ cached_prec, omega = self.__omega
361
+ except AttributeError:
362
+ cached_prec = -1
363
+ if prec <= cached_prec:
364
+ return omega.add_bigoh(prec)
365
+
366
+ a = self.curve().ainvs()
367
+ x = self.x(prec+1)
368
+ y = self.y(prec+1)
369
+ xprime = x.derivative()
370
+ g = xprime / (2*y + a[0]*x + a[2])
371
+ self.__omega = (prec, g.power_series().add_bigoh(prec))
372
+ return self.__omega[1]
373
+
374
+ def log(self, prec=20):
375
+ r"""
376
+ Return the power series `f(t) = t + \cdots` which is an
377
+ isomorphism to the additive formal group.
378
+
379
+ Generally this only makes sense in characteristic zero, although
380
+ the terms before `t^p` may work in characteristic `p`.
381
+
382
+ INPUT:
383
+
384
+ - ``prec`` -- nonnegative integer (default: 20)
385
+
386
+ OUTPUT: a power series with given precision
387
+
388
+ EXAMPLES::
389
+
390
+ sage: EllipticCurve([-1, 1/4]).formal_group().log(15)
391
+ t - 2/5*t^5 + 3/28*t^7 + 2/3*t^9 - 5/11*t^11 - 305/208*t^13 + O(t^15)
392
+
393
+ AUTHORS:
394
+
395
+ - David Harvey (2006-09-10): rewrote to use differential
396
+ """
397
+ return self.differential(prec-1).integral().add_bigoh(prec)
398
+
399
+ def inverse(self, prec=20):
400
+ r"""
401
+ Return the formal group inverse law `i(t)`, which satisfies `F(t, i(t)) = 0`.
402
+
403
+ INPUT:
404
+
405
+ - ``prec`` -- integer (default: 20)
406
+
407
+ OUTPUT: a power series with given precision
408
+
409
+ Return the formal power series
410
+
411
+ .. MATH::
412
+
413
+ i(t) = - t + a_1 t^2 + \cdots
414
+
415
+ to precision `O(t^{prec})` of page 114 of [Sil2009]_.
416
+
417
+ The result is cached, and a cached version is returned if
418
+ possible.
419
+
420
+ .. WARNING::
421
+
422
+ The resulting power series will have precision ``prec``, but
423
+ its parent PowerSeriesRing will have default precision 20
424
+ (or whatever the default default is).
425
+
426
+ EXAMPLES::
427
+
428
+ sage: P.<a1, a2, a3, a4, a6> = ZZ[]
429
+ sage: E = EllipticCurve(list(P.gens()))
430
+ sage: i = E.formal_group().inverse(6); i
431
+ -t - a1*t^2 - a1^2*t^3 + (-a1^3 - a3)*t^4 + (-a1^4 - 3*a1*a3)*t^5 + O(t^6)
432
+ sage: F = E.formal_group().group_law(6)
433
+ sage: F(i.parent().gen(), i)
434
+ O(t^6)
435
+ """
436
+ prec = max(prec,0)
437
+ try:
438
+ pr, inv = self.__inverse
439
+ except AttributeError:
440
+ pr = -1
441
+ if prec <= pr:
442
+ t = inv.parent().gen()
443
+ return inv + O(t**prec)
444
+ x = self.x(prec)
445
+ y = self.y(prec)
446
+ a1, _, a3, _, _ = self.curve().ainvs()
447
+ inv = x / ( y + a1*x + a3) # page 114 of Silverman, AEC I
448
+ inv = inv.power_series().add_bigoh(prec)
449
+ self.__inverse = (prec, inv)
450
+ return inv
451
+
452
+ def group_law(self, prec=10):
453
+ r"""
454
+ Return the formal group law.
455
+
456
+ INPUT:
457
+
458
+ - ``prec`` -- integer (default: 10)
459
+
460
+ OUTPUT: a power series with given precision in `R[[t_1,t_2]]`, where
461
+ the curve is defined over `R`.
462
+
463
+ Return the formal power series
464
+
465
+ .. MATH::
466
+
467
+ F(t_1, t_2) = t_1 + t_2 - a_1 t_1 t_2 - \cdots
468
+
469
+ to precision `O(t_1,t_2)^{prec}` of page 115 of [Sil2009]_.
470
+
471
+ The result is cached, and a cached version is returned if possible.
472
+
473
+ AUTHORS:
474
+
475
+ - Nick Alexander: minor fixes, docstring
476
+
477
+ - Francis Clarke (2012-08): modified to use two-variable power series ring
478
+
479
+ EXAMPLES::
480
+
481
+ sage: e = EllipticCurve([1, 2])
482
+ sage: e.formal_group().group_law(6)
483
+ t1 + t2 - 2*t1^4*t2 - 4*t1^3*t2^2 - 4*t1^2*t2^3 - 2*t1*t2^4 + O(t1, t2)^6
484
+
485
+ sage: e = EllipticCurve('14a1')
486
+ sage: ehat = e.formal()
487
+ sage: ehat.group_law(3)
488
+ t1 + t2 - t1*t2 + O(t1, t2)^3
489
+ sage: ehat.group_law(5)
490
+ t1 + t2 - t1*t2 - 2*t1^3*t2 - 3*t1^2*t2^2 - 2*t1*t2^3 + O(t1, t2)^5
491
+
492
+ sage: e = EllipticCurve(GF(7), [3, 4])
493
+ sage: ehat = e.formal()
494
+ sage: ehat.group_law(3)
495
+ t1 + t2 + O(t1, t2)^3
496
+ sage: F = ehat.group_law(7); F
497
+ t1 + t2 + t1^4*t2 + 2*t1^3*t2^2 + 2*t1^2*t2^3 + t1*t2^4 + O(t1, t2)^7
498
+
499
+ TESTS::
500
+
501
+ sage: R.<x,y,z> = GF(7)[[]]
502
+ sage: F(x, ehat.inverse()(x))
503
+ 0 + O(x, y, z)^7
504
+ sage: F(x, y) == F(y, x)
505
+ True
506
+ sage: F(x, F(y, z)) == F(F(x, y), z)
507
+ True
508
+
509
+ Let's ensure caching with changed precision is working::
510
+
511
+ sage: e.formal_group().group_law(4)
512
+ t1 + t2 + O(t1, t2)^4
513
+
514
+ Test for :issue:`9646`::
515
+
516
+ sage: P.<a1, a2, a3, a4, a6> = PolynomialRing(ZZ, 5)
517
+ sage: E = EllipticCurve(list(P.gens()))
518
+ sage: F = E.formal().group_law(prec=5)
519
+ sage: t1, t2 = F.parent().gens()
520
+ sage: F(t1, 0)
521
+ t1 + O(t1, t2)^5
522
+ sage: F(0, t2)
523
+ t2 + O(t1, t2)^5
524
+ sage: F.coefficients()[t1*t2^2]
525
+ -a2
526
+ """
527
+ prec = max(prec,0)
528
+ if prec <= 0:
529
+ raise ValueError("The precision must be positive.")
530
+
531
+ R = PowerSeriesRing(self.curve().base_ring(), 2, 't1,t2')
532
+ t1, t2 = R.gens()
533
+
534
+ if prec == 1:
535
+ return R(0)
536
+ elif prec == 2:
537
+ return t1 + t2 - self.curve().a1()*t1*t2
538
+
539
+ try:
540
+ pr, F = self.__group_law
541
+ if prec <= pr:
542
+ return F.add_bigoh(prec)
543
+ except AttributeError:
544
+ pass
545
+
546
+ w = self.w(prec+1)
547
+ lam = sum([w[n]*sum(t2**m * t1**(n-m-1) for m in range(n)) for n in range(3, prec+1)])
548
+ lam = lam.add_bigoh(prec)
549
+ nu = w(t1) - lam*t1
550
+ a1, a2, a3, a4, a6 = self.curve().ainvs()
551
+ lam2 = lam*lam
552
+ lam3 = lam2*lam
553
+ # note that the following formula differs from the one in Silverman page 119.
554
+ # See github issue 9646 for the explanation and justification.
555
+ t3 = -t1 - t2 - \
556
+ (a1*lam + a3*lam2 + a2*nu + 2*a4*lam*nu + 3*a6*lam2*nu) / \
557
+ (1 + a2*lam + a4*lam2 + a6*lam3)
558
+ inv = self.inverse(prec)
559
+
560
+ F = inv(t3).add_bigoh(prec)
561
+ self.__group_law = (prec, F)
562
+ return F
563
+
564
+ def mult_by_n(self, n, prec=10):
565
+ r"""
566
+ Return the formal 'multiplication by n' endomorphism `[n]`.
567
+
568
+ INPUT:
569
+
570
+ - ``prec`` -- integer (default: 10)
571
+
572
+ OUTPUT: a power series with given precision
573
+
574
+ Return the formal power series
575
+
576
+ .. MATH::
577
+
578
+ [n](t) = n t + \cdots
579
+
580
+ to precision `O(t^{prec})` of Proposition 2.3 of [Sil2009]_.
581
+
582
+ .. WARNING::
583
+
584
+ The resulting power series will have precision ``prec``, but
585
+ its parent PowerSeriesRing will have default precision 20
586
+ (or whatever the default default is).
587
+
588
+ AUTHORS:
589
+
590
+ - Nick Alexander: minor fixes, docstring
591
+
592
+ - David Harvey (2007-03): faster algorithm for char 0 field
593
+ case
594
+
595
+ - Hamish Ivey-Law (2009-06): double-and-add algorithm for
596
+ non char 0 field case.
597
+
598
+ - Tom Boothby (2009-06): slight improvement to double-and-add
599
+
600
+ - Francis Clarke (2012-08): adjustments and simplifications using group_law
601
+ code as modified to yield a two-variable power series.
602
+
603
+ EXAMPLES::
604
+
605
+ sage: e = EllipticCurve([1, 2, 3, 4, 6])
606
+ sage: e.formal_group().mult_by_n(0, 5)
607
+ O(t^5)
608
+ sage: e.formal_group().mult_by_n(1, 5)
609
+ t + O(t^5)
610
+
611
+ We verify an identity of low degree::
612
+
613
+ sage: none = e.formal_group().mult_by_n(-1, 5)
614
+ sage: two = e.formal_group().mult_by_n(2, 5)
615
+ sage: ntwo = e.formal_group().mult_by_n(-2, 5)
616
+ sage: ntwo - none(two)
617
+ O(t^5)
618
+ sage: ntwo - two(none)
619
+ O(t^5)
620
+
621
+ It's quite fast::
622
+
623
+ sage: E = EllipticCurve("37a"); F = E.formal_group()
624
+ sage: F.mult_by_n(100, 20)
625
+ 100*t - 49999950*t^4 + 3999999960*t^5 + 14285614285800*t^7 - 2999989920000150*t^8 + 133333325333333400*t^9 - 3571378571674999800*t^10 + 1402585362624965454000*t^11 - 146666057066712847999500*t^12 + 5336978000014213190385000*t^13 - 519472790950932256570002000*t^14 + 93851927683683567270392002800*t^15 - 6673787211563812368630730325175*t^16 + 320129060335050875009191524993000*t^17 - 45670288869783478472872833214986000*t^18 + 5302464956134111125466184947310391600*t^19 + O(t^20)
626
+
627
+ TESTS::
628
+
629
+ sage: F = EllipticCurve(GF(17), [1, 1]).formal_group()
630
+ sage: F.mult_by_n(10, 50) # long time
631
+ 10*t + 5*t^5 + 7*t^7 + 13*t^9 + t^11 + 16*t^13 + 13*t^15 + 9*t^17 + 16*t^19 + 15*t^23 + 15*t^25 + 2*t^27 + 10*t^29 + 8*t^31 + 15*t^33 + 6*t^35 + 7*t^37 + 9*t^39 + 10*t^41 + 5*t^43 + 4*t^45 + 6*t^47 + 13*t^49 + O(t^50)
632
+
633
+ sage: F = EllipticCurve(GF(101), [1, 1]).formal_group()
634
+ sage: F.mult_by_n(100, 20)
635
+ 100*t + O(t^20)
636
+
637
+ sage: P.<a1, a2, a3, a4, a6> = PolynomialRing(ZZ, 5)
638
+ sage: E = EllipticCurve(list(P.gens()))
639
+ sage: E.formal().mult_by_n(2, prec=5)
640
+ 2*t - a1*t^2 - 2*a2*t^3 + (a1*a2 - 7*a3)*t^4 + O(t^5)
641
+
642
+ sage: E = EllipticCurve(QQ, [1,2,3,4,6])
643
+ sage: E.formal().mult_by_n(2, prec=5)
644
+ 2*t - t^2 - 4*t^3 - 19*t^4 + O(t^5)
645
+ """
646
+ if self.curve().base_ring().is_field() and self.curve().base_ring().characteristic() == 0 and n != 0:
647
+ # The following algorithm only works over a field of
648
+ # characteristic zero. I don't know whether something similar
649
+ # can be done over a general ring. It would be nice if it did,
650
+ # since it's much faster than using the formal group law.
651
+ # -- dmharvey
652
+
653
+ # Create a "formal point" on the original curve E.
654
+ # Our answer only needs prec-1 coefficients (since lowest term
655
+ # is t^1), and x(t) = t^(-2) + ... and y(t) = t^(-3) + ...,
656
+ # so we only need x(t) mod t^(prec-3) and y(t) mod t^(prec-4)
657
+ x = self.x(prec-3)
658
+ y = self.y(prec-4)
659
+ R = x.parent() # the Laurent series ring over the base ring
660
+ X = self.curve().change_ring(R)
661
+ P = X(x, y)
662
+
663
+ # and multiply it by n, using the group law on E
664
+ Q = n*P
665
+
666
+ # express it in terms of the formal parameter
667
+ return -Q[0] / Q[1]
668
+
669
+ # Now the general case, not necessarily over a field.
670
+
671
+ R = PowerSeriesRing(self.curve().base_ring(), "t")
672
+ t = R.gen()
673
+
674
+ if n == 1:
675
+ return t.add_bigoh(prec)
676
+
677
+ if n == 0:
678
+ return R(0).add_bigoh(prec)
679
+
680
+ if n == -1:
681
+ return R(self.inverse(prec))
682
+
683
+ if n < 0:
684
+ return self.inverse(prec)(self.mult_by_n(-n, prec))
685
+
686
+ F = self.group_law(prec)
687
+
688
+ result = t
689
+ if n < 4:
690
+ for m in range(n - 1):
691
+ result = F(result, t)
692
+ return result
693
+
694
+ # Double and add is faster than the naive method when n >= 4.
695
+ g = t
696
+ if n & 1:
697
+ result = g
698
+ else:
699
+ result = 0
700
+ n = n >> 1
701
+
702
+ while n > 0:
703
+ g = F(g, g)
704
+ if n & 1:
705
+ result = F(result, g)
706
+ n = n >> 1
707
+
708
+ return result
709
+
710
+ def sigma(self, prec=10):
711
+ r"""
712
+ Return the Weierstrass sigma function as a formal power series
713
+ solution to the differential equation
714
+
715
+ .. MATH::
716
+
717
+ \frac{d^2 \log \sigma}{dz^2} = - \wp(z)
718
+
719
+ with initial conditions `\sigma(O)=0` and `\sigma'(O)=1`,
720
+ expressed in the variable `t=\log_E(z)` of the formal group.
721
+
722
+ INPUT:
723
+
724
+ - ``prec`` -- integer (default: 10)
725
+
726
+ OUTPUT: a power series with given precision
727
+
728
+ Other solutions can be obtained by multiplication with
729
+ a function of the form `\exp(c z^2)`.
730
+ If the curve has good ordinary reduction at a prime `p`
731
+ then there is a canonical choice of `c` that produces
732
+ the canonical `p`-adic sigma function.
733
+ To obtain that, please use ``E.padic_sigma(p)`` instead.
734
+ See :meth:`~sage.schemes.elliptic_curves.ell_rational_field.EllipticCurve_rational_field.padic_sigma`
735
+
736
+ EXAMPLES::
737
+
738
+ sage: E = EllipticCurve('14a')
739
+ sage: F = E.formal_group()
740
+ sage: F.sigma(5)
741
+ t + 1/2*t^2 + 1/3*t^3 + 3/4*t^4 + O(t^5)
742
+ """
743
+ a1,a2,a3,a4,a6 = self.curve().ainvs()
744
+
745
+ k = self.curve().base_ring()
746
+ fl = self.log(prec)
747
+ F = fl.reverse()
748
+
749
+ S = LaurentSeriesRing(k,'z')
750
+ z = S.gen()
751
+ F = F(z + O(z**prec))
752
+ wp = self.x()(F) + (a1**2 + 4*a2)/12
753
+ g = (1/z**2 - wp).power_series()
754
+ h = g.integral().integral()
755
+ sigma_of_z = z.power_series() * h.exp()
756
+
757
+ T = PowerSeriesRing(k,'t')
758
+ fl = fl(T.gen()+O(T.gen()**prec))
759
+ sigma_of_t = sigma_of_z(fl)
760
+ return sigma_of_t