Manin map¶
Represents maps from a set of right coset representatives to a coefficient module.
This is a basic building block for implementing modular symbols, and provides basic arithmetic and right action of matrices.
EXAMPLES:
sage: E = EllipticCurve('11a')
sage: phi = E.pollack_stevens_modular_symbol()
sage: phi
Modular symbol of level 11 with values in Sym^0 Q^2
sage: phi.values()
[-1/5, 1, 0]
sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z
sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
sage: D = OverconvergentDistributions(0, 11, 10)
sage: MR = ManinRelations(11)
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])}
sage: f = ManinMap(D, MR, data)
sage: f(M2Z([1,0,0,1]))
(1 + O(11^2), 2 + O(11))
sage: S = Symk(0,QQ)
sage: MR = ManinRelations(37)
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)}
sage: f = ManinMap(S,MR,data)
sage: f(M2Z([2,3,4,5]))
1
-
class
sage.modular.pollack_stevens.manin_map.
ManinMap
(codomain, manin_relations, defining_data, check=True)¶ Bases:
object
Map from a set of right coset representatives of \(\Gamma_0(N)\) in \(SL_2(\ZZ)\) to a coefficient module that satisfies the Manin relations.
INPUT:
codomain
– coefficient modulemanin_relations
– asage.modular.pollack_stevens.fund_domain.ManinRelations
objectdefining_data
– a dictionary whose keys are a superset ofmanin_relations.gens()
and a subset ofmanin_relations.reps()
, and whose values are in the codomain.check
– do numerous (slow) checks and transformations to ensure that the input data is perfect.
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: D = OverconvergentDistributions(0, 11, 10) sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11) 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])} sage: f = ManinMap(D, manin, data); f # indirect doctest 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 sage: f(M2Z([1,0,0,1])) (1 + O(11^2), 2 + O(11))
-
apply
(f, codomain=None, to_moments=False)¶ Return Manin map given by \(x \mapsto f(self(x))\), where \(f\) is anything that can be called with elements of the coefficient module.
This might be used to normalize, reduce modulo a prime, change base ring, etc.
INPUT:
f
– anything that can be called with elements of the coefficient modulecodomain
– (default: None) the codomain of the return mapto_moments
– (default: False) if True, will applyf
to each of the moments instead
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: S = Symk(0,QQ) sage: MR = ManinRelations(37) 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)} sage: f = ManinMap(S,MR,data) sage: list(f.apply(lambda t:2*t)) [0, 2, 0, 0, 0, -2, 2, 0, 0]
-
compute_full_data
()¶ Compute the values of self on all coset reps from its values on our generating set.
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: S = Symk(0,QQ) sage: MR = ManinRelations(37); MR.gens() [ [1 0] [ 0 -1] [-1 -1] [-1 -2] [-2 -3] [-3 -1] [-1 -4] [-4 -3] [0 1], [ 1 4], [ 4 3], [ 3 5], [ 5 7], [ 7 2], [ 2 7], [ 7 5], [-2 -3] [ 3 4] ] 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)} sage: f = ManinMap(S,MR,data) sage: len(f._dict) 9 sage: f.compute_full_data() sage: len(f._dict) 38
-
extend_codomain
(new_codomain, check=True)¶ Extend the codomain of self to new_codomain. There must be a valid conversion operation from the old to the new codomain. This is most often used for extension of scalars from \(\QQ\) to \(\QQ_p\).
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations sage: S = Symk(0,QQ) sage: MR = ManinRelations(37) 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)} sage: m = ManinMap(S, MR, data); m Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q^2 sage: m.extend_codomain(Symk(0, Qp(11))) Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q_11^2
-
hecke
(ell, algorithm='prep')¶ Return the image of this Manin map under the Hecke operator \(T_{\ell}\).
INPUT:
ell
– a primealgorithm
– a string, either ‘prep’ (default) or ‘naive’
OUTPUT:
- The image of this ManinMap under the Hecke operator \(T_{\ell}\)
EXAMPLES:
sage: E = EllipticCurve('11a') sage: phi = E.pollack_stevens_modular_symbol() sage: phi.values() [-1/5, 1, 0] sage: phi.is_Tq_eigensymbol(7,7,10) True sage: phi.hecke(7).values() [2/5, -2, 0] sage: phi.Tq_eigenvalue(7,7,10) -2
-
normalize
()¶ Normalize every value of self – e.g., reduces each value’s \(j\)-th moment modulo \(p^{N-j}\)
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: D = OverconvergentDistributions(0, 11, 10) sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11) 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])} sage: f = ManinMap(D, manin, data) sage: f._dict[M2Z([1,0,0,1])] (1 + O(11^2), 2 + O(11)) sage: g = f.normalize() sage: g._dict[M2Z([1,0,0,1])] (1 + O(11^2), 2 + O(11))
-
p_stabilize
(p, alpha, V)¶ Return the \(p\)-stabilization of self to level \(N*p\) on which \(U_p\) acts by \(\alpha\).
INPUT:
p
– a prime.alpha
– a \(U_p\)-eigenvalue.V
– a space of modular symbols.
OUTPUT:
- The image of this ManinMap under the Hecke operator \(T_{\ell}\)
EXAMPLES:
sage: E = EllipticCurve('11a') sage: phi = E.pollack_stevens_modular_symbol() sage: f = phi._map sage: V = phi.parent() sage: f.p_stabilize(5,1,V) Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Sym^0 Q^2
-
reduce_precision
(M)¶ Reduce the precision of all the values of the Manin map.
INPUT:
M
– an integer, the new precision.
EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: D = OverconvergentDistributions(0, 11, 10) sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11) 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])} sage: f = ManinMap(D, manin, data) sage: f._dict[M2Z([1,0,0,1])] (1 + O(11^2), 2 + O(11)) sage: g = f.reduce_precision(1) sage: g._dict[M2Z([1,0,0,1])] 1 + O(11^2)
-
specialize
(*args)¶ Specialize all the values of the Manin map to a new coefficient module. Assumes that the codomain has a
specialize
method, and passes all its arguments to that method.EXAMPLES:
sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap sage: D = OverconvergentDistributions(0, 11, 10) sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11) 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])} sage: f = ManinMap(D, manin, data) sage: g = f.specialize() sage: g._codomain Sym^0 Z_11^2
-
sage.modular.pollack_stevens.manin_map.
unimod_matrices_from_infty
(r, s)¶ Return a list of matrices whose associated unimodular paths connect \(\infty\) to
r/s
.INPUT:
r
,s
– rational numbers
OUTPUT:
- a list of \(SL_2(\ZZ)\) matrices
EXAMPLES:
sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(19,23); v [ [ 0 1] [-1 0] [-4 1] [-5 -4] [-19 5] [-1 0], [-1 -1], [-5 1], [-6 -5], [-23 6] ] sage: [a.det() for a in v] [1, 1, 1, 1, 1] sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(11,25) [ [ 0 1] [-1 0] [-3 1] [-4 -3] [-11 4] [-1 0], [-2 -1], [-7 2], [-9 -7], [-25 9] ]
ALGORITHM:
This is Manin’s continued fraction trick, which gives an expression \(\{\infty,r/s\} = \{\infty,0\} + ... + \{a,b\} + ... + \{*,r/s\}\), where each \(\{a,b\}\) is the image of \(\{0,\infty\}\) under a matrix in \(SL_2(\ZZ)\).
-
sage.modular.pollack_stevens.manin_map.
unimod_matrices_to_infty
(r, s)¶ Return a list of matrices whose associated unimodular paths connect \(0\) to
r/s
.INPUT:
r
,s
– rational numbers
OUTPUT:
- a list of matrices in \(SL_2(\ZZ)\)
EXAMPLES:
sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(19,23); v [ [1 0] [ 0 1] [1 4] [-4 5] [ 5 19] [0 1], [-1 1], [1 5], [-5 6], [ 6 23] ] sage: [a.det() for a in v] [1, 1, 1, 1, 1] sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(11,25) [ [1 0] [ 0 1] [1 3] [-3 4] [ 4 11] [0 1], [-1 2], [2 7], [-7 9], [ 9 25] ]
ALGORITHM:
This is Manin’s continued fraction trick, which gives an expression \(\{0,r/s\} = \{0,\infty\} + ... + \{a,b\} + ... + \{*,r/s\}\), where each \(\{a,b\}\) is the image of \(\{0,\infty\}\) under a matrix in \(SL_2(\ZZ)\).