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