Module: sage.modular.modsym.space
All the spaces of modular symbols derive from this class. This class is an abstract base class.
Class: 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
self) |
Synonym for cuspidal_submodule.
self) |
Get the default precision for computation of
-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
self) |
Return the matrix of the dual star involution, which is induced by complex conjugation on the linear dual of modular symbols.
self) |
Synonym for eisenstein_submodule.
self) |
Returns a list of pairs
where
is simple spaces of
modular symbols and self is isomorphic to the direct sum of
the
as a module over the anemic Hecke algebra
adjoin the star involution.
ASSUMPTION: self is a module over the anemic Hecke algebra.
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)
self) |
Returns the Sturm bound for this space of modular symbols.
Returns a positive integer
such that the Hecke operators
acting on cusp forms generate the
Hecke algebra as a
-module when the character is trivial
or quadratic. Otherwise,
generate the Hecke
algebra at least as a
-module, where
is
the ring generated by the values of the Dirichlet character
. Alternatively, this is a bound such that if two cusp
forms associated to this space of modular symbols are
congruent modulo
, then they are congruent
modulo
.
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
with character,
as one sees by taking a power of
. More precisely, if
for first
coefficients, then
for first
coefficents. Since the weight of
is
, it follows that if
, where
is the Sturm bound for
at weight
, then
has valuation large enough to be forced to be 0
at
by Sturm bound (which is valid if we choose
correctly). Thus
. Conclusion: For
with fixed character, the Sturm bound is
exactly the same as for
.
A key point is that we are finding
generators for
the Hecke algebra here, not
-generators. So if one wants
generators for the Hecke algebra over
, this bound must
be suitably modified.
self, level) |
See the documentation for self.modular_symbols_of_level(level)
self) |
Return a basis for the
-submodule of this modular symbols
space spanned by the generators.
Modular symbols spaces for congruence subgroups have a
-structure. Computing this
-structure is expensive,
so by default modular symbols spaces for congruence subgroups
in SAGE are defined over
. This function returns a tuple
of independent elements in this modular symbols space whose
-span is the corresponding space of modular symbols over
.
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
:
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
self, n) |
Return the matrix of the
th Hecke operator acting on the integral
structure on self (as returned by
self.integral_structure()
.
self) |
Return the
-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]
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
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.
self, [p=None]) |
Synonym for new_submodule.
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
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
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.
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) ]
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
of cusp forms. Together these
functions span
. Here
are integers with
, where
is the dimension of self.
For a reduced echelon basis, use the function
q_expansion_basis
instead.
More precisely, this function returns the
-expansions
obtained by taking the
entry of the matrices of the Hecke
operators
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)
self, prec) |
Set the default precision for computation of
-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) ]
self, prec) |
Same as self.set_default_prec(prec).
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
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
self) |
Returns a list modular symbols spaces
where
is simple
spaces of modular symbols (for the anemic Hecke algebra) and
self is isomorphic to the direct sum of the
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.
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]
self) |
Return the star involution on self, which is induced by complex conjugation on modular symbols.
self) |
Returns the Sturm bound for this space of modular symbols.
Returns a positive integer
such that the Hecke operators
acting on cusp forms generate the
Hecke algebra as a
-module when the character is trivial
or quadratic. Otherwise,
generate the Hecke
algebra at least as a
-module, where
is
the ring generated by the values of the Dirichlet character
. Alternatively, this is a bound such that if two cusp
forms associated to this space of modular symbols are
congruent modulo
, then they are congruent
modulo
.
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
with character,
as one sees by taking a power of
. More precisely, if
for first
coefficients, then
for first
coefficents. Since the weight of
is
, it follows that if
, where
is the Sturm bound for
at weight
, then
has valuation large enough to be forced to be 0
at
by Sturm bound (which is valid if we choose
correctly). Thus
. Conclusion: For
with fixed character, the Sturm bound is
exactly the same as for
.
A key point is that we are finding
generators for
the Hecke algebra here, not
-generators. So if one wants
generators for the Hecke algebra over
, this bound must
be suitably modified.
Special Functions: __cmp__,
_compute_sign_submodule,
_q_expansion_basis_eigen,
_q_expansion_basis_hecke_dual,
_set_sign
self, other) |
Compare self and other.