Generic spaces of modular forms¶
EXAMPLES (computation of base ring): Return the base ring of this space of modular forms.
EXAMPLES: For spaces of modular forms for \(\Gamma_0(N)\) or \(\Gamma_1(N)\), the default base ring is \(\QQ\):
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
>>> from sage.all import *
>>> ModularForms(Integer(11),Integer(2)).base_ring()
Rational Field
>>> ModularForms(Integer(1),Integer(12)).base_ring()
Rational Field
>>> CuspForms(Gamma1(Integer(13)),Integer(3)).base_ring()
Rational Field
ModularForms(11,2).base_ring() ModularForms(1,12).base_ring() CuspForms(Gamma1(13),3).base_ring()
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
>>> from sage.all import *
>>> ModularForms(Integer(11),Integer(2),base_ring=GF(Integer(13))).base_ring()
Finite Field of size 13
ModularForms(11,2,base_ring=GF(13)).base_ring()
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
>>> from sage.all import *
>>> ModularForms(DirichletGroup(Integer(13)).gen(0),Integer(3)).base_ring()
Cyclotomic Field of order 12 and degree 4
ModularForms(DirichletGroup(13).0,3).base_ring()
For example, if the character is quadratic then the field is \(\QQ\) (if the characteristic is \(0\)).
sage: ModularForms(DirichletGroup(13).0^6,3).base_ring()
Rational Field
>>> from sage.all import *
>>> ModularForms(DirichletGroup(Integer(13)).gen(0)**Integer(6),Integer(3)).base_ring()
Rational Field
ModularForms(DirichletGroup(13).0^6,3).base_ring()
An example in characteristic \(7\):
sage: ModularForms(13,3,base_ring=GF(7)).base_ring()
Finite Field of size 7
>>> from sage.all import *
>>> ModularForms(Integer(13),Integer(3),base_ring=GF(Integer(7))).base_ring()
Finite Field of size 7
ModularForms(13,3,base_ring=GF(7)).base_ring()
AUTHORS:
William Stein (2007): first version
- class sage.modular.modform.space.ModularFormsSpace(group, weight, character, base_ring, category=None)[source]¶
Bases:
HeckeModule_generic
A generic space of modular forms.
- Element[source]¶
alias of
ModularFormElement
- basis()[source]¶
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) ]
>>> from sage.all import * >>> MM = ModularForms(Integer(11),Integer(2)) >>> 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) ]
MM = ModularForms(11,2) MM.basis()
- character()[source]¶
Return the Dirichlet character corresponding to this space of modular forms. Returns None if there is no specific character corresponding to this space, e.g., if this is a space of modular forms on \(\Gamma_1(N)\) with \(N>1\).
EXAMPLES: The trivial character:
sage: ModularForms(Gamma0(11),2).character() Dirichlet character modulo 11 of conductor 1 mapping 2 |--> 1
>>> from sage.all import * >>> ModularForms(Gamma0(Integer(11)),Integer(2)).character() Dirichlet character modulo 11 of conductor 1 mapping 2 |--> 1
ModularForms(Gamma0(11),2).character()
Spaces of forms with nontrivial character:
sage: ModularForms(DirichletGroup(20).0,3).character() Dirichlet character modulo 20 of conductor 4 mapping 11 |--> -1, 17 |--> 1 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
>>> from sage.all import * >>> ModularForms(DirichletGroup(Integer(20)).gen(0),Integer(3)).character() Dirichlet character modulo 20 of conductor 4 mapping 11 |--> -1, 17 |--> 1 >>> M = ModularForms(DirichletGroup(Integer(11)).gen(0), Integer(3)) >>> M.character() Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10 >>> s = M.cuspidal_submodule() >>> s.character() Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10 >>> CuspForms(DirichletGroup(Integer(11)).gen(0),Integer(3)).character() Dirichlet character modulo 11 of conductor 11 mapping 2 |--> zeta10
ModularForms(DirichletGroup(20).0,3).character() M = ModularForms(DirichletGroup(11).0, 3) M.character() s = M.cuspidal_submodule() s.character() CuspForms(DirichletGroup(11).0,3).character()
A space of forms with no particular character (hence None is returned):
sage: print(ModularForms(Gamma1(11),2).character()) None
>>> from sage.all import * >>> print(ModularForms(Gamma1(Integer(11)),Integer(2)).character()) None
print(ModularForms(Gamma1(11),2).character())
If the level is one then the character is trivial.
sage: ModularForms(Gamma1(1),12).character() Dirichlet character modulo 1 of conductor 1
>>> from sage.all import * >>> ModularForms(Gamma1(Integer(1)),Integer(12)).character() Dirichlet character modulo 1 of conductor 1
ModularForms(Gamma1(1),12).character()
- cuspidal_submodule()[source]¶
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
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) ; N Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field >>> N.eisenstein_subspace().dimension() 4
N = ModularForms(6,4) ; N N.eisenstein_subspace().dimension()
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
>>> from sage.all import * >>> 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
N.cuspidal_submodule()
>>> from sage.all import * >>> 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
N.cuspidal_submodule()
sage: N.cuspidal_submodule().dimension() 1
>>> from sage.all import * >>> N.cuspidal_submodule().dimension() 1
N.cuspidal_submodule().dimension()
>>> from sage.all import * >>> N.cuspidal_submodule().dimension() 1
N.cuspidal_submodule().dimension()
We check that a bug noticed on Issue #10450 is fixed:
sage: M = ModularForms(6, 10) sage: W = M.span_of_basis(M.basis()[0:2]) sage: W.cuspidal_submodule() Modular Forms subspace of dimension 2 of Modular Forms space of dimension 11 for Congruence Subgroup Gamma0(6) of weight 10 over Rational Field
>>> from sage.all import * >>> M = ModularForms(Integer(6), Integer(10)) >>> W = M.span_of_basis(M.basis()[Integer(0):Integer(2)]) >>> W.cuspidal_submodule() Modular Forms subspace of dimension 2 of Modular Forms space of dimension 11 for Congruence Subgroup Gamma0(6) of weight 10 over Rational Field
M = ModularForms(6, 10) W = M.span_of_basis(M.basis()[0:2]) W.cuspidal_submodule()
- cuspidal_subspace()[source]¶
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
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) ; N Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field >>> N.eisenstein_subspace().dimension() 4
N = ModularForms(6,4) ; N N.eisenstein_subspace().dimension()
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
>>> from sage.all import * >>> 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
N.cuspidal_subspace()
>>> from sage.all import * >>> 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
N.cuspidal_subspace()
sage: N.cuspidal_submodule().dimension() 1
>>> from sage.all import * >>> N.cuspidal_submodule().dimension() 1
N.cuspidal_submodule().dimension()
>>> from sage.all import * >>> N.cuspidal_submodule().dimension() 1
N.cuspidal_submodule().dimension()
- decomposition()[source]¶
This function returns a list of submodules \(V(f_i,t)\) corresponding to newforms \(f_i\) of some level dividing the level of self, such that the direct sum of the submodules equals self, if possible. The space \(V(f_i,t)\) is the image under \(g(q)\) maps to \(g(q^t)\) of the intersection with \(R[[q]]\) of the space spanned by the conjugates of \(f_i\), where \(R\) is the base ring of
self
.TODO: Implement this function.
EXAMPLES:
sage: M = ModularForms(11,2); M.decomposition() Traceback (most recent call last): ... NotImplementedError
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(2)); M.decomposition() Traceback (most recent call last): ... NotImplementedError
M = ModularForms(11,2); M.decomposition()
- echelon_basis()[source]¶
Return a basis for
self
in reduced echelon form. This means that if we view the \(q\)-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) ]
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(11)),Integer(4)) >>> 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) ] >>> 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) ]
M = ModularForms(Gamma0(11),4) M.echelon_basis() M.cuspidal_subspace().echelon_basis()
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) ]
>>> from sage.all import * >>> M = ModularForms(SL2Z, Integer(12)) >>> 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) ]
M = ModularForms(SL2Z, 12) M.echelon_basis()
>>> from sage.all import * >>> M = ModularForms(SL2Z, Integer(12)) >>> 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) ]
M = ModularForms(SL2Z, 12) M.echelon_basis()
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) ]
>>> from sage.all import * >>> M = CuspForms(Gamma0(Integer(17)),Integer(4), prec=Integer(10)) >>> 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) ]
M = CuspForms(Gamma0(17),4, prec=10) M.echelon_basis()
>>> from sage.all import * >>> M = CuspForms(Gamma0(Integer(17)),Integer(4), prec=Integer(10)) >>> 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) ]
M = CuspForms(Gamma0(17),4, prec=10) M.echelon_basis()
- echelon_form()[source]¶
Return a space of modular forms isomorphic to
self
but with basis of \(q\)-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 \(q\)-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) ]
>>> from sage.all import * >>> M = ModularForms(Integer(11)) >>> 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) ] >>> 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) ]
M = ModularForms(11) M.basis() M.echelon_form().basis()
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) ]
>>> from sage.all import * >>> M = ModularForms(Gamma1(Integer(6)),Integer(4)) >>> 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) ] >>> 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) ]
M = ModularForms(Gamma1(6),4) M.basis() M.echelon_form().basis()
>>> from sage.all import * >>> M = ModularForms(Gamma1(Integer(6)),Integer(4)) >>> 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) ] >>> 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) ]
M = ModularForms(Gamma1(6),4) M.basis() M.echelon_form().basis()
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) ]
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(4)) >>> 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) ] >>> F = M.span_of_basis([M.gen(0) + Integer(1)/Integer(3)*M.gen(1), M.gen(2) + M.gen(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) ] >>> 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) ]
M = ModularForms(11,4) M.basis() F = M.span_of_basis([M.0 + 1/3*M.1, M.2 + M.3]); F.basis() E = F.echelon_form(); E.basis()
- eisenstein_series()[source]¶
Compute the Eisenstein series associated to this space.
Note
This function should be overridden by all derived classes.
EXAMPLES:
sage: # needs sage.rings.number_field sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.eisenstein_series() Traceback (most recent call last): ... NotImplementedError: computation of Eisenstein series in this space not yet implemented
>>> from sage.all import * >>> # needs sage.rings.number_field >>> M = sage.modular.modform.space.ModularFormsSpace(Gamma0(Integer(11)), Integer(2), DirichletGroup(Integer(1))[Integer(0)], base_ring=QQ); M.eisenstein_series() Traceback (most recent call last): ... NotImplementedError: computation of Eisenstein series in this space not yet implemented
# needs sage.rings.number_field M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.eisenstein_series()
- eisenstein_submodule()[source]¶
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
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(2)) >>> 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
M = ModularForms(11,2) M.eisenstein_submodule()
We check that a bug noticed on Issue #10450 is fixed:
sage: M = ModularForms(6, 10) sage: W = M.span_of_basis(M.basis()[0:2]) sage: W.eisenstein_submodule() Modular Forms subspace of dimension 0 of Modular Forms space of dimension 11 for Congruence Subgroup Gamma0(6) of weight 10 over Rational Field
>>> from sage.all import * >>> M = ModularForms(Integer(6), Integer(10)) >>> W = M.span_of_basis(M.basis()[Integer(0):Integer(2)]) >>> W.eisenstein_submodule() Modular Forms subspace of dimension 0 of Modular Forms space of dimension 11 for Congruence Subgroup Gamma0(6) of weight 10 over Rational Field
M = ModularForms(6, 10) W = M.span_of_basis(M.basis()[0:2]) W.eisenstein_submodule()
- eisenstein_subspace()[source]¶
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
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(2)) >>> 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
M = ModularForms(11,2) M.eisenstein_subspace()
- embedded_submodule()[source]¶
Return the underlying module of
self
.EXAMPLES:
sage: N = ModularForms(6,4) sage: N.dimension() 5
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) >>> N.dimension() 5
N = ModularForms(6,4) N.dimension()
sage: N.embedded_submodule() Vector space of dimension 5 over Rational Field
>>> from sage.all import * >>> N.embedded_submodule() Vector space of dimension 5 over Rational Field
N.embedded_submodule()
>>> from sage.all import * >>> N.embedded_submodule() Vector space of dimension 5 over Rational Field
N.embedded_submodule()
- find_in_space(f, forms=None, prec=None, indep=True)[source]¶
INPUT:
f
– a modular form or power seriesforms
– (default:None
) a specific list of modular forms or \(q\)-expansionsprec
– if forms are given, compute with them to the given precisionindep
– boolean (default:True
); whether the given list of forms are assumed to form a basis
OUTPUT: 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]
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(2)) >>> N = ModularForms(Integer(10),Integer(2)) >>> M.find_in_space( M.basis()[Integer(0)] ) [1, 0]
M = ModularForms(11,2) N = ModularForms(10,2) M.find_in_space( M.basis()[0] )
sage: M.find_in_space( N.basis()[0], forms=N.basis() ) [1, 0, 0]
>>> from sage.all import * >>> M.find_in_space( N.basis()[Integer(0)], forms=N.basis() ) [1, 0, 0]
M.find_in_space( N.basis()[0], forms=N.basis() )
>>> from sage.all import * >>> M.find_in_space( N.basis()[Integer(0)], forms=N.basis() ) [1, 0, 0]
M.find_in_space( N.basis()[0], forms=N.basis() )
sage: M.find_in_space( N.basis()[0] ) Traceback (most recent call last): ... ArithmeticError: vector is not in free module
>>> from sage.all import * >>> M.find_in_space( N.basis()[Integer(0)] ) Traceback (most recent call last): ... ArithmeticError: vector is not in free module
M.find_in_space( N.basis()[0] )
>>> from sage.all import * >>> M.find_in_space( N.basis()[Integer(0)] ) Traceback (most recent call last): ... ArithmeticError: vector is not in free module
M.find_in_space( N.basis()[0] )
- gen(n)[source]¶
Return the \(n\)-th 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) ]
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) >>> 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) ]
N = ModularForms(6,4) N.basis()
sage: N.gen(0) q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6)
>>> from sage.all import * >>> N.gen(Integer(0)) q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6)
N.gen(0)
>>> from sage.all import * >>> N.gen(Integer(0)) q - 2*q^2 - 3*q^3 + 4*q^4 + 6*q^5 + O(q^6)
N.gen(0)
sage: N.gen(4) q^3 + O(q^6)
>>> from sage.all import * >>> N.gen(Integer(4)) q^3 + O(q^6)
N.gen(4)
>>> from sage.all import * >>> N.gen(Integer(4)) q^3 + O(q^6)
N.gen(4)
sage: N.gen(5) Traceback (most recent call last): ... ValueError: Generator 5 not defined
>>> from sage.all import * >>> N.gen(Integer(5)) Traceback (most recent call last): ... ValueError: Generator 5 not defined
N.gen(5)
>>> from sage.all import * >>> N.gen(Integer(5)) Traceback (most recent call last): ... ValueError: Generator 5 not defined
N.gen(5)
- gens()[source]¶
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) ]
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) >>> 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) ]
N = ModularForms(6,4) N.gens()
- group()[source]¶
Return the congruence subgroup associated to this space of modular forms.
EXAMPLES:
sage: ModularForms(Gamma0(12),4).group() Congruence Subgroup Gamma0(12)
>>> from sage.all import * >>> ModularForms(Gamma0(Integer(12)),Integer(4)).group() Congruence Subgroup Gamma0(12)
ModularForms(Gamma0(12),4).group()
sage: CuspForms(Gamma1(113),2).group() Congruence Subgroup Gamma1(113)
>>> from sage.all import * >>> CuspForms(Gamma1(Integer(113)),Integer(2)).group() Congruence Subgroup Gamma1(113)
CuspForms(Gamma1(113),2).group()
>>> from sage.all import * >>> CuspForms(Gamma1(Integer(113)),Integer(2)).group() Congruence Subgroup Gamma1(113)
CuspForms(Gamma1(113),2).group()
Note that \(\Gamma_1(1)\) and \(\Gamma_0(1)\) are replaced by \(\SL_2(\ZZ)\).
sage: CuspForms(Gamma1(1),12).group() Modular Group SL(2,Z) sage: CuspForms(SL2Z,12).group() Modular Group SL(2,Z)
>>> from sage.all import * >>> CuspForms(Gamma1(Integer(1)),Integer(12)).group() Modular Group SL(2,Z) >>> CuspForms(SL2Z,Integer(12)).group() Modular Group SL(2,Z)
CuspForms(Gamma1(1),12).group() CuspForms(SL2Z,12).group()
- has_character()[source]¶
Return
True
if this space of modular forms has a specific character.This is
True
exactly when thecharacter()
function does not returnNone
.EXAMPLES: A space for \(\Gamma_0(N)\) has trivial character, hence has a character.
sage: CuspForms(Gamma0(11),2).has_character() True
>>> from sage.all import * >>> CuspForms(Gamma0(Integer(11)),Integer(2)).has_character() True
CuspForms(Gamma0(11),2).has_character()
A space for \(\Gamma_1(N)\) (for \(N\geq 2\)) never has a specific character.
sage: CuspForms(Gamma1(11),2).has_character() False sage: CuspForms(DirichletGroup(11).0,3).has_character() True
>>> from sage.all import * >>> CuspForms(Gamma1(Integer(11)),Integer(2)).has_character() False >>> CuspForms(DirichletGroup(Integer(11)).gen(0),Integer(3)).has_character() True
CuspForms(Gamma1(11),2).has_character() CuspForms(DirichletGroup(11).0,3).has_character()
- integral_basis()[source]¶
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) ]
>>> from sage.all import * >>> m = ModularForms(Integer(97),Integer(2),prec=Integer(10)) >>> s = m.cuspidal_subspace() >>> 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) ] >>> 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) ]
m = ModularForms(97,2,prec=10) s = m.cuspidal_subspace() s.integral_basis() s.echelon_basis()
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) ]
>>> from sage.all import * >>> m = CuspForms(Integer(64),Integer(2)) >>> m.integral_basis() [ q + O(q^6), q^2 + O(q^6), q^5 + O(q^6) ]
m = CuspForms(64,2) m.integral_basis()
- is_ambient()[source]¶
Return
True
if this an ambient space of modular forms.EXAMPLES:
sage: M = ModularForms(Gamma1(4),4) sage: M.is_ambient() True
>>> from sage.all import * >>> M = ModularForms(Gamma1(Integer(4)),Integer(4)) >>> M.is_ambient() True
M = ModularForms(Gamma1(4),4) M.is_ambient()
sage: E = M.eisenstein_subspace() sage: E.is_ambient() False
>>> from sage.all import * >>> E = M.eisenstein_subspace() >>> E.is_ambient() False
E = M.eisenstein_subspace() E.is_ambient()
>>> from sage.all import * >>> E = M.eisenstein_subspace() >>> E.is_ambient() False
E = M.eisenstein_subspace() E.is_ambient()
- is_cuspidal()[source]¶
Return
True
if this space is cuspidal.EXAMPLES:
sage: M = ModularForms(Gamma0(11), 2).new_submodule() sage: M.is_cuspidal() False sage: M.cuspidal_submodule().is_cuspidal() True
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(11)), Integer(2)).new_submodule() >>> M.is_cuspidal() False >>> M.cuspidal_submodule().is_cuspidal() True
M = ModularForms(Gamma0(11), 2).new_submodule() M.is_cuspidal() M.cuspidal_submodule().is_cuspidal()
- is_eisenstein()[source]¶
Return
True
if this space is Eisenstein.EXAMPLES:
sage: M = ModularForms(Gamma0(11), 2).new_submodule() sage: M.is_eisenstein() False sage: M.eisenstein_submodule().is_eisenstein() True
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(11)), Integer(2)).new_submodule() >>> M.is_eisenstein() False >>> M.eisenstein_submodule().is_eisenstein() True
M = ModularForms(Gamma0(11), 2).new_submodule() M.is_eisenstein() M.eisenstein_submodule().is_eisenstein()
- level()[source]¶
Return the level of
self
.EXAMPLES:
sage: M = ModularForms(47,3) sage: M.level() 47
>>> from sage.all import * >>> M = ModularForms(Integer(47),Integer(3)) >>> M.level() 47
M = ModularForms(47,3) M.level()
- modular_symbols(sign=0)[source]¶
Return the space of modular symbols corresponding to
self
with the given sign.Note
This function should be overridden by all derived classes.
EXAMPLES:
sage: # needs sage.rings.number_field sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.modular_symbols() Traceback (most recent call last): ... NotImplementedError: computation of associated modular symbols space not yet implemented
>>> from sage.all import * >>> # needs sage.rings.number_field >>> M = sage.modular.modform.space.ModularFormsSpace(Gamma0(Integer(11)), Integer(2), DirichletGroup(Integer(1))[Integer(0)], base_ring=QQ); M.modular_symbols() Traceback (most recent call last): ... NotImplementedError: computation of associated modular symbols space not yet implemented
# needs sage.rings.number_field M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.modular_symbols()
- new_submodule(p=None)[source]¶
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: # needs sage.rings.number_field sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.new_submodule() Traceback (most recent call last): ... NotImplementedError: computation of new submodule not yet implemented
>>> from sage.all import * >>> # needs sage.rings.number_field >>> M = sage.modular.modform.space.ModularFormsSpace(Gamma0(Integer(11)), Integer(2), DirichletGroup(Integer(1))[Integer(0)], base_ring=QQ); M.new_submodule() Traceback (most recent call last): ... NotImplementedError: computation of new submodule not yet implemented
# needs sage.rings.number_field M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.new_submodule()
- new_subspace(p=None)[source]¶
Synonym for new_submodule.
EXAMPLES:
sage: # needs sage.rings.number_field sage: M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.new_subspace() Traceback (most recent call last): ... NotImplementedError: computation of new submodule not yet implemented
>>> from sage.all import * >>> # needs sage.rings.number_field >>> M = sage.modular.modform.space.ModularFormsSpace(Gamma0(Integer(11)), Integer(2), DirichletGroup(Integer(1))[Integer(0)], base_ring=QQ); M.new_subspace() Traceback (most recent call last): ... NotImplementedError: computation of new submodule not yet implemented
# needs sage.rings.number_field M = sage.modular.modform.space.ModularFormsSpace(Gamma0(11), 2, DirichletGroup(1)[0], base_ring=QQ); M.new_subspace()
- newforms(names=None)[source]¶
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() Traceback (most recent call last): ... ValueError: Please specify a name to be used when generating names for generators of Hecke eigenvalue fields corresponding to the newforms.
>>> from sage.all import * >>> CuspForms(Integer(18),Integer(4)).newforms() [q + 2*q^2 + 4*q^4 - 6*q^5 + O(q^6)] >>> CuspForms(Integer(32),Integer(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)] >>> CuspForms(Integer(23)).newforms('b') [q + b0*q^2 + (-2*b0 - 1)*q^3 + (-b0 - 1)*q^4 + 2*b0*q^5 + O(q^6)] >>> CuspForms(Integer(23)).newforms() Traceback (most recent call last): ... ValueError: Please specify a name to be used when generating names for generators of Hecke eigenvalue fields corresponding to the newforms.
CuspForms(18,4).newforms() CuspForms(32,4).newforms() CuspForms(23).newforms('b') CuspForms(23).newforms()
- prec(new_prec=None)[source]¶
Return or set the default precision used for displaying \(q\)-expansions of elements of this space.
INPUT:
new_prec
– positive integer (default:None
)
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) ]
>>> from sage.all import * >>> M = ModularForms(Integer(1),Integer(12)) >>> S = M.cuspidal_subspace() >>> S.prec() 6 >>> S.basis() [ q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6) ] >>> S.prec(Integer(8)) 8 >>> S.basis() [ q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^8) ]
M = ModularForms(1,12) S = M.cuspidal_subspace() S.prec() S.basis() S.prec(8) S.basis()
- q_echelon_basis(prec=None)[source]¶
Return the echelon form of the basis of \(q\)-expansions of
self
up to precisionprec
.The \(q\)-expansions are power series (not actual modular forms). The number of \(q\)-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) ]
>>> from sage.all import * >>> M = ModularForms(Integer(11),Integer(2)) >>> 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) ]
M = ModularForms(11,2) M.q_expansion_basis()
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) ]
>>> from sage.all import * >>> 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) ]
M.q_echelon_basis()
>>> from sage.all import * >>> 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) ]
M.q_echelon_basis()
- q_expansion_basis(prec=None)[source]¶
Return a sequence of \(q\)-expansions for the basis of this space computed to the given input precision.
INPUT:
prec
– integer (>=0) or None
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) ]
>>> from sage.all import * >>> S = ModularForms(Integer(11),Integer(2)).cuspidal_submodule() >>> S.q_expansion_basis() [ q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6) ] >>> S.q_expansion_basis(Integer(5)) [ q - 2*q^2 - q^3 + 2*q^4 + O(q^5) ] >>> S = ModularForms(Integer(1),Integer(24)).cuspidal_submodule() >>> S.q_expansion_basis(Integer(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) ]
S = ModularForms(11,2).cuspidal_submodule() S.q_expansion_basis() S.q_expansion_basis(5) S = ModularForms(1,24).cuspidal_submodule() S.q_expansion_basis(8)
An example which used to be buggy:
sage: M = CuspForms(128, 2, prec=3) sage: M.q_expansion_basis() [ q - q^17 + O(q^22), q^2 - 3*q^18 + O(q^22), q^3 - q^11 + q^19 + O(q^22), q^4 - 2*q^20 + O(q^22), q^5 - 3*q^21 + O(q^22), q^7 - q^15 + O(q^22), q^9 - q^17 + O(q^22), q^10 + O(q^22), q^13 - q^21 + O(q^22) ]
>>> from sage.all import * >>> M = CuspForms(Integer(128), Integer(2), prec=Integer(3)) >>> M.q_expansion_basis() [ q - q^17 + O(q^22), q^2 - 3*q^18 + O(q^22), q^3 - q^11 + q^19 + O(q^22), q^4 - 2*q^20 + O(q^22), q^5 - 3*q^21 + O(q^22), q^7 - q^15 + O(q^22), q^9 - q^17 + O(q^22), q^10 + O(q^22), q^13 - q^21 + O(q^22) ]
M = CuspForms(128, 2, prec=3) M.q_expansion_basis()
- q_integral_basis(prec=None)[source]¶
Return a \(\ZZ\)-reduced echelon basis of \(q\)-expansions for
self
.The \(q\)-expansions are power series with coefficients in \(\ZZ\); they are not actual modular forms.
The base ring of
self
must be \(\QQ\). The number of \(q\)-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) ]
>>> from sage.all import * >>> S = CuspForms(Integer(11),Integer(2)) >>> S.q_integral_basis(Integer(5)) [ q - 2*q^2 - q^3 + 2*q^4 + O(q^5) ]
S = CuspForms(11,2) S.q_integral_basis(5)
- set_precision(new_prec)[source]¶
Set the default precision used for displaying \(q\)-expansions.
INPUT:
new_prec
– positive integer
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) ]
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(37)),Integer(2)) >>> M.set_precision(Integer(10)) >>> S = M.cuspidal_subspace() >>> 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) ]
M = ModularForms(Gamma0(37),2) M.set_precision(10) S = M.cuspidal_subspace() S.basis()
sage: S.set_precision(0) sage: S.basis() [ O(q^0), O(q^0) ]
>>> from sage.all import * >>> S.set_precision(Integer(0)) >>> S.basis() [ O(q^0), O(q^0) ]
S.set_precision(0) S.basis()
>>> from sage.all import * >>> S.set_precision(Integer(0)) >>> S.basis() [ O(q^0), O(q^0) ]
S.set_precision(0) S.basis()
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) ]
>>> from sage.all import * >>> S.set_precision(Integer(2)) >>> M.basis() [ q + O(q^2), O(q^2), 1 + 2/3*q + O(q^2) ]
S.set_precision(2) M.basis()
The precision must be nonnegative:
sage: S.set_precision(-1) Traceback (most recent call last): ... ValueError: n (=-1) must be >= 0
>>> from sage.all import * >>> S.set_precision(-Integer(1)) Traceback (most recent call last): ... ValueError: n (=-1) must be >= 0
S.set_precision(-1)
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)
>>> from sage.all import * >>> M = ModularForms(DirichletGroup(Integer(13)).gen(0)**Integer(2)) >>> M.set_precision(Integer(10)) >>> M.cuspidal_subspace().gen(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)
M = ModularForms(DirichletGroup(13).0^2) M.set_precision(10) M.cuspidal_subspace().0
- span(B)[source]¶
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
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) ; N Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
N = ModularForms(6,4) ; N
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
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(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
N.span_of_basis([N.basis()[0]])
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(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
N.span_of_basis([N.basis()[0]])
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
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(0)], N.basis()[Integer(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
N.span_of_basis([N.basis()[0], N.basis()[1]])
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(0)], N.basis()[Integer(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
N.span_of_basis([N.basis()[0], N.basis()[1]])
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
>>> from sage.all import * >>> 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
N.span_of_basis( N.basis() )
>>> from sage.all import * >>> 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
N.span_of_basis( N.basis() )
- span_of_basis(B)[source]¶
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
>>> from sage.all import * >>> N = ModularForms(Integer(6),Integer(4)) ; N Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(6) of weight 4 over Rational Field
N = ModularForms(6,4) ; N
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
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(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
N.span_of_basis([N.basis()[0]])
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(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
N.span_of_basis([N.basis()[0]])
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
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(0)], N.basis()[Integer(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
N.span_of_basis([N.basis()[0], N.basis()[1]])
>>> from sage.all import * >>> N.span_of_basis([N.basis()[Integer(0)], N.basis()[Integer(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
N.span_of_basis([N.basis()[0], N.basis()[1]])
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
>>> from sage.all import * >>> 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
N.span_of_basis( N.basis() )
>>> from sage.all import * >>> 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
N.span_of_basis( N.basis() )
- sturm_bound(M=None)[source]¶
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 \(O(q^\mathrm{prec})\) has precisionprec
). If M is none, then M is set equal toself
.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
>>> from sage.all import * >>> S37=CuspForms(Integer(37),Integer(2)) >>> S37.sturm_bound() 8 >>> M = ModularForms(Integer(11),Integer(2)) >>> M.sturm_bound() 3 >>> ModularForms(Gamma1(Integer(15)),Integer(2)).sturm_bound() 33 >>> CuspForms(Gamma1(Integer(144)), Integer(3)).sturm_bound() 3457 >>> CuspForms(DirichletGroup(Integer(144)).gen(1)**Integer(2), Integer(3)).sturm_bound() 73 >>> CuspForms(Gamma0(Integer(144)), Integer(3)).sturm_bound() 73
S37=CuspForms(37,2) S37.sturm_bound() M = ModularForms(11,2) M.sturm_bound() ModularForms(Gamma1(15),2).sturm_bound() CuspForms(Gamma1(144), 3).sturm_bound() CuspForms(DirichletGroup(144).1^2, 3).sturm_bound() CuspForms(Gamma0(144), 3).sturm_bound()
REFERENCES:
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 \(f\). More precisely, if \(f\cong 0\pmod{p}\) for first \(s\) coefficients, then \(f^r = 0 \pmod{p}\) for first \(s r\) coefficients. Since the weight of \(f^r\) is \(r \text{weight}(f)\), it follows that if \(s \geq\) the Sturm bound for \(\Gamma_0\) at weight(f), then \(f^r\) has valuation large enough to be forced to be \(0\) at \(r\cdot\) weight(f) by Sturm bound (which is valid if we choose \(r\) right). Thus \(f \cong 0 \pmod{p}\). Conclusion: For \(\Gamma_1\) with fixed character, the Sturm bound is exactly the same as for \(\Gamma_0\). A key point is that we are finding \(\ZZ[\varepsilon]\) generators for the Hecke algebra here, not \(\ZZ\)-generators. So if one wants generators for the Hecke algebra over \(\ZZ\), this bound is wrong.
This bound works over any base, even a finite field. There might be much better bounds over \(\QQ\), or for comparing two eigenforms.
- weight()[source]¶
Return the weight of this space of modular forms.
EXAMPLES:
sage: M = ModularForms(Gamma1(13),11) sage: M.weight() 11
>>> from sage.all import * >>> M = ModularForms(Gamma1(Integer(13)),Integer(11)) >>> M.weight() 11
M = ModularForms(Gamma1(13),11) M.weight()
sage: M = ModularForms(Gamma0(997),100) sage: M.weight() 100
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(997)),Integer(100)) >>> M.weight() 100
M = ModularForms(Gamma0(997),100) M.weight()
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(997)),Integer(100)) >>> M.weight() 100
M = ModularForms(Gamma0(997),100) M.weight()
sage: M = ModularForms(Gamma0(97),4) sage: M.weight() 4 sage: M.eisenstein_submodule().weight() 4
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(97)),Integer(4)) >>> M.weight() 4 >>> M.eisenstein_submodule().weight() 4
M = ModularForms(Gamma0(97),4) M.weight() M.eisenstein_submodule().weight()
>>> from sage.all import * >>> M = ModularForms(Gamma0(Integer(97)),Integer(4)) >>> M.weight() 4 >>> M.eisenstein_submodule().weight() 4
M = ModularForms(Gamma0(97),4) M.weight() M.eisenstein_submodule().weight()
- sage.modular.modform.space.contains_each(V, B)[source]¶
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
>>> from sage.all import * >>> contains_each = sage.modular.modform.space.contains_each >>> contains_each( range(Integer(20)), prime_range(Integer(20)) ) True >>> contains_each( range(Integer(20)), range(Integer(30)) ) False
contains_each = sage.modular.modform.space.contains_each contains_each( range(20), prime_range(20) ) contains_each( range(20), range(30) )
- sage.modular.modform.space.is_ModularFormsSpace(x)[source]¶
Return
True
if x is aModularFormsSpace
.EXAMPLES:
sage: from sage.modular.modform.space import is_ModularFormsSpace sage: is_ModularFormsSpace(ModularForms(11,2)) doctest:warning... DeprecationWarning: The function is_ModularFormsSpace is deprecated; use 'isinstance(..., ModularFormsSpace)' instead. See https://github.com/sagemath/sage/issues/38035 for details. True sage: is_ModularFormsSpace(CuspForms(11,2)) True sage: is_ModularFormsSpace(3) False
>>> from sage.all import * >>> from sage.modular.modform.space import is_ModularFormsSpace >>> is_ModularFormsSpace(ModularForms(Integer(11),Integer(2))) doctest:warning... DeprecationWarning: The function is_ModularFormsSpace is deprecated; use 'isinstance(..., ModularFormsSpace)' instead. See https://github.com/sagemath/sage/issues/38035 for details. True >>> is_ModularFormsSpace(CuspForms(Integer(11),Integer(2))) True >>> is_ModularFormsSpace(Integer(3)) False
from sage.modular.modform.space import is_ModularFormsSpace is_ModularFormsSpace(ModularForms(11,2)) is_ModularFormsSpace(CuspForms(11,2)) is_ModularFormsSpace(3)