27.2 Space of modular symbols (base class)

Module: sage.modular.modsym.space

All the spaces of modular symbols derive from this class. This class is an abstract base class.

Class: ModularSymbolsSpace

class ModularSymbolsSpace
ModularSymbolsSpace( self, group, weight, character, sign, base_ring)

Functions: character,$  $ cuspidal_submodule,$  $ cuspidal_subspace,$  $ default_prec,$  $ dimension_of_associated_cuspform_space,$  $ dual_star_involution_matrix,$  $ eisenstein_subspace,$  $ factorization,$  $ group,$  $ hecke_bound,$  $ hecke_module_of_level,$  $ integral_basis,$  $ integral_hecke_matrix,$  $ integral_structure,$  $ is_cuspidal,$  $ is_simple,$  $ minus_submodule,$  $ multiplicity,$  $ new_subspace,$  $ ngens,$  $ plus_submodule,$  $ q_eigenform,$  $ q_expansion_basis,$  $ q_expansion_cuspforms,$  $ set_default_prec,$  $ set_precision,$  $ sign,$  $ sign_submodule,$  $ simple_factors,$  $ star_decomposition,$  $ star_eigenvalues,$  $ star_involution,$  $ sturm_bound

cuspidal_subspace( self)

Synonym for cuspidal_submodule.

default_prec( self)

Get the default precision for computation of $ q$ -expansion associated to the ambient space of this space of modular symbols (and all subspaces). Use set_default_prec to change the default precision.

sage: M = ModularSymbols(15)
sage: M.cuspidal_submodule().q_expansion_basis()
[
q - q^2 - q^3 - q^4 + q^5 + q^6 + O(q^8)
]
sage: M.set_default_prec(20)

Notice that setting the default precision of the ambient space affects the subspaces.

sage: M.cuspidal_submodule().q_expansion_basis()
[
q - q^2 - q^3 - q^4 + q^5 + q^6 + 3*q^8 + q^9 - q^10 - 4*q^11 + q^12 -
2*q^13 - q^15 - q^16 + 2*q^17 - q^18 + 4*q^19 + O(q^20)
]
sage: M.cuspidal_submodule().default_prec()
20

dual_star_involution_matrix( self)

Return the matrix of the dual star involution, which is induced by complex conjugation on the linear dual of modular symbols.

eisenstein_subspace( self)

Synonym for eisenstein_submodule.

factorization( self)

Returns a list of pairs $ (S,e)$ where $ S$ is simple spaces of modular symbols and self is isomorphic to the direct sum of the $ S^e$ as a module over the anemic Hecke algebra adjoin the star involution.

ASSUMPTION: self is a module over the anemic Hecke algebra.

group( self)

Returns the group of this modular symbols space.

INPUT:
   ModularSymbols self -- an arbitrary space of modular symbols
   
OUTPUT:
   CongruenceSubgroup -- the congruence subgroup that this is a space
                      of modular symbols for.

ALGORITHM: The group is recorded when this space is created.

sage: m = ModularSymbols(20)
sage: m.group()
Congruence Subgroup Gamma0(20)

hecke_bound( self)

Returns the Sturm bound for this space of modular symbols.

Returns a positive integer $ n$ such that the Hecke operators $ T_1,\ldots, T_n$ acting on cusp forms generate the Hecke algebra as a $ \mathbf{Z}$ -module when the character is trivial or quadratic. Otherwise, $ T_1,\ldots, T_n$ generate the Hecke algebra at least as a $ \mathbf{Z}[\varepsilon ]$ -module, where $ \mathbf{Z}[\varepsilon ]$ is the ring generated by the values of the Dirichlet character $ \varepsilon $ . Alternatively, this is a bound such that if two cusp forms associated to this space of modular symbols are congruent modulo $ (\lambda, q^n)$ , then they are congruent modulo $ \lambda$ .

REFERENCES: See the Agashe-Stein appendix to Lario and Schoof's Some computations with Hecke rings and deformation rings, Experimental Math., 11 (2002), no. 2, 303-311. This result originated in the paper Sturm, On the congruence of modular forms, Springer LNM 1240, 275-280, 1987.

REMARK:

Kevin Buzzard pointed out to me (William Stein) in Fall 2002 that the above bound is fine for $ \Gamma_1(N)$ with character, as one sees by taking a power of $ f$ . More precisely, if $ f
\equiv 0 \pmod{p}$ for first $ s$ coefficients, then $ f^r \equiv 0
\pmod{p}$ for first $ sr$ coefficents. Since the weight of $ f^r$ is $ r\cdot k(f)$ , it follows that if $ s \geq b$ , where $ b$ is the Sturm bound for $ \Gamma_0(N)$ at weight $ k(f)$ , then $ f^r$ has valuation large enough to be forced to be 0 at $ r*k(f)$ by Sturm bound (which is valid if we choose $ r$ correctly). Thus $ f
\equiv 0 \pmod{p}$ . Conclusion: For $ \Gamma_1(N)$ with fixed character, the Sturm bound is exactly the same as for $ \Gamma_0(N)$ .

A key point is that we are finding $ \mathbf{Z}[\varepsilon ]$ generators for the Hecke algebra here, not $ \mathbf{Z}$ -generators. So if one wants generators for the Hecke algebra over $ \mathbf{Z}$ , this bound must be suitably modified.

hecke_module_of_level( self, level)

See the documentation for self.modular_symbols_of_level(level)

integral_basis( self)

Return a basis for the $ \mathbf{Z}$ -submodule of this modular symbols space spanned by the generators.

Modular symbols spaces for congruence subgroups have a $ \mathbf{Z}$ -structure. Computing this $ \mathbf{Z}$ -structure is expensive, so by default modular symbols spaces for congruence subgroups in SAGE are defined over $ \mathbf{Q}$ . This function returns a tuple of independent elements in this modular symbols space whose $ \mathbf{Z}$ -span is the corresponding space of modular symbols over $ \mathbf{Z}$ .

sage: M = ModularSymbols(11)
sage: M.basis()
((1,0), (1,8), (1,9))
sage: M.integral_basis()
((1,0), (1,8), (1,9))
sage: S = M.cuspidal_submodule()
sage: S.basis()
((1,8), (1,9))
sage: S.integral_basis()
((1,8), (1,9))

sage: M = ModularSymbols(13,4)
sage: M.basis()
([X^2,(0,1)], [X^2,(1,4)], [X^2,(1,5)], [X^2,(1,7)], [X^2,(1,9)],
[X^2,(1,10)], [X^2,(1,11)], [X^2,(1,12)])
sage: M.integral_basis()
([X^2,(0,1)], 1/28*[X^2,(1,4)] + 2/7*[X^2,(1,5)] + 3/28*[X^2,(1,7)] +
11/14*[X^2,(1,9)] + 2/7*[X^2,(1,10)] + 11/28*[X^2,(1,11)] +
3/28*[X^2,(1,12)], [X^2,(1,5)], 1/2*[X^2,(1,7)] + 1/2*[X^2,(1,9)],
[X^2,(1,9)], [X^2,(1,10)], [X^2,(1,11)], [X^2,(1,12)])
sage: S = M.cuspidal_submodule()
sage: S.basis()
([X^2,(1,4)] - [X^2,(1,12)], [X^2,(1,5)] - [X^2,(1,12)], [X^2,(1,7)] -
[X^2,(1,12)], [X^2,(1,9)] - [X^2,(1,12)], [X^2,(1,10)] - [X^2,(1,12)],
[X^2,(1,11)] - [X^2,(1,12)])
sage: S.integral_basis()
(1/28*[X^2,(1,4)] + 2/7*[X^2,(1,5)] + 3/28*[X^2,(1,7)] + 11/14*[X^2,(1,9)]
+ 2/7*[X^2,(1,10)] + 11/28*[X^2,(1,11)] - 53/28*[X^2,(1,12)], [X^2,(1,5)] -
[X^2,(1,12)], 1/2*[X^2,(1,7)] + 1/2*[X^2,(1,9)] - [X^2,(1,12)], [X^2,(1,9)]
- [X^2,(1,12)], [X^2,(1,10)] - [X^2,(1,12)], [X^2,(1,11)] - [X^2,(1,12)])

This function currently raises a NotImplementedError on modular symbols spaces with character of order bigger than $ 2$ :

sage: M = ModularSymbols(DirichletGroup(13).0^2, 2); M
Modular Symbols space of dimension 4 and level 13, weight 2, character
[zeta6], sign 0, over Cyclotomic Field of order 6 and degree 2
sage: M.basis()
((1,0), (1,5), (1,10), (1,11))
sage: M.integral_basis()
Traceback (most recent call last):
...
NotImplementedError

integral_hecke_matrix( self, n)

Return the matrix of the $ n$ th Hecke operator acting on the integral structure on self (as returned by self.integral_structure().

integral_structure( self)

Return the $ \mathbf{Z}$ -structure of this modular symbols spaces generated by all integral modular symbols.

sage: M = ModularSymbols(11,4)
sage: M.integral_structure()
Free module of degree 6 and rank 6 over Integer Ring
Echelon basis matrix:
[    1     0     0     0     0     0]
[    0  1/14   1/7  5/14   1/2 13/14]
[    0     0   1/2     0     0   1/2]
[    0     0     0     1     0     0]
[    0     0     0     0     1     0]
[    0     0     0     0     0     1]
sage: M.cuspidal_submodule().integral_structure()
Free module of degree 6 and rank 4 over Integer Ring
Echelon basis matrix:
[     0   1/14    1/7   5/14    1/2 -15/14]
[     0      0    1/2      0      0   -1/2]
[     0      0      0      1      0     -1]
[     0      0      0      0      1     -1]

minus_submodule( self, [compute_dual=True])

Return the subspace of self on which the star involution acts as -1.

INPUT:
    compute_dual -- bool (default: True) also compute dual subspace.
                    This are useful for many algorithms.
OUTPUT:
    subspace of modular symbols

multiplicity( self, S)

Return the multiplicity of the simple modular symbols space S in self. S must be a simple anemic Hecke module.

ASSUMPTION: self is an anemic Hecke module with the same weight and group as S, and S is simple.

new_subspace( self, [p=None])

Synonym for new_submodule.

ngens( self)

The number of generators of self.

INPUT:
   ModularSymbols self -- arbitrary space of modular symbols.
OUTPUT:
   int -- the number of generators, which is the same as the
          dimension of self.
ALGORITHM:
   Call the dimension function.

sage: m = ModularSymbols(33)
sage: m.ngens()
9
sage: m.rank()
9
sage: ModularSymbols(100, weight=2, sign=1).ngens()
18

plus_submodule( self, [compute_dual=True])

Return the subspace of self on which the star involution acts as +1.

INPUT:
    compute_dual -- bool (default: True) also compute dual subspace.
                    This are useful for many algorithms.
                    
OUTPUT:
    subspace of modular symbols

q_eigenform( self, [prec=None])

Returns the q-expansion to precision prec of a new eigenform associated to self, where self must be new, cuspidal, and simple.

q_expansion_basis( self, [prec=default], [algorithm=None])

Returns a basis of q-expansions (as power series) to precision prec of the space of modular forms associated to self. The q-expansions are defined over the same base ring as prec, and a put in echelon form.

INPUT:
    self -- a space of CUSPIDAL modular symbols
    prec -- an integer
    algorithm -- string:
            'default' (default) -- decide which algorithm to use based on
heuristics
            'hecke' -- compute basis by computing homomorphisms
                       T --> K, where T is the Hecke algebra
            'eigen' -- compute basis using eigenvectors for the Hecke
action
                       and Atkin-Lehner-Li theory to patch them together
            'all'   -- compute using hecke_dual and eigen algorithms and
verify
                       that the results are the same.

The computed basis is not cached, though of course Hecke operators used in computing the basis are cached.

sage: M = ModularSymbols(1, 12).cuspidal_submodule()
sage: M.q_expansion_basis(8)
[
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^8)
]

sage: M.q_expansion_basis(8, algorithm='eigen')
[
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^8)
]

sage: M = ModularSymbols(1, 24).cuspidal_submodule()
sage: M.q_expansion_basis(8, algorithm='eigen')
[
q + 195660*q^3 + 12080128*q^4 + 44656110*q^5 - 982499328*q^6 -
147247240*q^7 + O(q^8),
q^2 - 48*q^3 + 1080*q^4 - 15040*q^5 + 143820*q^6 - 985824*q^7 + O(q^8)
]

sage: M = ModularSymbols(11, 2, sign=-1).cuspidal_submodule()
sage: M.q_expansion_basis(8, algorithm='eigen')
[
q - 2*q^2 - q^3 + 2*q^4 + q^5 + 2*q^6 - 2*q^7 + O(q^8)
]

sage: M = ModularSymbols(Gamma1(13), 2, sign=1).cuspidal_submodule()
sage: M.q_expansion_basis(8, algorithm='eigen')
[
q - 4*q^3 - q^4 + 3*q^5 + 6*q^6 + O(q^8),
q^2 - 2*q^3 - q^4 + 2*q^5 + 2*q^6 + O(q^8)
]

sage: M = ModularSymbols(Gamma1(5), 3, sign=-1).cuspidal_submodule()
sage: M.q_expansion_basis(8, algorithm='eigen')   # dimension is 0
[]

sage: M = ModularSymbols(Gamma1(7), 3, sign=-1).cuspidal_submodule()
sage: M.q_expansion_basis(8)
[
q - 3*q^2 + 5*q^4 - 7*q^7 + O(q^8)
]

sage: M = ModularSymbols(43, 2, sign=0).cuspidal_submodule()
sage: M[0]
Modular Symbols subspace of dimension 2 of Modular Symbols space of
dimension 7 for Gamma_0(43) of weight 2 with sign 0 over Rational Field
sage: M[0].q_expansion_basis()
[
q - 2*q^2 - 2*q^3 + 2*q^4 - 4*q^5 + 4*q^6 + O(q^8)
]
sage: M[1]
Modular Symbols subspace of dimension 4 of Modular Symbols space of
dimension 7 for Gamma_0(43) of weight 2 with sign 0 over Rational Field
sage: M[1].q_expansion_basis()
[
q + 2*q^5 - 2*q^6 - 2*q^7 + O(q^8),
q^2 - q^3 - q^5 + q^7 + O(q^8)
]

q_expansion_cuspforms( self, [prec=None])

Returns a function f(i,j) such that each value f(i,j) is the q-expansion, to the given precision, of an element of the corresponding space $ S$ of cusp forms. Together these functions span $ S$ . Here $ i,j$ are integers with $ 0\leq i,j < d$ , where $ d$ is the dimension of self.

For a reduced echelon basis, use the function q_expansion_basis instead.

More precisely, this function returns the $ q$ -expansions obtained by taking the $ ij$ entry of the matrices of the Hecke operators $ T_n$ acting on the subspace of the linear dual of modular symbols corresponding to self.

sage: S = ModularSymbols(11,2, sign=1).cuspidal_submodule()
sage: f = S.q_expansion_cuspforms(8)
sage: f(0,0)
q - 2*q^2 - q^3 + 2*q^4 + q^5 + 2*q^6 - 2*q^7 + O(q^8)

sage: S = ModularSymbols(37,2).cuspidal_submodule()
sage: f = S.q_expansion_cuspforms(8)
sage: f(0,0)
q + q^3 - 2*q^4 - q^7 + O(q^8)
sage: f(3,3)
q - 2*q^2 - 3*q^3 + 2*q^4 - 2*q^5 + 6*q^6 - q^7 + O(q^8)
sage: f(1,2)
q^2 + 2*q^3 - 2*q^4 + q^5 - 3*q^6 + O(q^8)

sage: S = ModularSymbols(Gamma1(13),2,sign=-1).cuspidal_submodule()
sage: f = S.q_expansion_cuspforms(8)
sage: f(0,0)
q - 2*q^2 + q^4 - q^5 + 2*q^6 + O(q^8)
sage: f(0,1)
q^2 - 2*q^3 - q^4 + 2*q^5 + 2*q^6 + O(q^8)

sage: S = ModularSymbols(1,12,sign=-1).cuspidal_submodule()
sage: f = S.q_expansion_cuspforms(8)
sage: f(0,0)
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^8)

set_default_prec( self, prec)

Set the default precision for computation of $ q$ -expansion associated to the ambient space of this space of modular symbols (and all subspaces).

sage: M = ModularSymbols(Gamma1(13),2)
sage: M.set_default_prec(5)
sage: M.cuspidal_submodule().q_expansion_basis()
[
q - 4*q^3 - q^4 + O(q^5),
q^2 - 2*q^3 - q^4 + O(q^5)
]

set_precision( self, prec)

Same as self.set_default_prec(prec).

sign( self)

Returns the sign of self.

For efficiency reasons, it is often useful to compute in the (largest) quotient of modular symbols where the * involution acts as +1, or where it acts as -1.

INPUT:
   ModularSymbols self -- arbitrary space of modular symbols.
   
OUTPUT:
   int -- the sign of self, either -1, 0, or 1.
          -1 -- if this is factor of quotient where * acts as -1,
          +1 -- if this is factor of quotient where * acts as +1, 
           0 -- if this is full space of modular symbols (no quotient).

sage: m = ModularSymbols(33)
sage: m.rank()
9
sage: m.sign()
0
sage: m = ModularSymbols(33, sign=0)
sage: m.sign()
0
sage: m.rank()
9
sage: m = ModularSymbols(33, sign=-1)
sage: m.sign()
-1
sage: m.rank()
3

sign_submodule( self, sign, [compute_dual=True])

Return the subspace of self that is fixed under the star involution.

INPUT:
    sign -- int (either -1, 0 or +1)
    compute_dual -- bool (default: True) also compute dual subspace.
                    This are useful for many algorithms.
OUTPUT:
    subspace of modular symbols

simple_factors( self)

Returns a list modular symbols spaces $ S$ where $ S$ is simple spaces of modular symbols (for the anemic Hecke algebra) and self is isomorphic to the direct sum of the $ S$ with some multiplicities, as a module over the anemic Hecke algebra. For the multiplicities use factorization() instead.

ASSUMPTION: self is a module over the anemic Hecke algebra.

star_eigenvalues( self)

Returns the eigenvalues of the star involution acting on self.

sage: M = ModularSymbols(11)
sage: D = M.decomposition()
sage: M.star_eigenvalues()
[1, -1]
sage: D[0].star_eigenvalues()
[1]
sage: D[1].star_eigenvalues()
[1, -1]
sage: D[1].plus_submodule().star_eigenvalues()
[1]
sage: D[1].minus_submodule().star_eigenvalues()
[-1]

star_involution( self)

Return the star involution on self, which is induced by complex conjugation on modular symbols.

sturm_bound( self)

Returns the Sturm bound for this space of modular symbols.

Returns a positive integer $ n$ such that the Hecke operators $ T_1,\ldots, T_n$ acting on cusp forms generate the Hecke algebra as a $ \mathbf{Z}$ -module when the character is trivial or quadratic. Otherwise, $ T_1,\ldots, T_n$ generate the Hecke algebra at least as a $ \mathbf{Z}[\varepsilon ]$ -module, where $ \mathbf{Z}[\varepsilon ]$ is the ring generated by the values of the Dirichlet character $ \varepsilon $ . Alternatively, this is a bound such that if two cusp forms associated to this space of modular symbols are congruent modulo $ (\lambda, q^n)$ , then they are congruent modulo $ \lambda$ .

sage: ModularSymbols(11,2).sturm_bound()
2
sage: ModularSymbols(389,2).sturm_bound()
65
sage: ModularSymbols(1,12).sturm_bound()
1
sage: ModularSymbols(1,36).sturm_bound()
3

REFERENCES: See the Agashe-Stein appendix to Lario and Schoof, Some computations with Hecke rings and deformation rings, Experimental Math., 11 (2002), no. 2, 303-311. This result originated in the paper Sturm, On the congruence of modular forms, Springer LNM 1240, 275-280, 1987.

REMARK: Kevin Buzzard pointed out to me (William Stein) in Fall 2002 that the above bound is fine for $ \Gamma_1(N)$ with character, as one sees by taking a power of $ f$ . More precisely, if $ f
\equiv 0 \pmod{p}$ for first $ s$ coefficients, then $ f^r \equiv 0
\pmod{p}$ for first $ sr$ coefficents. Since the weight of $ f^r$ is $ r\cdot k(f)$ , it follows that if $ s \geq b$ , where $ b$ is the Sturm bound for $ \Gamma_0(N)$ at weight $ k(f)$ , then $ f^r$ has valuation large enough to be forced to be 0 at $ r*k(f)$ by Sturm bound (which is valid if we choose $ r$ correctly). Thus $ f
\equiv 0 \pmod{p}$ . Conclusion: For $ \Gamma_1(N)$ with fixed character, the Sturm bound is exactly the same as for $ \Gamma_0(N)$ .

A key point is that we are finding $ \mathbf{Z}[\varepsilon ]$ generators for the Hecke algebra here, not $ \mathbf{Z}$ -generators. So if one wants generators for the Hecke algebra over $ \mathbf{Z}$ , this bound must be suitably modified.

Special Functions: __cmp__,$  $ _compute_sign_submodule,$  $ _q_expansion_basis_eigen,$  $ _q_expansion_basis_hecke_dual,$  $ _set_sign

__cmp__( self, other)

Compare self and other.

See About this document... for information on suggesting changes.