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,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])
|