Module: sage.modular.dims
Dimensions of spaces of modular forms
Author Log:
ACKNOWLEDGEMENT:
The dimension formulas and implementations in this module grew out
of a program that Bruce Kaskel wrote (around 1996) in PARI, which
Kevin Buzzard subsequently extended. I (William Stein) then
implemented it in C++ for Hecke. I also implemented it in Magma.
Also, the functions for dimensions of spaces with nontrivial
character are based on a paper (that has no proofs) by Cohen and
Oesterle (Springer Lecture notes in math, volume 627, pages
69-78). The formulas for
were found and implemented by
Jordi Quer.
The formulas here are more complete than in Hecke or Magma.
Currently the input to each function below is an integer and either a
Dirichlet character
or a congruence subgroup, which must be
either
or
. If the input is a Dirichlet
character
, the dimensions are for subspaces of
, where
is the modulus of
.
Module-level Functions
r, p, N, eps) |
This is used as an intermediate value in computations related to the paper of Cohen-Oesterle.
Input:
sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CO_delta(1,5,7,eps^3) 2
r, p, N, eps) |
This is used as an intermediate value in computations related to the paper of Cohen-Oesterle.
Input:
sage: G.<eps> = DirichletGroup(7) sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CO_nu(1,7,7,eps) -1
eps, k) |
Compute the Cohen-Oesterle function associate to eps,
. This is
a summand in the formula for the dimension of the space of cusp
forms of weight
with character
.
Input:
sage: G.<eps> = DirichletGroup(7) sage: sage.modular.dims.CohenOesterle(eps, 2) -2/3 sage: sage.modular.dims.CohenOesterle(eps, 4) -1
n, k) |
Return the dimension of the space of level
weight
cuspforms on
.
Input:
sage: sage.modular.dims.S0(11,2) 1 sage: a = sage.modular.dims.S0(1,2); a 0 sage: type(a) <type 'sage.rings.integer.Integer'> sage: sage.modular.dims.S0(5,0) 0 sage: sage.modular.dims.S0(20,1) 0 sage: sage.modular.dims.S0(20,4) 6
n, k) |
Return the dimension of the space of level
weight
cuspforms on
.
Input:
sage: sage.modular.dims.S1(11,2) 1 sage: a = sage.modular.dims.S1(13,2); a 2 sage: type(a) <type 'sage.rings.integer.Integer'> sage: sage.modular.dims.S1(20,4) 26
n) |
Return the number of cusps of the modular curve
.
Input:
sage: [sage.modular.dims.c0(n) for n in [1..19]] [1, 2, 2, 3, 2, 4, 2, 4, 4, 4, 2, 6, 2, 4, 4, 6, 2, 8, 2] sage: [sage.modular.dims.c0(n) for n in prime_range(2,100)] [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
n) |
Return value of
, which is the number of cusps on the
modular curve
.
sage: [sage.modular.dims.c1(n) for n in prime_range(2,100)] [2, 2, 4, 6, 10, 12, 16, 18, 22, 28, 30, 36, 40, 42, 46, 52, 58, 60, 66, 70, 72, 78, 82, 88, 96]
X, [k=2]) |
The dimension of the space of cusp forms for the given congruence subgroup or Dirichlet character.
Input:
sage: dimension_cusp_forms(5,4) 1
sage: dimension_cusp_forms(Gamma0(11),2) 1 sage: dimension_cusp_forms(Gamma1(13),2) 2
sage: dimension_cusp_forms(DirichletGroup(13).0^2,2) 1 sage: dimension_cusp_forms(DirichletGroup(13).0,3) 1
sage: dimension_cusp_forms(Gamma0(11),2) 1 sage: dimension_cusp_forms(Gamma0(11),0) 0 sage: dimension_cusp_forms(Gamma0(1),12) 1 sage: dimension_cusp_forms(Gamma0(1),2) 0 sage: dimension_cusp_forms(Gamma0(1),4) 0
sage: dimension_cusp_forms(Gamma0(389),2) 32 sage: dimension_cusp_forms(Gamma0(389),4) 97 sage: dimension_cusp_forms(Gamma0(2005),2) 199 sage: dimension_cusp_forms(Gamma0(11),1) 0
sage: dimension_cusp_forms(Gamma1(11),2) 1 sage: dimension_cusp_forms(Gamma1(1),12) 1 sage: dimension_cusp_forms(Gamma1(1),2) 0 sage: dimension_cusp_forms(Gamma1(1),4) 0
sage: dimension_cusp_forms(Gamma1(389),2) 6112 sage: dimension_cusp_forms(Gamma1(389),4) 18721 sage: dimension_cusp_forms(Gamma1(2005),2) 159201
sage: dimension_cusp_forms(Gamma1(11),1) Traceback (most recent call last): ... NotImplementedError: computation of dimensions of spaces of weight 1 modular forms not implemented in general.
sage: e = DirichletGroup(13).0 sage: e.order() 12 sage: dimension_cusp_forms(e,2) 0 sage: dimension_cusp_forms(e^2,2) 1
G, k) |
Return the dimension of the space of weight
cusp forms for the
group
.
Input:
sage: sage.modular.dims.dimension_cusp_forms_H(GammaH(33,[2]),2) 5 sage: sage.modular.dims.dimension_cusp_forms_H(GammaH(33,[2]),3) 0 sage: sage.modular.dims.dimension_cusp_forms_H(GammaH(33,[2,5]),2) 3
eps, [k=2]) |
The dimension of the space of cusp forms of weight
and character
.
Input:
sage: G.<eps> = DirichletGroup(9) sage: [sage.modular.dims.dimension_cusp_forms_eps(eps, k) for k in [2..10]] [0, 1, 0, 3, 0, 5, 0, 7, 0] sage: [sage.modular.dims.dimension_cusp_forms_eps(eps^2, k) for k in [2..10]] [0, 0, 2, 0, 4, 0, 6, 0, 8]
chi, k) |
Compute the dimension of the space of cusp forms of weight
and
character
using formulas for dimensions for congruence
subgroups
instead of the formulas of Cohen-Oesterle.
Input:
sage: K = CyclotomicField(3) sage: eps = DirichletGroup(7*43,K).0^2
The following two calculations use different algorithms.
sage: dimension_cusp_forms(eps,2) 28 sage: sage.modular.dims.dimension_cusp_forms_fromH(eps,2) 28
N, [k=2]) |
The dimension of the space
of cusp forms.
Input:
sage: sage.modular.dims.dimension_cusp_forms_gamma0(23,2) 2 sage: sage.modular.dims.dimension_cusp_forms_gamma0(1,24) 2 sage: sage.modular.dims.dimension_cusp_forms_gamma0(11,3) 0 sage: sage.modular.dims.dimension_cusp_forms_gamma0(11,-1) 0
N, [k=2]) |
The dimension of the space
of cusp forms.
Input:
sage: sage.modular.dims.dimension_cusp_forms_gamma1(23,2) 12 sage: sage.modular.dims.dimension_cusp_forms_gamma1(1,24) 2 sage: sage.modular.dims.dimension_cusp_forms_gamma1(11,-1) 0 sage: sage.modular.dims.dimension_cusp_forms_gamma1(11,0) 0
X, [k=2]) |
The dimension of the space of eisenstein series for the given congruence subgroup.
Input:
sage: dimension_eis(5,4) 2
sage: dimension_eis(Gamma0(11),2) 1 sage: dimension_eis(Gamma1(13),2) 11 sage: dimension_eis(Gamma1(2006),2) 3711
sage: e = DirichletGroup(13).0 sage: e.order() 12 sage: dimension_eis(e,2) 0 sage: dimension_eis(e^2,2) 2
sage: e = DirichletGroup(13).0 sage: e.order() 12 sage: dimension_eis(e,2) 0 sage: dimension_eis(e^2,2) 2 sage: dimension_eis(e,13) 2
sage: G = DirichletGroup(20) sage: dimension_eis(G.0,3) 4 sage: dimension_eis(G.1,3) 6 sage: dimension_eis(G.1^2,2) 6
sage: G = DirichletGroup(200) sage: e = prod(G.gens(), G(1)) sage: e.conductor() 200 sage: dimension_eis(e,2) 4
sage: dimension_modular_forms(Gamma1(4), 11) 6
G, k) |
Return the dimension of the space of weight
Eisenstein series
for the group
.
Input:
sage: sage.modular.dims.dimension_eis_H(GammaH(33,[2]),2) 7 sage: sage.modular.dims.dimension_eis_H(GammaH(33,[2]),3) 0 sage: sage.modular.dims.dimension_eis_H(GammaH(33,[2,5]),2) 3
eps, [k=2]) |
The dimension of the space of eisenstein series of weight
and
character
.
Input:
sage: G.<eps> = DirichletGroup(9) sage: [sage.modular.dims.dimension_eis_eps(eps, k) for k in [2..10]] [0, 2, 0, 2, 0, 2, 0, 2, 0] sage: [sage.modular.dims.dimension_eis_eps(eps^2, k) for k in [2..10]] [2, 0, 2, 0, 2, 0, 2, 0, 2]
X, [k=2]) |
The dimension of the space of cusp forms for the given congruence
subgroup (either
,
, or
)
or Dirichlet character.
Input:
sage: dimension_modular_forms(Gamma0(11),2) 2 sage: dimension_modular_forms(Gamma0(11),0) 1 sage: dimension_modular_forms(Gamma1(13),2) 13
sage: e = DirichletGroup(20).1 sage: dimension_modular_forms(e,3) 9 sage: dimension_cusp_forms(e,3) 3 sage: dimension_eis(e,3) 6 sage: dimension_modular_forms(11,2) 2
chi, k) |
Compute the dimension of the space of modular forms of weight
and character
using formulas for dimensions for congruence
subgroups
instead of the formulas of Cohen-Oesterle.
Input:
sage: K = CyclotomicField(3) sage: eps = DirichletGroup(7*43,K).0^2 sage: dimension_modular_forms(eps,2) 32 sage: sage.modular.dims.dimension_modular_forms_fromH(eps,2) 32
X, [k=2], [p=0]) |
Return the dimension of the new (or
-new) subspace of cusp
forms for the character or group
.
Input:
sage: dimension_new_cusp_forms(100,2) 1
sage: dimension_new_cusp_forms(Gamma0(100),2) 1 sage: dimension_new_cusp_forms(Gamma0(100),4) 5
sage: dimension_new_cusp_forms(Gamma1(100),2) 141 sage: dimension_new_cusp_forms(Gamma1(100),4) 463
sage: dimension_new_cusp_forms(DirichletGroup(100).1^2,2) 2 sage: dimension_new_cusp_forms(DirichletGroup(100).1^2,4) 8
sage: sum(dimension_new_cusp_forms(e,3) for e in DirichletGroup(30)) 12 sage: dimension_new_cusp_forms(Gamma1(30),3) 12
G, k, [p=0]) |
Return the dimension of the space of new (or
-new) weight
cusp forms for
.
Input:
sage: from sage.modular.dims import * sage: dimension_new_cusp_forms_H(GammaH(33,[2]), 2) 3
eps, [k=2], [p=0]) |
Dimension of the new subspace (or
-new subspace) of cusp forms of
weight
and character
.
Input:
sage: G = DirichletGroup(9) sage: eps = G.0^3 sage: eps.conductor() 3 sage: [sage.modular.dims.dimension_new_cusp_forms_eps(eps, k) for k in [2..10]] [0, 0, 0, 2, 0, 2, 0, 2, 0] sage: [sage.modular.dims.dimension_cusp_forms_eps(eps, k) for k in [2..10]] [0, 0, 0, 2, 0, 4, 0, 6, 0] sage: [sage.modular.dims.dimension_new_cusp_forms_eps(eps, k, 3) for k in [2..10]] [0, 0, 0, 2, 0, 2, 0, 2, 0]
Double check using modular symbols (independent calculation):
sage: [ModularSymbols(eps,k,sign=1).cuspidal_subspace().new_subspace().dimension() for k in [2..10]] [0, 0, 0, 2, 0, 2, 0, 2, 0] sage: [ModularSymbols(eps,k,sign=1).cuspidal_subspace().new_subspace(3).dimension() for k in [2..10]] [0, 0, 0, 2, 0, 2, 0, 2, 0]
Another example at level 33:
sage: G = DirichletGroup(33) sage: eps = G.1 sage: eps.conductor() 11 sage: [sage.modular.dims.dimension_new_cusp_forms_eps(G.1, k) for k in [2..4]] [0, 4, 0] sage: [sage.modular.dims.dimension_new_cusp_forms_eps(G.1^2, k) for k in [2..4]] [2, 0, 6] sage: [sage.modular.dims.dimension_new_cusp_forms_eps(G.1^2, k, 3) for k in [2..4]] [2, 0, 6]
N, [k=2], [p=0]) |
Dimension of the
-new subspace of
.
If
, dimension of the new subspace.
Input:
sage: sage.modular.dims.dimension_new_cusp_forms_gamma0(100, 2, 5) 5
Independently compute the dimension 5 above:
sage: m = ModularSymbols(100, 2,sign=1).cuspidal_subspace() sage: m.new_subspace(5) Modular Symbols subspace of dimension 5 of Modular Symbols space of dimension 18 for Gamma_0(100) of weight 2 with sign 1 over Rational Field
N, [k=2], [p=0]) |
Return the dimension of the
-new subspace of
. If
, return the dimension of the new
subspace.
Input:
sage: sage.modular.dims.dimension_new_cusp_forms_gamma1(4*25, 2, 5) 225
group, [k=2], [p=0]) |
Return the dimension of the new space of cusp forms for the
congruence subgroup group. If
is given, return the
-new subspace.
Input:
sage: sage.modular.dims.dimension_new_cusp_forms_group(Gamma0(33),2) 1 sage: sage.modular.dims.dimension_new_cusp_forms_group(Gamma0(33),2,3) 1 sage: sage.modular.dims.dimension_new_cusp_forms_group(Gamma0(33),2,11) 3 sage: sage.modular.dims.dimension_new_cusp_forms_group(Gamma1(33),2) 19 sage: sage.modular.dims.dimension_new_cusp_forms_group(Gamma1(33),2,11) 21 sage: sage.modular.dims.dimension_new_cusp_forms_group(GammaH(33,[1,2]),2) 3
p) |
Return the Eisenstein number
which is the numerator of
.
Input:
sage: [(p,sage.modular.dims.eisen(p)) for p in prime_range(24)] [(2, 1), (3, 1), (5, 1), (7, 1), (11, 5), (13, 1), (17, 4), (19, 3), (23, 11)]
n) |
Return the genus of the modular curve
.
Input:
sage: [sage.modular.dims.g0(n) for n in [1..23]] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 2, 2] sage: [n for n in [1..200] if sage.modular.dims.g0(n) == 1] [11, 14, 15, 17, 19, 20, 21, 24, 27, 32, 36, 49]
n) |
Return the genus of the modular curve
.
sage: [sage.modular.dims.g1(n) for n in prime_range(2,100)] [0, 0, 0, 0, 1, 2, 5, 7, 12, 22, 26, 40, 51, 57, 70, 92, 117, 126, 155, 176, 187, 222, 247, 287, 345]
N, H) |
Return the genus of the curve
.
Input:
sage: sage.modular.dims.gH(33, GammaH(33,[2])._list_of_elements_in_H()) 5 sage: sage.modular.dims.gH(7, GammaH(7,[2])._list_of_elements_in_H()) 0 sage: sage.modular.dims.gH(23, [1..22]) 2 sage: sage.modular.dims.g0(23) 2 sage: sage.modular.dims.gH(23, [1]) 12 sage: sage.modular.dims.g1(23) 12
Author: Jordi Quer
H) |
Return the genus of the modular curve
, where
is a
congruence subgroup of the form
.
Input:
sage: sage.modular.dims.genus_H(GammaH(33,[2])) 5
Author: Jordi Quer
N) |
Return the index
of
in
.
Input:
sage: [sage.modular.dims.idxG0(N) for N in [1..10]] [1, 3, 4, 6, 6, 12, 8, 12, 12, 18] sage: type(sage.modular.dims.idxG0(15)) <type 'sage.rings.integer.Integer'>
N) |
The index
of
in
.
Input:
sage: [sage.modular.dims.idxG1(N) for N in [1..10]] [1, 3, 8, 12, 24, 24, 48, 48, 72, 72]
k) |
Return 0 if
is odd, 4 if
is divisible by 4, and -4 if
is even but not divisible by 4.
This is used for computations of the Cohen-Oesterle formulas.
Input:
sage: [sage.modular.dims.lambda3(k) for k in [0..10]] [4, 0, -4, 4, 0, -4, 4, 0, -4, 4, 0]
k) |
Return 0 if
is odd, 3 if
is divisible by 4, and -3 if
is even but not divisible by 4.
This is used for computations of the Cohen-Oesterle formulas.
Input:
sage: [sage.modular.dims.lambda4(k) for k in [0..10]] [3, 0, -3, 0, 3, 0, -3, 0, 3, 0, -3]
n) |
Return value of the combinatorial function
where the product is over the maximal prime power divisors of
Input:
sage: [sage.modular.dims.mu0(n) for n in [1..19]] [1, 3, 4, 6, 6, 12, 8, 12, 12, 18, 12, 24, 14, 24, 24, 24, 18, 36, 20]
n) |
Return value of the combinatorial function
,
where for
,
, and for
,
Input:
sage: [sage.modular.dims.mu1(n) for n in [1..16]] [1, 3, 4, 6, 12, 12, 24, 24, 36, 36, 60, 48, 84, 72, 96, 96]
n) |
Return value of the arithmetic function
,
where
if
is divisible by 4, and
otherwise.
Input:
sage: [sage.modular.dims.mu20(n) for n in [1..19]] [1, 1, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0]
n) |
Return value of
. By definition, this equals
for
and equals 0 otherwise.
sage: [sage.modular.dims.mu21(n) for n in [1..16]] [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
n) |
Return value of the arithmetic function
,
where
if
is divisible by 2 or 9,
and
otherwise.
Input:
sage: [sage.modular.dims.mu30(n) for n in [1..19]] [1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2]
n) |
Return value of
. By definition, this equals
for
and equals 0 otherwise.
sage: [sage.modular.dims.mu31(n) for n in [1..10]] [1, 0, 1, 0, 0, 0, 0, 0, 0, 0]
N, H) |
Return the degree of the covering map
.
Input:
sage: sage.modular.dims.muH(33, GammaH(33,[2])._list_of_elements_in_H()) 96
Author: Jordi Quer
N) |
Return 0 if any cube divides
. Otherwise return
where
is the number of primes that exactly divide
.
This is similar to the Moebius function.
Input:
sage: sage.modular.dims.mumu(27) 0 sage: sage.modular.dims.mumu(6*25) 4 sage: sage.modular.dims.mumu(7*9*25) -2 sage: sage.modular.dims.mumu(9*25) 1
N, H) |
Number of elliptic points of order 2 for the group
Input:
sage: sage.modular.dims.nu2H(33, GammaH(33,[2])._list_of_elements_in_H()) 0 sage: sage.modular.dims.nu2H(5, GammaH(5,[2])._list_of_elements_in_H()) 2
Author: Jordi Quer
N, H) |
Number of elliptic points of order 3 for the group
Input:
sage: sage.modular.dims.nu3H(33, GammaH(33,[2])._list_of_elements_in_H()) 0 sage: sage.modular.dims.nu3H(7, GammaH(7,[2])._list_of_elements_in_H()) 2
Author: Jordi Quer
N, H) |
Number of cusps for the group
Input:
sage: sage.modular.dims.nuinfH(33, GammaH(33,[2])._list_of_elements_in_H()) 8
Author: Jordi Quer
N, H) |
Number of regular cusps for the group
Input:
sage: sage.modular.dims.nuinfHreg(33, GammaH(33,[2])._list_of_elements_in_H()) 0 sage: sage.modular.dims.nuinfHreg(7, GammaH(7,[2])._list_of_elements_in_H()) 2
Author: Jordi Quer
level, [weight=2]) |
Returns the Sturm bound for modular forms with given level and weight.
Input:
sage: sturm_bound(11,2) 2 sage: sturm_bound(389,2) 65 sage: sturm_bound(1,12) 1 sage: sturm_bound(100,2) 30 sage: sturm_bound(1,36) 3 sage: sturm_bound(11) 2 sage: sturm_bound(Gamma0(11)) 2 sage: sturm_bound(Gamma0(13)) 3 sage: sturm_bound(Gamma0(16)) 4 sage: sturm_bound(GammaH(16,[13])) 8 sage: sturm_bound(GammaH(16,[15])) 16 sage: sturm_bound(Gamma1(16)) 32 sage: sturm_bound(Gamma1(13)) 36 sage: sturm_bound(Gamma1(13),5) 72
FURTHER DETAILS: This function 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, 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 (and I'm not sure what the modification is).
Author: William Stein