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,859 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.rings.padics
|
|
3
|
+
r"""
|
|
4
|
+
Manin map
|
|
5
|
+
|
|
6
|
+
Represents maps from a set of right coset representatives to a
|
|
7
|
+
coefficient module.
|
|
8
|
+
|
|
9
|
+
This is a basic building block for implementing modular symbols, and
|
|
10
|
+
provides basic arithmetic and right action of matrices.
|
|
11
|
+
|
|
12
|
+
EXAMPLES::
|
|
13
|
+
|
|
14
|
+
sage: # needs eclib
|
|
15
|
+
sage: E = EllipticCurve('11a')
|
|
16
|
+
sage: phi = E.pollack_stevens_modular_symbol()
|
|
17
|
+
sage: phi
|
|
18
|
+
Modular symbol of level 11 with values in Sym^0 Q^2
|
|
19
|
+
sage: phi.values()
|
|
20
|
+
[-1/5, 1, 0]
|
|
21
|
+
|
|
22
|
+
sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z
|
|
23
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
24
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
25
|
+
sage: MR = ManinRelations(11)
|
|
26
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
27
|
+
sage: f = ManinMap(D, MR, data)
|
|
28
|
+
sage: f(M2Z([1,0,0,1]))
|
|
29
|
+
(1 + O(11^2), 2 + O(11))
|
|
30
|
+
|
|
31
|
+
sage: S = Symk(0,QQ)
|
|
32
|
+
sage: MR = ManinRelations(37)
|
|
33
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
34
|
+
sage: f = ManinMap(S,MR,data)
|
|
35
|
+
sage: f(M2Z([2,3,4,5]))
|
|
36
|
+
1
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# ****************************************************************************
|
|
40
|
+
# Copyright (C) 2012 Robert Pollack <rpollack@math.bu.edu>
|
|
41
|
+
#
|
|
42
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
43
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
44
|
+
# the License, or (at your option) any later version.
|
|
45
|
+
# https://www.gnu.org/licenses/
|
|
46
|
+
# ****************************************************************************
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
from typing import Self # type: ignore (Python >= 3.11)
|
|
50
|
+
except ImportError:
|
|
51
|
+
from typing_extensions import Self # type: ignore (Python 3.10)
|
|
52
|
+
|
|
53
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
54
|
+
from sage.rings.continued_fraction import convergents
|
|
55
|
+
from sage.rings.integer_ring import ZZ
|
|
56
|
+
from sage.structure.element import coercion_model
|
|
57
|
+
|
|
58
|
+
from .fund_domain import M2Z, t00, t01, t10, t11
|
|
59
|
+
from .sigma0 import Sigma0
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def unimod_matrices_to_infty(r, s):
|
|
63
|
+
r"""
|
|
64
|
+
Return a list of matrices whose associated unimodular paths connect `0` to ``r/s``.
|
|
65
|
+
|
|
66
|
+
INPUT:
|
|
67
|
+
|
|
68
|
+
- ``r``, ``s`` -- rational numbers
|
|
69
|
+
|
|
70
|
+
OUTPUT:
|
|
71
|
+
|
|
72
|
+
- a list of matrices in `SL_2(\ZZ)`
|
|
73
|
+
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(19,23); v
|
|
77
|
+
[
|
|
78
|
+
[1 0] [ 0 1] [1 4] [-4 5] [ 5 19]
|
|
79
|
+
[0 1], [-1 1], [1 5], [-5 6], [ 6 23]
|
|
80
|
+
]
|
|
81
|
+
sage: [a.det() for a in v]
|
|
82
|
+
[1, 1, 1, 1, 1]
|
|
83
|
+
|
|
84
|
+
sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(11,25)
|
|
85
|
+
[
|
|
86
|
+
[1 0] [ 0 1] [1 3] [-3 4] [ 4 11]
|
|
87
|
+
[0 1], [-1 2], [2 7], [-7 9], [ 9 25]
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
ALGORITHM:
|
|
92
|
+
|
|
93
|
+
This is Manin's continued fraction trick, which gives an expression
|
|
94
|
+
`\{0,r/s\} = \{0,\infty\} + ... + \{a,b\} + ... + \{*,r/s\}`, where each `\{a,b\}` is
|
|
95
|
+
the image of `\{0,\infty\}` under a matrix in `SL_2(\ZZ)`.
|
|
96
|
+
"""
|
|
97
|
+
if s == 0:
|
|
98
|
+
return []
|
|
99
|
+
# the function contfrac_q in
|
|
100
|
+
# https://github.com/williamstein/psage/blob/master/psage/modform/rational/modular_symbol_map.pyx
|
|
101
|
+
# is very, very relevant to massively optimizing this.
|
|
102
|
+
L = convergents(r / s)
|
|
103
|
+
# Computes the continued fraction convergents of r/s
|
|
104
|
+
v = [M2Z([1, L[0].numerator(), 0, L[0].denominator()])]
|
|
105
|
+
# Initializes the list of matrices
|
|
106
|
+
for j in range(len(L) - 1):
|
|
107
|
+
a = L[j].numerator()
|
|
108
|
+
c = L[j].denominator()
|
|
109
|
+
b = L[j + 1].numerator()
|
|
110
|
+
d = L[j + 1].denominator()
|
|
111
|
+
v.append(M2Z([(-1) ** (j + 1) * a, b, (-1) ** (j + 1) * c, d]))
|
|
112
|
+
# The matrix connecting two consecutive convergents is added on
|
|
113
|
+
return v
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def unimod_matrices_from_infty(r, s):
|
|
117
|
+
r"""
|
|
118
|
+
Return a list of matrices whose associated unimodular paths connect `\infty` to ``r/s``.
|
|
119
|
+
|
|
120
|
+
INPUT:
|
|
121
|
+
|
|
122
|
+
- ``r``, ``s`` -- rational numbers
|
|
123
|
+
|
|
124
|
+
OUTPUT:
|
|
125
|
+
|
|
126
|
+
- a list of `SL_2(\ZZ)` matrices
|
|
127
|
+
|
|
128
|
+
EXAMPLES::
|
|
129
|
+
|
|
130
|
+
sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(19,23); v
|
|
131
|
+
[
|
|
132
|
+
[ 0 1] [-1 0] [-4 1] [-5 -4] [-19 5]
|
|
133
|
+
[-1 0], [-1 -1], [-5 1], [-6 -5], [-23 6]
|
|
134
|
+
]
|
|
135
|
+
sage: [a.det() for a in v]
|
|
136
|
+
[1, 1, 1, 1, 1]
|
|
137
|
+
|
|
138
|
+
sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(11,25)
|
|
139
|
+
[
|
|
140
|
+
[ 0 1] [-1 0] [-3 1] [-4 -3] [-11 4]
|
|
141
|
+
[-1 0], [-2 -1], [-7 2], [-9 -7], [-25 9]
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
ALGORITHM:
|
|
146
|
+
|
|
147
|
+
This is Manin's continued fraction trick, which gives an expression
|
|
148
|
+
`\{\infty,r/s\} = \{\infty,0\} + ... + \{a,b\} + ... + \{*,r/s\}`, where each
|
|
149
|
+
`\{a,b\}` is the image of `\{0,\infty\}` under a matrix in `SL_2(\ZZ)`.
|
|
150
|
+
"""
|
|
151
|
+
if s != 0:
|
|
152
|
+
L = convergents(r / s)
|
|
153
|
+
# Computes the continued fraction convergents of r/s
|
|
154
|
+
v = [M2Z([-L[0].numerator(), 1, -L[0].denominator(), 0])]
|
|
155
|
+
# Initializes the list of matrices
|
|
156
|
+
# the function contfrac_q in https://github.com/williamstein/psage/blob/master/psage/modform/rational/modular_symbol_map.pyx
|
|
157
|
+
# is very, very relevant to massively optimizing this.
|
|
158
|
+
for j in range(len(L) - 1):
|
|
159
|
+
a = L[j].numerator()
|
|
160
|
+
c = L[j].denominator()
|
|
161
|
+
b = L[j + 1].numerator()
|
|
162
|
+
d = L[j + 1].denominator()
|
|
163
|
+
v.append(M2Z([-b, (-1) ** (j + 1) * a, -d, (-1) ** (j + 1) * c]))
|
|
164
|
+
# The matrix connecting two consecutive convergents is added on
|
|
165
|
+
return v
|
|
166
|
+
else:
|
|
167
|
+
return []
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class ManinMap:
|
|
171
|
+
r"""
|
|
172
|
+
Map from a set of right coset representatives of `\Gamma_0(N)` in
|
|
173
|
+
`SL_2(\ZZ)` to a coefficient module that satisfies the Manin
|
|
174
|
+
relations.
|
|
175
|
+
|
|
176
|
+
INPUT:
|
|
177
|
+
|
|
178
|
+
- ``codomain`` -- coefficient module
|
|
179
|
+
- ``manin_relations`` -- a :class:`sage.modular.pollack_stevens.fund_domain.ManinRelations`
|
|
180
|
+
object
|
|
181
|
+
- ``defining_data`` -- dictionary whose keys are a superset of
|
|
182
|
+
``manin_relations.gens()`` and a subset of ``manin_relations.reps()``,
|
|
183
|
+
and whose values are in the codomain
|
|
184
|
+
- ``check`` -- do numerous (slow) checks and transformations to
|
|
185
|
+
ensure that the input data is perfect
|
|
186
|
+
|
|
187
|
+
EXAMPLES::
|
|
188
|
+
|
|
189
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
190
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
191
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
192
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
193
|
+
sage: f = ManinMap(D, manin, data); f # indirect doctest
|
|
194
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
195
|
+
sage: f(M2Z([1,0,0,1]))
|
|
196
|
+
(1 + O(11^2), 2 + O(11))
|
|
197
|
+
"""
|
|
198
|
+
def __init__(self, codomain, manin_relations, defining_data, check=True):
|
|
199
|
+
"""
|
|
200
|
+
INPUT:
|
|
201
|
+
|
|
202
|
+
- ``codomain`` -- coefficient module
|
|
203
|
+
- ``manin_relations`` -- a :class:`ManinRelations` object
|
|
204
|
+
- ``defining_data`` -- dictionary whose keys are a superset of
|
|
205
|
+
:meth:`manin_relations.gens()` and a subset of manin_relations.reps(),
|
|
206
|
+
and whose values are in the codomain
|
|
207
|
+
- ``check`` -- do numerous (slow) checks and transformations to
|
|
208
|
+
ensure that the input data is perfect
|
|
209
|
+
|
|
210
|
+
TESTS:
|
|
211
|
+
|
|
212
|
+
Test that it fails gracefully on some bogus inputs::
|
|
213
|
+
|
|
214
|
+
sage: from sage.modular.pollack_stevens.manin_map import ManinMap
|
|
215
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
216
|
+
sage: rels = ManinRelations(37)
|
|
217
|
+
sage: ManinMap(ZZ, rels, {})
|
|
218
|
+
Traceback (most recent call last):
|
|
219
|
+
...
|
|
220
|
+
ValueError: Codomain must have an action of Sigma0(N)
|
|
221
|
+
sage: ManinMap(Symk(0), rels, [])
|
|
222
|
+
Traceback (most recent call last):
|
|
223
|
+
...
|
|
224
|
+
ValueError: length of defining data must be the same as number of Manin generators
|
|
225
|
+
"""
|
|
226
|
+
self._codomain = codomain
|
|
227
|
+
self._manin = manin_relations
|
|
228
|
+
if check:
|
|
229
|
+
if coercion_model.get_action(codomain, Sigma0(manin_relations._N)) is None:
|
|
230
|
+
raise ValueError("Codomain must have an action of Sigma0(N)")
|
|
231
|
+
self._dict = {}
|
|
232
|
+
if isinstance(defining_data, (list, tuple)):
|
|
233
|
+
if len(defining_data) != manin_relations.ngens():
|
|
234
|
+
raise ValueError("length of defining data must be the same as number of Manin generators")
|
|
235
|
+
for i in range(len(defining_data)):
|
|
236
|
+
self._dict[manin_relations.gen(i)] = codomain(defining_data[i])
|
|
237
|
+
elif isinstance(defining_data, dict):
|
|
238
|
+
for g in manin_relations.gens():
|
|
239
|
+
self._dict[g] = codomain(defining_data[g])
|
|
240
|
+
else:
|
|
241
|
+
# constant function
|
|
242
|
+
try:
|
|
243
|
+
c = codomain(defining_data)
|
|
244
|
+
except TypeError:
|
|
245
|
+
raise TypeError("unrecognized type %s for defining_data" % type(defining_data))
|
|
246
|
+
g = manin_relations.gens()
|
|
247
|
+
self._dict = dict(zip(g, [c] * len(g)))
|
|
248
|
+
else:
|
|
249
|
+
self._dict = defining_data
|
|
250
|
+
|
|
251
|
+
def extend_codomain(self, new_codomain, check=True):
|
|
252
|
+
r"""
|
|
253
|
+
Extend the codomain of ``self`` to ``new_codomain``. There must be a
|
|
254
|
+
valid conversion operation from the old to the new codomain. This is
|
|
255
|
+
most often used for extension of scalars from `\QQ` to `\QQ_p`.
|
|
256
|
+
|
|
257
|
+
EXAMPLES::
|
|
258
|
+
|
|
259
|
+
sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z
|
|
260
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
261
|
+
sage: S = Symk(0,QQ)
|
|
262
|
+
sage: MR = ManinRelations(37)
|
|
263
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
264
|
+
sage: m = ManinMap(S, MR, data); m
|
|
265
|
+
Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q^2
|
|
266
|
+
sage: m.extend_codomain(Symk(0, Qp(11)))
|
|
267
|
+
Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q_11^2
|
|
268
|
+
"""
|
|
269
|
+
new_dict = {}
|
|
270
|
+
for g in self._manin.gens():
|
|
271
|
+
new_dict[g] = new_codomain(self._dict[g])
|
|
272
|
+
return ManinMap(new_codomain, self._manin, new_dict, check)
|
|
273
|
+
|
|
274
|
+
def _compute_image_from_gens(self, B):
|
|
275
|
+
r"""
|
|
276
|
+
Compute the image of ``B`` under ``self``.
|
|
277
|
+
|
|
278
|
+
INPUT:
|
|
279
|
+
|
|
280
|
+
- ``B`` -- generator of Manin relations
|
|
281
|
+
|
|
282
|
+
OUTPUT:
|
|
283
|
+
|
|
284
|
+
An element in the codomain of ``self`` (e.g. a distribution), the image
|
|
285
|
+
of ``B`` under ``self``.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
290
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
291
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
292
|
+
sage: MR = ManinRelations(11)
|
|
293
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
294
|
+
sage: f = ManinMap(D, MR, data)
|
|
295
|
+
sage: f._compute_image_from_gens(MR.reps()[1])
|
|
296
|
+
(10 + 10*11 + O(11^2), 8 + O(11))
|
|
297
|
+
"""
|
|
298
|
+
L = self._manin.relations(B)
|
|
299
|
+
# could raise KeyError if B is not a generator
|
|
300
|
+
t = self._codomain(0)
|
|
301
|
+
for c, A, g in L:
|
|
302
|
+
g1 = self._dict[self._manin.reps(g)] * A
|
|
303
|
+
t += g1 * c
|
|
304
|
+
return t.normalize()
|
|
305
|
+
|
|
306
|
+
def __getitem__(self, B):
|
|
307
|
+
r"""
|
|
308
|
+
|
|
309
|
+
Compute the image of ``B`` under ``self``.
|
|
310
|
+
|
|
311
|
+
INPUT:
|
|
312
|
+
|
|
313
|
+
- ``B`` -- coset representative of Manin relations
|
|
314
|
+
|
|
315
|
+
OUTPUT:
|
|
316
|
+
|
|
317
|
+
An element in the codomain of ``self`` (e.g. a distribution), the image
|
|
318
|
+
of ``B`` under ``self``.
|
|
319
|
+
|
|
320
|
+
EXAMPLES::
|
|
321
|
+
|
|
322
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
323
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
324
|
+
sage: S = Symk(0,QQ)
|
|
325
|
+
sage: MR = ManinRelations(37); MR.gens()
|
|
326
|
+
(
|
|
327
|
+
[1 0] [ 0 -1] [-1 -1] [-1 -2] [-2 -3] [-3 -1] [-1 -4] [-4 -3]
|
|
328
|
+
[0 1], [ 1 4], [ 4 3], [ 3 5], [ 5 7], [ 7 2], [ 2 7], [ 7 5],
|
|
329
|
+
<BLANKLINE>
|
|
330
|
+
[-2 -3]
|
|
331
|
+
[ 3 4]
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
335
|
+
sage: D = OverconvergentDistributions(2, 37, 40)
|
|
336
|
+
sage: f = ManinMap(D, MR, data)
|
|
337
|
+
sage: f.__getitem__(MR.gens()[1])
|
|
338
|
+
1 + O(37)
|
|
339
|
+
sage: f.__getitem__(MR.gens()[3])
|
|
340
|
+
O(37^40)
|
|
341
|
+
sage: f.__getitem__(MR.gens()[5])
|
|
342
|
+
36 + O(37)
|
|
343
|
+
sage: f[MR.gens()[5]]
|
|
344
|
+
36 + O(37)
|
|
345
|
+
"""
|
|
346
|
+
try:
|
|
347
|
+
return self._dict[B]
|
|
348
|
+
except KeyError:
|
|
349
|
+
# To prevent memory overflow
|
|
350
|
+
return self._compute_image_from_gens(B)
|
|
351
|
+
# self._dict[B] = self._compute_image_from_gens(B)
|
|
352
|
+
# return self._dict[B]
|
|
353
|
+
|
|
354
|
+
def compute_full_data(self):
|
|
355
|
+
r"""
|
|
356
|
+
Compute the values of ``self`` on all coset reps from its values on our
|
|
357
|
+
generating set.
|
|
358
|
+
|
|
359
|
+
EXAMPLES::
|
|
360
|
+
|
|
361
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
362
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
363
|
+
sage: S = Symk(0,QQ)
|
|
364
|
+
sage: MR = ManinRelations(37); MR.gens()
|
|
365
|
+
(
|
|
366
|
+
[1 0] [ 0 -1] [-1 -1] [-1 -2] [-2 -3] [-3 -1] [-1 -4] [-4 -3]
|
|
367
|
+
[0 1], [ 1 4], [ 4 3], [ 3 5], [ 5 7], [ 7 2], [ 2 7], [ 7 5],
|
|
368
|
+
<BLANKLINE>
|
|
369
|
+
[-2 -3]
|
|
370
|
+
[ 3 4]
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
374
|
+
sage: f = ManinMap(S,MR,data)
|
|
375
|
+
sage: len(f._dict)
|
|
376
|
+
9
|
|
377
|
+
sage: f.compute_full_data()
|
|
378
|
+
sage: len(f._dict)
|
|
379
|
+
38
|
|
380
|
+
"""
|
|
381
|
+
for B in self._manin.reps():
|
|
382
|
+
if B not in self._dict:
|
|
383
|
+
self._dict[B] = self._compute_image_from_gens(B)
|
|
384
|
+
|
|
385
|
+
def __add__(self, right):
|
|
386
|
+
r"""
|
|
387
|
+
Return sum ``self + right``, where ``self`` and ``right`` are
|
|
388
|
+
assumed to have identical codomains and Manin relations.
|
|
389
|
+
|
|
390
|
+
INPUT:
|
|
391
|
+
|
|
392
|
+
- ``self``, ``right`` -- two Manin maps with the same codomain and
|
|
393
|
+
Manin relations
|
|
394
|
+
|
|
395
|
+
OUTPUT: the sum of ``self`` and ``right`` -- a Manin map
|
|
396
|
+
|
|
397
|
+
EXAMPLES::
|
|
398
|
+
|
|
399
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
400
|
+
sage: D = OverconvergentDistributions(0, 11, 10); D
|
|
401
|
+
Space of 11-adic distributions with k=0 action and precision cap 10
|
|
402
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
403
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
404
|
+
sage: f = ManinMap(D, manin, data); f
|
|
405
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
406
|
+
sage: f(M2Z([1,0,0,1]))
|
|
407
|
+
(1 + O(11^2), 2 + O(11))
|
|
408
|
+
sage: f+f # indirect doctest
|
|
409
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
410
|
+
sage: (f+f)(M2Z([1,0,0,1]))
|
|
411
|
+
(2 + O(11^2), 4 + O(11))
|
|
412
|
+
"""
|
|
413
|
+
D = {}
|
|
414
|
+
sd = self._dict
|
|
415
|
+
rd = right._dict
|
|
416
|
+
for ky, val in sd.items():
|
|
417
|
+
if ky in rd:
|
|
418
|
+
D[ky] = val + rd[ky]
|
|
419
|
+
return self.__class__(self._codomain, self._manin, D, check=False)
|
|
420
|
+
|
|
421
|
+
def __sub__(self, right):
|
|
422
|
+
"""
|
|
423
|
+
Return difference ``self`` - right, where ``self`` and ``right`` are
|
|
424
|
+
assumed to have identical codomains and Manin relations.
|
|
425
|
+
|
|
426
|
+
INPUT:
|
|
427
|
+
|
|
428
|
+
- ``self``, ``right`` -- two Manin maps with the same codomain and
|
|
429
|
+
Manin relations
|
|
430
|
+
|
|
431
|
+
OUTPUT: the difference of ``self`` and ``right`` -- a Manin map
|
|
432
|
+
|
|
433
|
+
EXAMPLES::
|
|
434
|
+
|
|
435
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
436
|
+
sage: D = OverconvergentDistributions(0, 11, 10); D
|
|
437
|
+
Space of 11-adic distributions with k=0 action and precision cap 10
|
|
438
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
439
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
440
|
+
sage: f = ManinMap(D, manin, data); f
|
|
441
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
442
|
+
sage: f(M2Z([1,0,0,1]))
|
|
443
|
+
(1 + O(11^2), 2 + O(11))
|
|
444
|
+
sage: f-f
|
|
445
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
446
|
+
sage: (f-f)(M2Z([1,0,0,1]))
|
|
447
|
+
(O(11^2), O(11))
|
|
448
|
+
"""
|
|
449
|
+
D = {}
|
|
450
|
+
sd = self._dict
|
|
451
|
+
rd = right._dict
|
|
452
|
+
for ky, val in sd.items():
|
|
453
|
+
if ky in rd:
|
|
454
|
+
D[ky] = val - rd[ky]
|
|
455
|
+
return self.__class__(self._codomain, self._manin, D, check=False)
|
|
456
|
+
|
|
457
|
+
def __mul__(self, right):
|
|
458
|
+
"""
|
|
459
|
+
Return scalar multiplication ``self * right``, where ``right`` is in
|
|
460
|
+
the base ring of the codomain.
|
|
461
|
+
|
|
462
|
+
INPUT:
|
|
463
|
+
|
|
464
|
+
- ``self`` -- a Manin map
|
|
465
|
+
- ``right`` -- an element of the base ring of the codomain of self
|
|
466
|
+
|
|
467
|
+
OUTPUT: the sum ``self`` and ``right`` -- a Manin map
|
|
468
|
+
|
|
469
|
+
EXAMPLES::
|
|
470
|
+
|
|
471
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
472
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
473
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
474
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
475
|
+
sage: f = ManinMap(D, manin, data)
|
|
476
|
+
sage: f(M2Z([1,0,0,1]))
|
|
477
|
+
(1 + O(11^2), 2 + O(11))
|
|
478
|
+
sage: f*2
|
|
479
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
480
|
+
sage: (f*2)(M2Z([1,0,0,1]))
|
|
481
|
+
(2 + O(11^2), 4 + O(11))
|
|
482
|
+
"""
|
|
483
|
+
tp = Sigma0(self._manin.level())(MatrixSpace(ZZ, 2, 2)([1, 0, 0, 1]))
|
|
484
|
+
if isinstance(right, type(tp)):
|
|
485
|
+
return self._right_action(right)
|
|
486
|
+
|
|
487
|
+
D = {}
|
|
488
|
+
for ky, val in self._dict.items():
|
|
489
|
+
D[ky] = val * right
|
|
490
|
+
return self.__class__(self._codomain, self._manin, D, check=False)
|
|
491
|
+
|
|
492
|
+
def __repr__(self):
|
|
493
|
+
"""
|
|
494
|
+
Return string representation of ``self``.
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
499
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
500
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
501
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
502
|
+
sage: f = ManinMap(D, manin, data)
|
|
503
|
+
sage: f.__repr__()
|
|
504
|
+
'Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10'
|
|
505
|
+
"""
|
|
506
|
+
return "Map from the set of right cosets of Gamma0(%s) in SL_2(Z) to %s" % (self._manin.level(), self._codomain)
|
|
507
|
+
|
|
508
|
+
def _eval_sl2(self, A):
|
|
509
|
+
r"""
|
|
510
|
+
Return the value of ``self`` on the unimodular divisor corresponding to `A`.
|
|
511
|
+
|
|
512
|
+
Note that `A` must be in `SL_2(Z)` for this to work.
|
|
513
|
+
|
|
514
|
+
INPUT:
|
|
515
|
+
|
|
516
|
+
- ``A`` -- an element of `SL_2(Z)`
|
|
517
|
+
|
|
518
|
+
OUTPUT:
|
|
519
|
+
|
|
520
|
+
The value of ``self`` on the divisor corresponding to `A` -- i.e. on
|
|
521
|
+
the divisor `\{A(0)\} - \{A(\infty)\}`.
|
|
522
|
+
|
|
523
|
+
EXAMPLES::
|
|
524
|
+
|
|
525
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
526
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
527
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
528
|
+
sage: MR = ManinRelations(11)
|
|
529
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
530
|
+
sage: f = ManinMap(D, MR, data)
|
|
531
|
+
sage: A = MR.reps()[1]
|
|
532
|
+
sage: f._eval_sl2(A)
|
|
533
|
+
(10 + 10*11 + O(11^2), 8 + O(11))
|
|
534
|
+
"""
|
|
535
|
+
SN = Sigma0(self._manin._N)
|
|
536
|
+
A = M2Z(A)
|
|
537
|
+
B = self._manin.equivalent_rep(A)
|
|
538
|
+
gaminv = SN(B * M2Z(A).adjugate())
|
|
539
|
+
return (self[B] * gaminv).normalize()
|
|
540
|
+
|
|
541
|
+
def __call__(self, A):
|
|
542
|
+
"""
|
|
543
|
+
Evaluate ``self`` at A.
|
|
544
|
+
|
|
545
|
+
INPUT:
|
|
546
|
+
|
|
547
|
+
- ``A`` -- a `2 \times 2` matrix
|
|
548
|
+
|
|
549
|
+
OUTPUT: the value of ``self`` on the divisor corresponding to ``A`` --
|
|
550
|
+
an element of the codomain of self
|
|
551
|
+
|
|
552
|
+
EXAMPLES::
|
|
553
|
+
|
|
554
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
555
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
556
|
+
sage: D = OverconvergentDistributions(0, 11, 10); D
|
|
557
|
+
Space of 11-adic distributions with k=0 action and precision cap 10
|
|
558
|
+
sage: manin = ManinRelations(11)
|
|
559
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
560
|
+
sage: f = ManinMap(D, manin, data); f
|
|
561
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
|
|
562
|
+
sage: f(M2Z([1,0,0,1]))
|
|
563
|
+
(1 + O(11^2), 2 + O(11))
|
|
564
|
+
|
|
565
|
+
sage: S = Symk(0,QQ)
|
|
566
|
+
sage: MR = ManinRelations(37)
|
|
567
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
568
|
+
sage: f = ManinMap(S,MR,data)
|
|
569
|
+
sage: f(M2Z([2,3,4,5]))
|
|
570
|
+
1
|
|
571
|
+
"""
|
|
572
|
+
a = A[t00]
|
|
573
|
+
b = A[t01]
|
|
574
|
+
c = A[t10]
|
|
575
|
+
d = A[t11]
|
|
576
|
+
# v1: a list of unimodular matrices whose divisors add up to {b/d} - {infty}
|
|
577
|
+
v1 = unimod_matrices_to_infty(b, d)
|
|
578
|
+
# v2: a list of unimodular matrices whose divisors add up to {a/c} - {infty}
|
|
579
|
+
v2 = unimod_matrices_to_infty(a, c)
|
|
580
|
+
# ans: the value of self on A
|
|
581
|
+
ans = self._codomain(0)
|
|
582
|
+
# This loop computes self({b/d}-{infty}) by adding up the values of self on elements of v1
|
|
583
|
+
for B in v1:
|
|
584
|
+
ans = ans + self._eval_sl2(B)
|
|
585
|
+
|
|
586
|
+
# This loops subtracts away the value self({a/c}-{infty}) from ans by subtracting away the values of self on elements of v2
|
|
587
|
+
# and so in the end ans becomes self({b/d}-{a/c}) = self({A(0)} - {A(infty)}
|
|
588
|
+
for B in v2:
|
|
589
|
+
ans = ans - self._eval_sl2(B)
|
|
590
|
+
return ans.normalize()
|
|
591
|
+
|
|
592
|
+
def apply(self, f, codomain=None, to_moments=False):
|
|
593
|
+
r"""
|
|
594
|
+
Return Manin map given by `x \mapsto f(self(x))`, where `f` is
|
|
595
|
+
anything that can be called with elements of the coefficient
|
|
596
|
+
module.
|
|
597
|
+
|
|
598
|
+
This might be used to normalize, reduce modulo a prime, change
|
|
599
|
+
base ring, etc.
|
|
600
|
+
|
|
601
|
+
INPUT:
|
|
602
|
+
|
|
603
|
+
- ``f`` -- anything that can be called with elements of the coefficient
|
|
604
|
+
module
|
|
605
|
+
- ``codomain`` -- (default: ``None``) the codomain of the return map
|
|
606
|
+
- ``to_moments`` -- boolean (default: ``False``); if ``True``, will
|
|
607
|
+
apply ``f`` to each of the moments instead
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
612
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
613
|
+
sage: S = Symk(0,QQ)
|
|
614
|
+
sage: MR = ManinRelations(37)
|
|
615
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
616
|
+
sage: f = ManinMap(S,MR,data)
|
|
617
|
+
sage: list(f.apply(lambda t:2*t))
|
|
618
|
+
[0, 2, 0, 0, 0, -2, 2, 0, 0]
|
|
619
|
+
"""
|
|
620
|
+
D = {}
|
|
621
|
+
sd = self._dict
|
|
622
|
+
if codomain is None:
|
|
623
|
+
codomain = self._codomain
|
|
624
|
+
for ky, val in sd.items():
|
|
625
|
+
if to_moments:
|
|
626
|
+
D[ky] = codomain([f(val.moment(a))
|
|
627
|
+
for a in range(val.precision_absolute())])
|
|
628
|
+
else:
|
|
629
|
+
D[ky] = f(val)
|
|
630
|
+
return self.__class__(codomain, self._manin, D, check=False)
|
|
631
|
+
|
|
632
|
+
def __iter__(self):
|
|
633
|
+
r"""
|
|
634
|
+
Return iterator over the values of this map on the reduced
|
|
635
|
+
representatives.
|
|
636
|
+
|
|
637
|
+
This might be used to compute the valuation.
|
|
638
|
+
|
|
639
|
+
EXAMPLES::
|
|
640
|
+
|
|
641
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
642
|
+
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
|
|
643
|
+
sage: S = Symk(0,QQ)
|
|
644
|
+
sage: MR = ManinRelations(37)
|
|
645
|
+
sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
|
|
646
|
+
sage: f = ManinMap(S,MR,data)
|
|
647
|
+
sage: [a for a in f]
|
|
648
|
+
[0, 1, 0, 0, 0, -1, 1, 0, 0]
|
|
649
|
+
"""
|
|
650
|
+
for A in self._manin.gens():
|
|
651
|
+
yield self._dict[A]
|
|
652
|
+
|
|
653
|
+
def _right_action(self, gamma):
|
|
654
|
+
r"""
|
|
655
|
+
Return `self | \gamma`, where `\gamma` is a `2 \times 2` integer matrix.
|
|
656
|
+
|
|
657
|
+
The action is defined by `(self | \gamma)(D) = self(\gamma D)|\gamma`
|
|
658
|
+
|
|
659
|
+
For the action by a single element `\gamma` to be a modular symbol, `\gamma`
|
|
660
|
+
must normalize `\Gamma_0(N)`. However, this right action
|
|
661
|
+
can also be used to define Hecke operators, in which case each
|
|
662
|
+
individual `self | \gamma` is not a modular symbol on `\Gamma_0(N)`, but
|
|
663
|
+
the sum over acting by the appropriate double coset representatives is.
|
|
664
|
+
|
|
665
|
+
INPUT:
|
|
666
|
+
|
|
667
|
+
- ``gamma`` -- `2 \times 2` integer matrix of nonzero determinant, with a
|
|
668
|
+
well-defined action on the coefficient module
|
|
669
|
+
|
|
670
|
+
OUTPUT: the image of ``self`` under the action of `\gamma` -- a Manin map
|
|
671
|
+
|
|
672
|
+
EXAMPLES::
|
|
673
|
+
|
|
674
|
+
sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z, Sigma0
|
|
675
|
+
sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
|
|
676
|
+
sage: S01 = Sigma0(1)
|
|
677
|
+
sage: f = Newforms(7, 4)[0]
|
|
678
|
+
sage: f.modular_symbols(1)
|
|
679
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 3 for Gamma_0(7) of weight 4 with sign 1 over Rational Field
|
|
680
|
+
sage: phi = ps_modsym_from_simple_modsym_space(f.modular_symbols(1))._map
|
|
681
|
+
sage: psi = phi._right_action(S01([2,3,4,5])); psi
|
|
682
|
+
Map from the set of right cosets of Gamma0(7) in SL_2(Z) to Sym^2 Q^2
|
|
683
|
+
|
|
684
|
+
sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
|
|
685
|
+
sage: M = ModularSymbols(17,4,1).cuspidal_subspace()
|
|
686
|
+
sage: A = M.decomposition()
|
|
687
|
+
sage: f = ps_modsym_from_simple_modsym_space(A[0])._map
|
|
688
|
+
sage: g = f._right_action(S01([1,2,0,1]))
|
|
689
|
+
sage: g
|
|
690
|
+
Map from the set of right cosets of Gamma0(17) in SL_2(Z) to Sym^2 Q^2
|
|
691
|
+
sage: x = sage.modular.pollack_stevens.fund_domain.M2Z([2,3,1,0])
|
|
692
|
+
sage: g(x)
|
|
693
|
+
(17, -34, 69)
|
|
694
|
+
"""
|
|
695
|
+
D = {}
|
|
696
|
+
# we should eventually replace the for loop with a call to apply_many
|
|
697
|
+
for ky in self._dict:
|
|
698
|
+
D[ky] = self(gamma * ky) * gamma
|
|
699
|
+
return self.__class__(self._codomain, self._manin, D, check=False)
|
|
700
|
+
|
|
701
|
+
def normalize(self) -> Self:
|
|
702
|
+
r"""
|
|
703
|
+
Normalize every value of ``self`` -- e.g., reduce each value's
|
|
704
|
+
`j`-th moment modulo `p^{N-j}`.
|
|
705
|
+
|
|
706
|
+
EXAMPLES::
|
|
707
|
+
|
|
708
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
709
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
710
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
711
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
712
|
+
sage: f = ManinMap(D, manin, data)
|
|
713
|
+
sage: f._dict[M2Z([1,0,0,1])]
|
|
714
|
+
(1 + O(11^2), 2 + O(11))
|
|
715
|
+
sage: g = f.normalize()
|
|
716
|
+
sage: g._dict[M2Z([1,0,0,1])]
|
|
717
|
+
(1 + O(11^2), 2 + O(11))
|
|
718
|
+
"""
|
|
719
|
+
sd = self._dict
|
|
720
|
+
for val in sd.values():
|
|
721
|
+
val.normalize()
|
|
722
|
+
return self
|
|
723
|
+
|
|
724
|
+
def reduce_precision(self, M):
|
|
725
|
+
r"""
|
|
726
|
+
Reduce the precision of all the values of the Manin map.
|
|
727
|
+
|
|
728
|
+
INPUT:
|
|
729
|
+
|
|
730
|
+
- ``M`` -- integer; the new precision
|
|
731
|
+
|
|
732
|
+
EXAMPLES::
|
|
733
|
+
|
|
734
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
735
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
736
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
737
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
738
|
+
sage: f = ManinMap(D, manin, data)
|
|
739
|
+
sage: f._dict[M2Z([1,0,0,1])]
|
|
740
|
+
(1 + O(11^2), 2 + O(11))
|
|
741
|
+
sage: g = f.reduce_precision(1)
|
|
742
|
+
sage: g._dict[M2Z([1,0,0,1])]
|
|
743
|
+
1 + O(11^2)
|
|
744
|
+
"""
|
|
745
|
+
D = {}
|
|
746
|
+
for ky, val in self._dict.items():
|
|
747
|
+
D[ky] = val.reduce_precision(M)
|
|
748
|
+
return self.__class__(self._codomain, self._manin, D, check=False)
|
|
749
|
+
|
|
750
|
+
def specialize(self, *args):
|
|
751
|
+
r"""
|
|
752
|
+
Specialize all the values of the Manin map to a new coefficient
|
|
753
|
+
module. Assumes that the codomain has a ``specialize`` method, and
|
|
754
|
+
passes all its arguments to that method.
|
|
755
|
+
|
|
756
|
+
EXAMPLES::
|
|
757
|
+
|
|
758
|
+
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
|
|
759
|
+
sage: D = OverconvergentDistributions(0, 11, 10)
|
|
760
|
+
sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
|
|
761
|
+
sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
|
|
762
|
+
sage: f = ManinMap(D, manin, data)
|
|
763
|
+
sage: g = f.specialize()
|
|
764
|
+
sage: g._codomain
|
|
765
|
+
Sym^0 Z_11^2
|
|
766
|
+
"""
|
|
767
|
+
D = {}
|
|
768
|
+
for ky, val in self._dict.items():
|
|
769
|
+
D[ky] = val.specialize(*args)
|
|
770
|
+
return self.__class__(self._codomain.specialize(*args), self._manin,
|
|
771
|
+
D, check=False)
|
|
772
|
+
|
|
773
|
+
def hecke(self, ell, algorithm='prep'):
|
|
774
|
+
r"""
|
|
775
|
+
Return the image of this Manin map under the Hecke operator `T_{\ell}`.
|
|
776
|
+
|
|
777
|
+
INPUT:
|
|
778
|
+
|
|
779
|
+
- ``ell`` -- a prime
|
|
780
|
+
|
|
781
|
+
- ``algorithm`` -- string; either ``'prep'`` (default) or ``'naive'``
|
|
782
|
+
|
|
783
|
+
OUTPUT: the image of this ManinMap under the Hecke operator `T_{\ell}`
|
|
784
|
+
|
|
785
|
+
EXAMPLES::
|
|
786
|
+
|
|
787
|
+
sage: # needs eclib
|
|
788
|
+
sage: E = EllipticCurve('11a')
|
|
789
|
+
sage: phi = E.pollack_stevens_modular_symbol()
|
|
790
|
+
sage: phi.values()
|
|
791
|
+
[-1/5, 1, 0]
|
|
792
|
+
sage: phi.is_Tq_eigensymbol(7,7,10)
|
|
793
|
+
True
|
|
794
|
+
sage: phi.hecke(7).values()
|
|
795
|
+
[2/5, -2, 0]
|
|
796
|
+
sage: phi.Tq_eigenvalue(7,7,10)
|
|
797
|
+
-2
|
|
798
|
+
"""
|
|
799
|
+
self.compute_full_data()
|
|
800
|
+
self.normalize()
|
|
801
|
+
M = self._manin
|
|
802
|
+
|
|
803
|
+
if algorithm == 'prep':
|
|
804
|
+
# psi will denote self | T_ell
|
|
805
|
+
psi = {}
|
|
806
|
+
for g in M.gens():
|
|
807
|
+
psi_g = sum((self[h] * A for h, A in M.prep_hecke_on_gen_list(ell, g)), self._codomain(0))
|
|
808
|
+
psi_g.normalize()
|
|
809
|
+
psi[g] = psi_g
|
|
810
|
+
return self.__class__(self._codomain, self._manin,
|
|
811
|
+
psi, check=False).normalize()
|
|
812
|
+
elif algorithm == 'naive':
|
|
813
|
+
S0N = Sigma0(self._manin.level())
|
|
814
|
+
psi = self._right_action(S0N([1, 0, 0, ell]))
|
|
815
|
+
for a in range(1, ell):
|
|
816
|
+
psi += self._right_action(S0N([1, a, 0, ell]))
|
|
817
|
+
if self._manin.level() % ell != 0:
|
|
818
|
+
psi += self._right_action(S0N([ell, 0, 0, 1]))
|
|
819
|
+
return psi.normalize()
|
|
820
|
+
else:
|
|
821
|
+
raise ValueError('Algorithm must be either "naive" or "prep"')
|
|
822
|
+
|
|
823
|
+
def p_stabilize(self, p, alpha, V):
|
|
824
|
+
r"""
|
|
825
|
+
Return the `p`-stabilization of ``self`` to level `N*p` on which
|
|
826
|
+
`U_p` acts by `\alpha`.
|
|
827
|
+
|
|
828
|
+
INPUT:
|
|
829
|
+
|
|
830
|
+
- ``p`` -- a prime
|
|
831
|
+
|
|
832
|
+
- ``alpha`` -- a `U_p`-eigenvalue
|
|
833
|
+
|
|
834
|
+
- ``V`` -- a space of modular symbols
|
|
835
|
+
|
|
836
|
+
OUTPUT: the image of this ManinMap under the Hecke operator `T_{\ell}`
|
|
837
|
+
|
|
838
|
+
EXAMPLES::
|
|
839
|
+
|
|
840
|
+
sage: # needs eclib
|
|
841
|
+
sage: E = EllipticCurve('11a')
|
|
842
|
+
sage: phi = E.pollack_stevens_modular_symbol()
|
|
843
|
+
sage: f = phi._map
|
|
844
|
+
sage: V = phi.parent()
|
|
845
|
+
sage: f.p_stabilize(5,1,V)
|
|
846
|
+
Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Sym^0 Q^2
|
|
847
|
+
"""
|
|
848
|
+
manin = V.source()
|
|
849
|
+
S0 = Sigma0(self._codomain._act._Np)
|
|
850
|
+
pmat = S0([p, 0, 0, 1])
|
|
851
|
+
D = {}
|
|
852
|
+
scalar = 1 / alpha
|
|
853
|
+
W = self._codomain.change_ring(scalar.parent())
|
|
854
|
+
for g in map(M2Z, manin.gens()):
|
|
855
|
+
# we use scale here so that we do not need to define a
|
|
856
|
+
# construction functor in order to scale by something
|
|
857
|
+
# outside the base ring.
|
|
858
|
+
D[g] = W(self._eval_sl2(g) - (self(pmat * g) * pmat).scale(scalar))
|
|
859
|
+
return self.__class__(W, manin, D, check=False)
|