passagemath-schemes 10.6.40__cp314-cp314-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.40.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.40.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-314-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-314-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-314-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list.cpython-314-darwin.so +0 -0
- sage/modular/modsym/p1list.pxd +29 -0
- sage/modular/modsym/p1list.pyx +1372 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-314-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-314-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- 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
|