Modular Symbols¶
Modular symbols are a beautiful piece of mathematics that was developed since the 1960s by Birch, Manin, Shokorov, Mazur, Merel, Cremona, and others. Not only are modular symbols a powerful computational tool as we will see, they have also been used to prove rationality results for special values of \(L\)-series, to construct \(p\)-adic \(L\)-series, and they play a key role in Merel’s proof of the uniform boundedness theorem for torsion points on elliptic curves over number fields.
We view modular symbols as a remarkably flexible computational tool that provides a single uniform algorithm for computing \(M_k(N,\varepsilon)\) for any \(N, \varepsilon\) and \(k\geq 2\). There are ways to use computation of those spaces to obtain explicit basis for spaces of weight \(1\) and half-integral weight, so in a sense modular symbols yield everything. There are also generalizations of modular symbols to higher rank groups, though Sage currently has no code for modular symbols on higher rank groups.
Definition¶
A modular symbol of weight \(k\), and level \(N\), with character \(\varepsilon\) is a sum of terms \(X^i Y^{k-2-i} \{\alpha, \beta\}\), where \(0\leq i \leq k-2\) and \(\alpha, \beta \in \mathbb{P}^1(\QQ) = \QQ \cup \{\infty\}\). Modular symbols satisfy the relations
and for every \(\gamma=\left(\begin{smallmatrix}a&b\\c&d\end{smallmatrix}\right)\in\Gamma_0(N)\), we have
The modular symbols space \(\mathcal{M}_k(N,\varepsilon)\) is the torsion free \(\QQ[\varepsilon]\)-module generated by all sums of modular symbols, modulo the relations listed above. Here \(\QQ[\varepsilon]\) is the ring generated by the values of the character \(\varepsilon\), so it is of the form \(\QQ[\zeta_m]\) for some integer \(m\).
The amazing theorem that makes modular symbols useful is that there is an explicit description of an action of a Hecke algebra \(\mathbb{T}\) on \(\mathcal{M}_k(N,\varepsilon)\), and there is an isomorphism
This means that if modular symbols are computable (they are!), then they can be used to compute a lot about the \(\mathbb{T}\)-module \(M_k(N,\varepsilon)\).
Manin Symbols¶
Definition¶
Though \(\mathcal{M}_k(N,\varepsilon)\) as described above is not explicitly generated by finitely many elements, it is finitely generated. Manin, Shokoruv, and Merel give an explicit description of finitely many generators (Manin symbols) for this space, along with all explicit relations that these generators satisfy (see my book). In particular, if we let
where \(\gamma=\left(\begin{smallmatrix}a&b\\c&d\end{smallmatrix}\right)\), then the Manin symbols \((i,c,d)\) with \(0\leq i \leq k-2\) and \((c,d)\in\mathbb{P}^1(N)\) generate \(\mathcal{M}_k(N,\varepsilon)\).
Computing in Sage¶
We compute a basis for the space of weight \(4\) modular symbols for \(\Gamma_0(11)\), then coerce in \((2,0,1)\) and \((1,1,3)\).
sage: M = ModularSymbols(11,4)
sage: M.basis()
([X^2,(0,1)], [X^2,(1,6)], [X^2,(1,7)], [X^2,(1,8)],
[X^2,(1,9)], [X^2,(1,10)])
sage: M( (2,0,1) )
[X^2,(0,1)]
sage: M( (1,1,3) )
2/7*[X^2,(1,6)] + 1/14*[X^2,(1,7)] - 4/7*[X^2,(1,8)]
+ 3/14*[X^2,(1,10)]
>>> from sage.all import *
>>> M = ModularSymbols(Integer(11),Integer(4))
>>> M.basis()
([X^2,(0,1)], [X^2,(1,6)], [X^2,(1,7)], [X^2,(1,8)],
[X^2,(1,9)], [X^2,(1,10)])
>>> M( (Integer(2),Integer(0),Integer(1)) )
[X^2,(0,1)]
>>> M( (Integer(1),Integer(1),Integer(3)) )
2/7*[X^2,(1,6)] + 1/14*[X^2,(1,7)] - 4/7*[X^2,(1,8)]
+ 3/14*[X^2,(1,10)]
M = ModularSymbols(11,4) M.basis() M( (2,0,1) ) M( (1,1,3) )
We compute a modular symbols representation for the Manin symbol \((2,1,6)\), and verify this by converting back.
sage: a = M.1; a
[X^2,(1,6)]
sage: a.modular_symbol_rep()
36*X^2*{-1/6, 0} + 12*X*Y*{-1/6, 0} + Y^2*{-1/6, 0}
sage: 36*M([2,-1/6,0]) + 12*M([1,-1/6,0]) + M([0,-1/6,0])
[X^2,(1,6)]
>>> from sage.all import *
>>> a = M.gen(1); a
[X^2,(1,6)]
>>> a.modular_symbol_rep()
36*X^2*{-1/6, 0} + 12*X*Y*{-1/6, 0} + Y^2*{-1/6, 0}
>>> Integer(36)*M([Integer(2),-Integer(1)/Integer(6),Integer(0)]) + Integer(12)*M([Integer(1),-Integer(1)/Integer(6),Integer(0)]) + M([Integer(0),-Integer(1)/Integer(6),Integer(0)])
[X^2,(1,6)]
a = M.1; a a.modular_symbol_rep() 36*M([2,-1/6,0]) + 12*M([1,-1/6,0]) + M([0,-1/6,0])