EXAMPLES (computation of base ring): Return the base ring of this space of modular forms.
EXAMPLES: For spaces of modular forms for or
, the default base ring is
:
sage: ModularForms(11,2).base_ring()
Rational Field
sage: ModularForms(1,12).base_ring()
Rational Field
sage: CuspForms(Gamma1(13),3).base_ring()
Rational Field
The base ring can be explicitly specified in the constructor function.
sage: ModularForms(11,2,base_ring=GF(13)).base_ring()
Finite Field of size 13
For modular forms with character the default base ring is the field generated by the image of the character.
sage: ModularForms(DirichletGroup(13).0,3).base_ring()
Cyclotomic Field of order 12 and degree 4
For example, if the character is quadratic then the field is
(if the characteristic is
).
sage: ModularForms(DirichletGroup(13).0^6,3).base_ring()
Rational Field
An example in characteristic :
sage: ModularForms(13,3,base_ring=GF(7)).base_ring()
Finite Field of size 7
Bases: sage.modular.hecke.module.HeckeModule_generic
A generic space of modular forms.
Return the base extension of self to base_ring. This first checks whether there is a canonical coercion defined, and if so it calls the change_ring method.
EXAMPLE:
sage: N = ModularForms(6, 4)
sage: N.base_extend(CyclotomicField(7))
Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Cyclotomic Field of order 7 and degree 6
sage: m = ModularForms(DirichletGroup(13).0^2,2); m
Modular Forms space of dimension 3, character [zeta6] and weight 2 over Cyclotomic Field of order 6 and degree 2
sage: m.base_extend(CyclotomicField(12))
Modular Forms space of dimension 3, character [zeta6] and weight 2 over Cyclotomic Field of order 12 and degree 4
sage: chi = DirichletGroup(109, CyclotomicField(3)).0
sage: S3 = CuspForms(chi, 2)
sage: S9 = S3.base_extend(CyclotomicField(9))
sage: S9
Cuspidal subspace of dimension 8 of Modular Forms space of dimension 10, character [zeta3 + 1] and weight 2 over Cyclotomic Field of order 9 and degree 6
sage: S9.has_coerce_map_from(S3) # not implemented
True
sage: S9.base_extend(CyclotomicField(3))
...
ValueError: No coercion defined
Return a basis for self.
EXAMPLES:
sage: MM = ModularForms(11,2)
sage: MM.basis()
[
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
1 + 12/5*q + 36/5*q^2 + 48/5*q^3 + 84/5*q^4 + 72/5*q^5 + O(q^6)
]
Change the base ring of this space of modular forms. To be implemented in derived classes.
EXAMPLES:
sage: sage.modular.modform.space.ModularFormsSpace(Gamma0(11),2,DirichletGroup(1).0,QQ).change_ring(GF(7))
...
NotImplementedError: This function has not yet been implemented.
Return the Dirichlet character of this space.
EXAMPLES:
sage: M = ModularForms(DirichletGroup(11).0, 3)
sage: M.character()
Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10
sage: s = M.cuspidal_submodule()
sage: s.character()
Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10
sage: CuspForms(DirichletGroup(11).0,3).character()
Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10
Return the cuspidal submodule of self.
EXAMPLES:
sage: N = ModularForms(6,4) ; N
Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.eisenstein_subspace().dimension()
4
sage: N.cuspidal_submodule()
Cuspidal subspace of dimension 1 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.cuspidal_submodule().dimension()
1
Synonym for cuspidal_submodule.
EXAMPLES:
sage: N = ModularForms(6,4) ; N
Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.eisenstein_subspace().dimension()
4
sage: N.cuspidal_subspace()
Cuspidal subspace of dimension 1 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.cuspidal_submodule().dimension()
1
This function returns a list of submodules
corresponding to newforms
of some level dividing the
level of self, such that the direct sum of the submodules equals
self, if possible. The space
is the image under
maps to
of the intersection with
of the space spanned by the conjugates of
, where
is the base ring of self.
TODO: Implement this function.
EXAMPLES:
sage: M = ModularForms(11,2); M.decomposition()
...
NotImplementedError
Return a basis for self in reduced echelon form. This means that if
we view the -expansions of the basis as defining rows of
a matrix (with infinitely many columns), then this matrix is in
reduced echelon form.
EXAMPLES:
sage: M = ModularForms(Gamma0(11),4)
sage: M.echelon_basis()
[
1 + O(q^6),
q - 9*q^4 - 10*q^5 + O(q^6),
q^2 + 6*q^4 + 12*q^5 + O(q^6),
q^3 + q^4 + q^5 + O(q^6)
]
sage: M.cuspidal_subspace().echelon_basis()
[
q + 3*q^3 - 6*q^4 - 7*q^5 + O(q^6),
q^2 - 4*q^3 + 2*q^4 + 8*q^5 + O(q^6)
]
sage: M = ModularForms(SL2Z, 12)
sage: M.echelon_basis()
[
1 + 196560*q^2 + 16773120*q^3 + 398034000*q^4 + 4629381120*q^5 + O(q^6),
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6)
]
sage: M = CuspForms(Gamma0(17),4, prec=10)
sage: M.echelon_basis()
[
q + 2*q^5 - 8*q^7 - 8*q^8 + 7*q^9 + O(q^10),
q^2 - 3/2*q^5 - 7/2*q^6 + 9/2*q^7 + q^8 - 4*q^9 + O(q^10),
q^3 - 2*q^6 + q^7 - 4*q^8 - 2*q^9 + O(q^10),
q^4 - 1/2*q^5 - 5/2*q^6 + 3/2*q^7 + 2*q^9 + O(q^10)
]
Return a space of modular forms isomorphic to self but with basis
of -expansions in reduced echelon form.
This is useful, e.g., the default basis for spaces of modular forms
is rarely in echelon form, but echelon form is useful for quickly
recognizing whether a -expansion is in the space.
EXAMPLES: We first illustrate two ambient spaces and their echelon forms.
sage: M = ModularForms(11)
sage: M.basis()
[
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
1 + 12/5*q + 36/5*q^2 + 48/5*q^3 + 84/5*q^4 + 72/5*q^5 + O(q^6)
]
sage: M.echelon_form().basis()
[
1 + 12*q^2 + 12*q^3 + 12*q^4 + 12*q^5 + O(q^6),
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6)
]
sage: M = ModularForms(Gamma1(6),4)
sage: M.basis()
[
q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6),
1 + O(q^6),
q - 8*q^4 + 126*q^5 + O(q^6),
q^2 + 9*q^4 + O(q^6),
q^3 + O(q^6)
]
sage: M.echelon_form().basis()
[
1 + O(q^6),
q + 94*q^5 + O(q^6),
q^2 + 36*q^5 + O(q^6),
q^3 + O(q^6),
q^4 - 4*q^5 + O(q^6)
]
We create a space with a funny basis then compute the corresponding echelon form.
sage: M = ModularForms(11,4)
sage: M.basis()
[
q + 3*q^3 - 6*q^4 - 7*q^5 + O(q^6),
q^2 - 4*q^3 + 2*q^4 + 8*q^5 + O(q^6),
1 + O(q^6),
q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6)
]
sage: F = M.span_of_basis([M.0 + 1/3*M.1, M.2 + M.3]); F.basis()
[
q + 1/3*q^2 + 5/3*q^3 - 16/3*q^4 - 13/3*q^5 + O(q^6),
1 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6)
]
sage: E = F.echelon_form(); E.basis()
[
1 + 26/3*q^2 + 79/3*q^3 + 235/3*q^4 + 391/3*q^5 + O(q^6),
q + 1/3*q^2 + 5/3*q^3 - 16/3*q^4 - 13/3*q^5 + O(q^6)
]
Compute the Eisenstein series associated to this space.
Note
This function should be overridden by all derived classes.
EXAMPLES:
sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11),2,DirichletGroup(1).0,base_ring=QQ) ; M.eisenstein_series()
...
NotImplementedError: computation of Eisenstein series in this space not yet implemented
Return the Eisenstein submodule for this space of modular forms.
EXAMPLES:
sage: M = ModularForms(11,2)
sage: M.eisenstein_submodule()
Eisenstein subspace of dimension 1 of Modular Forms space of dimension 2 for Congruence Subgroup Gamma0(11) of weight 2 over Rational Field
Synonym for eisenstein_submodule.
EXAMPLES:
sage: M = ModularForms(11,2)
sage: M.eisenstein_subspace()
Eisenstein subspace of dimension 1 of Modular Forms space of dimension 2 for Congruence Subgroup Gamma0(11) of weight 2 over Rational Field
Return the underlying module of self.
EXAMPLES:
sage: N = ModularForms(6,4)
sage: N.dimension()
5
sage: N.embedded_submodule()
Vector space of dimension 5 over Rational Field
INPUT:
OUTPUT: A list of numbers that give f as a linear combination of the basis for this space or of the given forms if independent=True.
Note
If the list of forms is given, they do not have to be in self.
EXAMPLES:
sage: M = ModularForms(11,2)
sage: N = ModularForms(10,2)
sage: M.find_in_space( M.basis()[0] )
[1, 0]
sage: M.find_in_space( N.basis()[0], forms=N.basis() )
[1, 0, 0]
sage: M.find_in_space( N.basis()[0] )
...
ArithmeticError: vector is not in free module
Return the nth generator of self.
EXAMPLES:
sage: N = ModularForms(6,4)
sage: N.basis()
[
q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6),
1 + O(q^6),
q - 8*q^4 + 126*q^5 + O(q^6),
q^2 + 9*q^4 + O(q^6),
q^3 + O(q^6)
]
sage: N.gen(0)
q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6)
sage: N.gen(4)
q^3 + O(q^6)
sage: N.gen(5)
...
ValueError: Generator 5 not defined
Return a complete set of generators for self.
EXAMPLES:
sage: N = ModularForms(6,4)
sage: N.gens()
[
q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6),
1 + O(q^6),
q - 8*q^4 + 126*q^5 + O(q^6),
q^2 + 9*q^4 + O(q^6),
q^3 + O(q^6)
]
Return the congruence subgroup associated to this space of modular forms.
EXAMPLES:
sage: ModularForms(Gamma0(12),4).group()
Congruence Subgroup Gamma0(12)
sage: CuspForms(Gamma1(113),2).group()
Congruence Subgroup Gamma1(113)
Note that and
are replaced by
.
sage: CuspForms(Gamma1(1),12).group()
Modular Group SL(2,Z)
sage: CuspForms(SL2Z,12).group()
Modular Group SL(2,Z)
Return True if this space of modular forms has a specific character.
This is True exactly when the character() function does not return None.
EXAMPLES: A space for has trivial character,
hence has a character.
sage: CuspForms(Gamma0(11),2).has_character()
True
A space for (for
) never
has a specific character.
sage: CuspForms(Gamma1(11),2).has_character()
False
sage: CuspForms(DirichletGroup(11).0,3).has_character()
True
Code to make ModularFormsSpace work well with coercion framework.
EXAMPLES:
sage: M = ModularForms(22,2)
sage: M.has_coerce_map_from_impl(M.cuspidal_subspace())
True
sage: M.has_coerce_map_from(ModularForms(22,4))
False
Return an integral basis for this space of modular forms.
EXAMPLES: In this example the integral and echelon bases are different.
sage: m = ModularForms(97,2,prec=10)
sage: s = m.cuspidal_subspace()
sage: s.integral_basis()
[
q + 2*q^7 + 4*q^8 - 2*q^9 + O(q^10),
q^2 + q^4 + q^7 + 3*q^8 - 3*q^9 + O(q^10),
q^3 + q^4 - 3*q^8 + q^9 + O(q^10),
2*q^4 - 2*q^8 + O(q^10),
q^5 - 2*q^8 + 2*q^9 + O(q^10),
q^6 + 2*q^7 + 5*q^8 - 5*q^9 + O(q^10),
3*q^7 + 6*q^8 - 4*q^9 + O(q^10)
]
sage: s.echelon_basis()
[
q + 2/3*q^9 + O(q^10),
q^2 + 2*q^8 - 5/3*q^9 + O(q^10),
q^3 - 2*q^8 + q^9 + O(q^10),
q^4 - q^8 + O(q^10),
q^5 - 2*q^8 + 2*q^9 + O(q^10),
q^6 + q^8 - 7/3*q^9 + O(q^10),
q^7 + 2*q^8 - 4/3*q^9 + O(q^10)
]
Here’s another example where there is a big gap in the valuations:
sage: m = CuspForms(64,2)
sage: m.integral_basis()
[
q + O(q^6),
q^2 + O(q^6),
q^5 + O(q^6)
]
TESTS:
sage: m = CuspForms(11*2^4,2, prec=13); m
Cuspidal subspace of dimension 19 of Modular Forms space of dimension 30 for Congruence Subgroup Gamma0(176) of weight 2 over Rational Field
sage: m.integral_basis() # takes a long time (3 or 4 seconds)
[
q + O(q^13),
q^2 + O(q^13),
q^3 + O(q^13),
q^4 + O(q^13),
q^5 + O(q^13),
q^6 + O(q^13),
q^7 + O(q^13),
q^8 + O(q^13),
q^9 + O(q^13),
q^10 + O(q^13),
q^11 + O(q^13),
q^12 + O(q^13),
O(q^13),
O(q^13),
O(q^13),
O(q^13),
O(q^13),
O(q^13),
O(q^13)
]
Return True if this an ambient space of modular forms.
EXAMPLES:
sage: M = ModularForms(Gamma1(4),4)
sage: M.is_ambient()
True
sage: E = M.eisenstein_subspace()
sage: E.is_ambient()
False
Return the level of self.
EXAMPLES:
sage: M = ModularForms(47,3)
sage: M.level()
47
Return the space of modular symbols corresponding to self with the given sign.
EXAMPLES:
sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11),2,DirichletGroup(1).0,base_ring=QQ) ; M.modular_symbols()
...
NotImplementedError: computation of associated modular symbols space not yet implemented
Return the new submodule of self. If p is specified, return the p-new submodule of self.
Note
This function should be overridden by all derived classes.
EXAMPLES:
sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11),2,DirichletGroup(1).0,base_ring=QQ) ; M.new_submodule()
...
NotImplementedError: computation of new submodule not yet implemented
Synonym for new_submodule.
EXAMPLES:
sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11),2,DirichletGroup(1).0,base_ring=QQ) ; M.new_subspace()
...
NotImplementedError: computation of new submodule not yet implemented
Return all newforms in the cuspidal subspace of self.
EXAMPLES:
sage: CuspForms(18,4).newforms()
[q + 2*q^2 + 4*q^4 - 6*q^5 + O(q^6)]
sage: CuspForms(32,4).newforms()
[q - 8*q^3 - 10*q^5 + O(q^6), q + 22*q^5 + O(q^6), q + 8*q^3 - 10*q^5 + O(q^6)]
sage: CuspForms(23).newforms('b')
[q + b0*q^2 + (-2*b0 - 1)*q^3 + (-b0 - 1)*q^4 + 2*b0*q^5 + O(q^6)]
sage: CuspForms(23).newforms()
...
ValueError: Please specify a name to be used when generating names for generators of Hecke eigenvalue fields corresponding to the newforms.
Return or set the default precision used for displaying
-expansions of elements of this space.
INPUT:
OUTPUT: if new_prec is None, returns the current precision.
EXAMPLES:
sage: M = ModularForms(1,12)
sage: S = M.cuspidal_subspace()
sage: S.prec()
6
sage: S.basis()
[
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6)
]
sage: S.prec(8)
8
sage: S.basis()
[
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^8)
]
Return the echelon form of the basis of -expansions of
self up to precision prec.
The -expansions are power series (not actual modular
forms). The number of
-expansions returned equals the
dimension.
EXAMPLES:
sage: M = ModularForms(11,2)
sage: M.q_expansion_basis()
[
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
1 + 12/5*q + 36/5*q^2 + 48/5*q^3 + 84/5*q^4 + 72/5*q^5 + O(q^6)
]
sage: M.q_echelon_basis()
[
1 + 12*q^2 + 12*q^3 + 12*q^4 + 12*q^5 + O(q^6),
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6)
]
Return a sequence of q-expansions for the basis of this space computed to the given input precision.
INPUT:
If prec is None, the prec is computed to be at least large enough so that each q-expansion determines the form as an element of this space.
Note
In fact, the q-expansion basis is always computed to at least self.prec().
EXAMPLES:
sage: S = ModularForms(11,2).cuspidal_submodule()
sage: S.q_expansion_basis()
[
q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6)
]
sage: S.q_expansion_basis(5)
[
q - 2*q^2 - q^3 + 2*q^4 + O(q^5)
]
sage: S = ModularForms(1,24).cuspidal_submodule()
sage: S.q_expansion_basis(8)
[
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)
]
Return a -reduced echelon basis of
-expansions for self.
The -expansions are power series with coefficients in
; they are not actual modular forms.
The base ring of self must be . The number of
-expansions returned equals the dimension.
EXAMPLES:
sage: S = CuspForms(11,2)
sage: S.q_integral_basis(5)
[
q - 2*q^2 - q^3 + 2*q^4 + O(q^5)
]
Set the default precision used for displaying
-expansions.
INPUT:
EXAMPLES:
sage: M = ModularForms(Gamma0(37),2)
sage: M.set_precision(10)
sage: S = M.cuspidal_subspace()
sage: S.basis()
[
q + q^3 - 2*q^4 - q^7 - 2*q^9 + O(q^10),
q^2 + 2*q^3 - 2*q^4 + q^5 - 3*q^6 - 4*q^9 + O(q^10)
]
sage: S.set_precision(0)
sage: S.basis()
[
O(q^0),
O(q^0)
]
The precision of subspaces is the same as the precision of the ambient space.
sage: S.set_precision(2)
sage: M.basis()
[
q + O(q^2),
O(q^2),
1 + 2/3*q + O(q^2)
]
The precision must be nonnegative:
sage: S.set_precision(-1)
...
ValueError: n (=-1) must be >= 0
We do another example with nontrivial character.
sage: M = ModularForms(DirichletGroup(13).0^2)
sage: M.set_precision(10)
sage: M.cuspidal_subspace().0
q + (-zeta6 - 1)*q^2 + (2*zeta6 - 2)*q^3 + zeta6*q^4 + (-2*zeta6 + 1)*q^5 + (-2*zeta6 + 4)*q^6 + (2*zeta6 - 1)*q^8 - zeta6*q^9 + O(q^10)
Take a set B of forms, and return the subspace of self with B as a basis.
EXAMPLES:
sage: N = ModularForms(6,4) ; N
Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis([N.basis()[0]])
Modular Forms subspace of dimension 1 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis([N.basis()[0], N.basis()[1]])
Modular Forms subspace of dimension 2 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis( N.basis() )
Modular Forms subspace of dimension 5 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
Take a set B of forms, and return the subspace of self with B as a basis.
EXAMPLES:
sage: N = ModularForms(6,4) ; N
Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis([N.basis()[0]])
Modular Forms subspace of dimension 1 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis([N.basis()[0], N.basis()[1]])
Modular Forms subspace of dimension 2 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
sage: N.span_of_basis( N.basis() )
Modular Forms subspace of dimension 5 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
For a space M of modular forms, this function returns an integer B
such that two modular forms in either self or M are equal if and
only if their q-expansions are equal to precision B (note that this
is 1+ the usual Sturm bound, since has
precision prec). If M is none, then M is set equal to self.
EXAMPLES:
sage: S37=CuspForms(37,2)
sage: S37.sturm_bound()
8
sage: M = ModularForms(11,2)
sage: M.sturm_bound()
3
sage: ModularForms(Gamma1(15),2).sturm_bound()
33
sage: CuspForms(Gamma1(144), 3).sturm_bound()
3457
sage: CuspForms(DirichletGroup(144).1^2, 3).sturm_bound()
73
sage: CuspForms(Gamma0(144), 3).sturm_bound()
73
REFERENCE:
NOTE:
Kevin Buzzard pointed out to me (William Stein) in Fall 2002 that
the above bound is fine for Gamma1 with character, as one sees by
taking a power of . More precisely, if
for first
coefficients, then
for first
coefficients.
Since the weight of
is
, it follows that if
the Sturm bound for
at
weight(f), then
has valuation large enough to be
forced to be
at
weight(f) by Sturm
bound (which is valid if we choose
right). 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 is wrong.
This bound works over any base, even a finite field. There might be
much better bounds over , or for comparing two
eigenforms.
Return the weight of this space of modular forms.
EXAMPLES:
sage: M = ModularForms(Gamma1(13),11)
sage: M.weight()
11
sage: M = ModularForms(Gamma0(997),100)
sage: M.weight()
100
sage: M = ModularForms(Gamma0(97),4)
sage: M.weight()
4
sage: M.eisenstein_submodule().weight()
4
Determine whether or not V contains every element of B. Used here for linear algebra, but works very generally.
EXAMPLES:
sage: contains_each = sage.modular.modform.space.contains_each
sage: contains_each( range(20), prime_range(20) )
True
sage: contains_each( range(20), range(30) )
False
Return True if x is a `ModularFormsSpace`.
EXAMPLES:
sage: from sage.modular.modform.space import is_ModularFormsSpace
sage: is_ModularFormsSpace(ModularForms(11,2))
True
sage: is_ModularFormsSpace(CuspForms(11,2))
True
sage: is_ModularFormsSpace(3)
False