Graded rings of modular forms for Hecke triangle groups

AUTHORS:

  • Jonas Jermann (2013): initial version

class sage.modular.modform_hecketriangle.abstract_ring.FormsRing_abstract(group, base_ring, red_hom, n)[source]

Bases: Parent

Abstract (Hecke) forms ring.

This should never be called directly. Instead one should instantiate one of the derived classes of this class.

AT = Analytic Type[source]
AnalyticType[source]

alias of AnalyticType

Delta()[source]

Return an analog of the Delta-function.

It lies in the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

It is a cusp form of weight \(12\) and is equal to d*(E4^3 - E6^2) or (in terms of the generators) d*x^(2*n-6)*(x^n - y^2).

Note that Delta is also a cusp form for n=infinity.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
sage: MR = CuspFormsRing(n=7)
sage: Delta = MR.Delta()
sage: Delta in MR
True
sage: Delta
f_rho^15*d - f_rho^8*f_i^2*d
sage: QuasiMeromorphicModularFormsRing(n=7).Delta() == QuasiMeromorphicModularFormsRing(n=7)(Delta)
True

sage: from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
sage: MF = CuspForms(n=5, k=12)
sage: Delta = MF.Delta()
sage: Delta in MF
True
sage: CuspFormsRing(n=5, red_hom=True).Delta() == Delta
True
sage: CuspForms(n=5, k=0).Delta() == Delta
True
sage: MF.disp_prec(3)
sage: Delta
q + 47/(200*d)*q^2 + O(q^3)

sage: d = ModularForms(n=5).get_d()
sage: Delta == (d*(ModularForms(n=5).E4()^3-ModularForms(n=5).E6()^2))
True

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = CuspForms(n=5, k=12)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: CuspForms(n=5, k=12).Delta().q_expansion(prec=5) == (d*MFC(group=5, prec=7).Delta_ZZ()(q/d)).add_bigoh(5)
True
sage: CuspForms(n=infinity, k=12).Delta().q_expansion(prec=5) == (d*MFC(group=infinity, prec=7).Delta_ZZ()(q/d)).add_bigoh(5)
True
sage: CuspForms(n=5, k=12).Delta().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).Delta_ZZ().add_bigoh(5)
True
sage: CuspForms(n=infinity, k=12).Delta().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).Delta_ZZ().add_bigoh(5)
True

sage: CuspForms(n=infinity, k=12).Delta()
q + 24*q^2 + 252*q^3 + 1472*q^4 + O(q^5)

sage: CuspForms(k=12).f_inf() == CuspForms(k=12).Delta()
True
sage: CuspForms(k=12).Delta()
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
>>> MR = CuspFormsRing(n=Integer(7))
>>> Delta = MR.Delta()
>>> Delta in MR
True
>>> Delta
f_rho^15*d - f_rho^8*f_i^2*d
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).Delta() == QuasiMeromorphicModularFormsRing(n=Integer(7))(Delta)
True

>>> from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
>>> MF = CuspForms(n=Integer(5), k=Integer(12))
>>> Delta = MF.Delta()
>>> Delta in MF
True
>>> CuspFormsRing(n=Integer(5), red_hom=True).Delta() == Delta
True
>>> CuspForms(n=Integer(5), k=Integer(0)).Delta() == Delta
True
>>> MF.disp_prec(Integer(3))
>>> Delta
q + 47/(200*d)*q^2 + O(q^3)

>>> d = ModularForms(n=Integer(5)).get_d()
>>> Delta == (d*(ModularForms(n=Integer(5)).E4()**Integer(3)-ModularForms(n=Integer(5)).E6()**Integer(2)))
True

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = CuspForms(n=Integer(5), k=Integer(12))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> CuspForms(n=Integer(5), k=Integer(12)).Delta().q_expansion(prec=Integer(5)) == (d*MFC(group=Integer(5), prec=Integer(7)).Delta_ZZ()(q/d)).add_bigoh(Integer(5))
True
>>> CuspForms(n=infinity, k=Integer(12)).Delta().q_expansion(prec=Integer(5)) == (d*MFC(group=infinity, prec=Integer(7)).Delta_ZZ()(q/d)).add_bigoh(Integer(5))
True
>>> CuspForms(n=Integer(5), k=Integer(12)).Delta().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).Delta_ZZ().add_bigoh(Integer(5))
True
>>> CuspForms(n=infinity, k=Integer(12)).Delta().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).Delta_ZZ().add_bigoh(Integer(5))
True

>>> CuspForms(n=infinity, k=Integer(12)).Delta()
q + 24*q^2 + 252*q^3 + 1472*q^4 + O(q^5)

>>> CuspForms(k=Integer(12)).f_inf() == CuspForms(k=Integer(12)).Delta()
True
>>> CuspForms(k=Integer(12)).Delta()
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
MR = CuspFormsRing(n=7)
Delta = MR.Delta()
Delta in MR
Delta
QuasiMeromorphicModularFormsRing(n=7).Delta() == QuasiMeromorphicModularFormsRing(n=7)(Delta)
from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
MF = CuspForms(n=5, k=12)
Delta = MF.Delta()
Delta in MF
CuspFormsRing(n=5, red_hom=True).Delta() == Delta
CuspForms(n=5, k=0).Delta() == Delta
MF.disp_prec(3)
Delta
d = ModularForms(n=5).get_d()
Delta == (d*(ModularForms(n=5).E4()^3-ModularForms(n=5).E6()^2))
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = CuspForms(n=5, k=12)
d = MF.get_d()
q = MF.get_q()
CuspForms(n=5, k=12).Delta().q_expansion(prec=5) == (d*MFC(group=5, prec=7).Delta_ZZ()(q/d)).add_bigoh(5)
CuspForms(n=infinity, k=12).Delta().q_expansion(prec=5) == (d*MFC(group=infinity, prec=7).Delta_ZZ()(q/d)).add_bigoh(5)
CuspForms(n=5, k=12).Delta().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).Delta_ZZ().add_bigoh(5)
CuspForms(n=infinity, k=12).Delta().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).Delta_ZZ().add_bigoh(5)
CuspForms(n=infinity, k=12).Delta()
CuspForms(k=12).f_inf() == CuspForms(k=12).Delta()
CuspForms(k=12).Delta()
E2()[source]

Return the normalized quasi holomorphic Eisenstein series of weight \(2\).

It lies in a (quasi holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

It is in particular also a generator of the graded ring of self and the polynomial variable z exactly corresponds to E2.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiModularFormsRing, CuspFormsRing
sage: MR = QuasiModularFormsRing(n=7)
sage: E2 = MR.E2()
sage: E2 in MR
True
sage: CuspFormsRing(n=7).E2() == E2
True
sage: E2
E2
sage: QuasiMeromorphicModularFormsRing(n=7).E2() == QuasiMeromorphicModularFormsRing(n=7)(E2)
True

sage: from sage.modular.modform_hecketriangle.space import QuasiModularForms, CuspForms
sage: MF = QuasiModularForms(n=5, k=2)
sage: E2 = MF.E2()
sage: E2 in MF
True
sage: QuasiModularFormsRing(n=5, red_hom=True).E2() == E2
True
sage: CuspForms(n=5, k=12, ep=1).E2() == E2
True
sage: MF.disp_prec(3)
sage: E2
1 - 9/(200*d)*q - 369/(320000*d^2)*q^2 + O(q^3)

sage: f_inf = MF.f_inf()
sage: E2 == f_inf.derivative() / f_inf
True

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = QuasiModularForms(n=5, k=2)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: QuasiModularForms(n=5, k=2).E2().q_expansion(prec=5) == MFC(group=5, prec=7).E2_ZZ()(q/d).add_bigoh(5)
True
sage: QuasiModularForms(n=infinity, k=2).E2().q_expansion(prec=5) == MFC(group=infinity, prec=7).E2_ZZ()(q/d).add_bigoh(5)
True
sage: QuasiModularForms(n=5, k=2).E2().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E2_ZZ().add_bigoh(5)
True
sage: QuasiModularForms(n=infinity, k=2).E2().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E2_ZZ().add_bigoh(5)
True

sage: QuasiModularForms(n=infinity, k=2).E2()
1 - 8*q - 8*q^2 - 32*q^3 - 40*q^4 + O(q^5)

sage: QuasiModularForms(k=2).E2()
1 - 24*q - 72*q^2 - 96*q^3 - 168*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiModularFormsRing, CuspFormsRing
>>> MR = QuasiModularFormsRing(n=Integer(7))
>>> E2 = MR.E2()
>>> E2 in MR
True
>>> CuspFormsRing(n=Integer(7)).E2() == E2
True
>>> E2
E2
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).E2() == QuasiMeromorphicModularFormsRing(n=Integer(7))(E2)
True

>>> from sage.modular.modform_hecketriangle.space import QuasiModularForms, CuspForms
>>> MF = QuasiModularForms(n=Integer(5), k=Integer(2))
>>> E2 = MF.E2()
>>> E2 in MF
True
>>> QuasiModularFormsRing(n=Integer(5), red_hom=True).E2() == E2
True
>>> CuspForms(n=Integer(5), k=Integer(12), ep=Integer(1)).E2() == E2
True
>>> MF.disp_prec(Integer(3))
>>> E2
1 - 9/(200*d)*q - 369/(320000*d^2)*q^2 + O(q^3)

>>> f_inf = MF.f_inf()
>>> E2 == f_inf.derivative() / f_inf
True

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = QuasiModularForms(n=Integer(5), k=Integer(2))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> QuasiModularForms(n=Integer(5), k=Integer(2)).E2().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E2_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> QuasiModularForms(n=infinity, k=Integer(2)).E2().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E2_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> QuasiModularForms(n=Integer(5), k=Integer(2)).E2().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E2_ZZ().add_bigoh(Integer(5))
True
>>> QuasiModularForms(n=infinity, k=Integer(2)).E2().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E2_ZZ().add_bigoh(Integer(5))
True

>>> QuasiModularForms(n=infinity, k=Integer(2)).E2()
1 - 8*q - 8*q^2 - 32*q^3 - 40*q^4 + O(q^5)

>>> QuasiModularForms(k=Integer(2)).E2()
1 - 24*q - 72*q^2 - 96*q^3 - 168*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiModularFormsRing, CuspFormsRing
MR = QuasiModularFormsRing(n=7)
E2 = MR.E2()
E2 in MR
CuspFormsRing(n=7).E2() == E2
E2
QuasiMeromorphicModularFormsRing(n=7).E2() == QuasiMeromorphicModularFormsRing(n=7)(E2)
from sage.modular.modform_hecketriangle.space import QuasiModularForms, CuspForms
MF = QuasiModularForms(n=5, k=2)
E2 = MF.E2()
E2 in MF
QuasiModularFormsRing(n=5, red_hom=True).E2() == E2
CuspForms(n=5, k=12, ep=1).E2() == E2
MF.disp_prec(3)
E2
f_inf = MF.f_inf()
E2 == f_inf.derivative() / f_inf
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = QuasiModularForms(n=5, k=2)
d = MF.get_d()
q = MF.get_q()
QuasiModularForms(n=5, k=2).E2().q_expansion(prec=5) == MFC(group=5, prec=7).E2_ZZ()(q/d).add_bigoh(5)
QuasiModularForms(n=infinity, k=2).E2().q_expansion(prec=5) == MFC(group=infinity, prec=7).E2_ZZ()(q/d).add_bigoh(5)
QuasiModularForms(n=5, k=2).E2().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E2_ZZ().add_bigoh(5)
QuasiModularForms(n=infinity, k=2).E2().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E2_ZZ().add_bigoh(5)
QuasiModularForms(n=infinity, k=2).E2()
QuasiModularForms(k=2).E2()
E4()[source]

Return the normalized Eisenstein series of weight \(4\).

It lies in a (holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

It is equal to f_rho^(n-2).

NOTE:

If n=infinity the situation is different, there we have: f_rho=1 (since that’s the limit as n goes to infinity) and the polynomial variable x refers to E4 instead of f_rho. In that case E4 has exactly one simple zero at the cusp -1. Also note that E4 is the limit of f_rho^n.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
sage: MR = ModularFormsRing(n=7)
sage: E4 = MR.E4()
sage: E4 in MR
True
sage: CuspFormsRing(n=7).E4() == E4
True
sage: E4
f_rho^5
sage: QuasiMeromorphicModularFormsRing(n=7).E4() == QuasiMeromorphicModularFormsRing(n=7)(E4)
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
sage: MF = ModularForms(n=5, k=4)
sage: E4 = MF.E4()
sage: E4 in MF
True
sage: ModularFormsRing(n=5, red_hom=True).E4() == E4
True
sage: CuspForms(n=5, k=12).E4() == E4
True
sage: MF.disp_prec(3)
sage: E4
1 + 21/(100*d)*q + 483/(32000*d^2)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = ModularForms(n=5)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=5, k=4).E4().q_expansion(prec=5) == MFC(group=5, prec=7).E4_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=infinity, k=4).E4().q_expansion(prec=5) == MFC(group=infinity, prec=7).E4_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=5, k=4).E4().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E4_ZZ().add_bigoh(5)
True
sage: ModularForms(n=infinity, k=4).E4().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E4_ZZ().add_bigoh(5)
True

sage: ModularForms(n=infinity, k=4).E4()
1 + 16*q + 112*q^2 + 448*q^3 + 1136*q^4 + O(q^5)

sage: ModularForms(k=4).f_rho() == ModularForms(k=4).E4()
True
sage: ModularForms(k=4).E4()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> E4 = MR.E4()
>>> E4 in MR
True
>>> CuspFormsRing(n=Integer(7)).E4() == E4
True
>>> E4
f_rho^5
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).E4() == QuasiMeromorphicModularFormsRing(n=Integer(7))(E4)
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
>>> MF = ModularForms(n=Integer(5), k=Integer(4))
>>> E4 = MF.E4()
>>> E4 in MF
True
>>> ModularFormsRing(n=Integer(5), red_hom=True).E4() == E4
True
>>> CuspForms(n=Integer(5), k=Integer(12)).E4() == E4
True
>>> MF.disp_prec(Integer(3))
>>> E4
1 + 21/(100*d)*q + 483/(32000*d^2)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = ModularForms(n=Integer(5))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(5), k=Integer(4)).E4().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E4_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity, k=Integer(4)).E4().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E4_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(5), k=Integer(4)).E4().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E4_ZZ().add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity, k=Integer(4)).E4().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E4_ZZ().add_bigoh(Integer(5))
True

>>> ModularForms(n=infinity, k=Integer(4)).E4()
1 + 16*q + 112*q^2 + 448*q^3 + 1136*q^4 + O(q^5)

>>> ModularForms(k=Integer(4)).f_rho() == ModularForms(k=Integer(4)).E4()
True
>>> ModularForms(k=Integer(4)).E4()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
MR = ModularFormsRing(n=7)
E4 = MR.E4()
E4 in MR
CuspFormsRing(n=7).E4() == E4
E4
QuasiMeromorphicModularFormsRing(n=7).E4() == QuasiMeromorphicModularFormsRing(n=7)(E4)
from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
MF = ModularForms(n=5, k=4)
E4 = MF.E4()
E4 in MF
ModularFormsRing(n=5, red_hom=True).E4() == E4
CuspForms(n=5, k=12).E4() == E4
MF.disp_prec(3)
E4
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = ModularForms(n=5)
d = MF.get_d()
q = MF.get_q()
ModularForms(n=5, k=4).E4().q_expansion(prec=5) == MFC(group=5, prec=7).E4_ZZ()(q/d).add_bigoh(5)
ModularForms(n=infinity, k=4).E4().q_expansion(prec=5) == MFC(group=infinity, prec=7).E4_ZZ()(q/d).add_bigoh(5)
ModularForms(n=5, k=4).E4().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E4_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=4).E4().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E4_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=4).E4()
ModularForms(k=4).f_rho() == ModularForms(k=4).E4()
ModularForms(k=4).E4()
E6()[source]

Return the normalized Eisenstein series of weight \(6\).

It lies in a (holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

It is equal to f_rho^(n-3) * f_i.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
sage: MR = ModularFormsRing(n=7)
sage: E6 = MR.E6()
sage: E6 in MR
True
sage: CuspFormsRing(n=7).E6() == E6
True
sage: E6
f_rho^4*f_i
sage: QuasiMeromorphicModularFormsRing(n=7).E6() == QuasiMeromorphicModularFormsRing(n=7)(E6)
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
sage: MF = ModularForms(n=5, k=6)
sage: E6 = MF.E6()
sage: E6 in MF
True
sage: ModularFormsRing(n=5, red_hom=True).E6() == E6
True
sage: CuspForms(n=5, k=12).E6() == E6
True
sage: MF.disp_prec(3)
sage: E6
1 - 37/(200*d)*q - 14663/(320000*d^2)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = ModularForms(n=5, k=6)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=5, k=6).E6().q_expansion(prec=5) == MFC(group=5, prec=7).E6_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=infinity, k=6).E6().q_expansion(prec=5) == MFC(group=infinity, prec=7).E6_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=5, k=6).E6().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E6_ZZ().add_bigoh(5)
True
sage: ModularForms(n=infinity, k=6).E6().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E6_ZZ().add_bigoh(5)
True

sage: ModularForms(n=infinity, k=6).E6()
1 - 8*q - 248*q^2 - 1952*q^3 - 8440*q^4 + O(q^5)

sage: ModularForms(k=6).f_i() == ModularForms(k=6).E6()
True
sage: ModularForms(k=6).E6()
1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> E6 = MR.E6()
>>> E6 in MR
True
>>> CuspFormsRing(n=Integer(7)).E6() == E6
True
>>> E6
f_rho^4*f_i
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).E6() == QuasiMeromorphicModularFormsRing(n=Integer(7))(E6)
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
>>> MF = ModularForms(n=Integer(5), k=Integer(6))
>>> E6 = MF.E6()
>>> E6 in MF
True
>>> ModularFormsRing(n=Integer(5), red_hom=True).E6() == E6
True
>>> CuspForms(n=Integer(5), k=Integer(12)).E6() == E6
True
>>> MF.disp_prec(Integer(3))
>>> E6
1 - 37/(200*d)*q - 14663/(320000*d^2)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = ModularForms(n=Integer(5), k=Integer(6))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(5), k=Integer(6)).E6().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E6_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity, k=Integer(6)).E6().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E6_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(5), k=Integer(6)).E6().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).E6_ZZ().add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity, k=Integer(6)).E6().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).E6_ZZ().add_bigoh(Integer(5))
True

>>> ModularForms(n=infinity, k=Integer(6)).E6()
1 - 8*q - 248*q^2 - 1952*q^3 - 8440*q^4 + O(q^5)

>>> ModularForms(k=Integer(6)).f_i() == ModularForms(k=Integer(6)).E6()
True
>>> ModularForms(k=Integer(6)).E6()
1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
MR = ModularFormsRing(n=7)
E6 = MR.E6()
E6 in MR
CuspFormsRing(n=7).E6() == E6
E6
QuasiMeromorphicModularFormsRing(n=7).E6() == QuasiMeromorphicModularFormsRing(n=7)(E6)
from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
MF = ModularForms(n=5, k=6)
E6 = MF.E6()
E6 in MF
ModularFormsRing(n=5, red_hom=True).E6() == E6
CuspForms(n=5, k=12).E6() == E6
MF.disp_prec(3)
E6
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = ModularForms(n=5, k=6)
d = MF.get_d()
q = MF.get_q()
ModularForms(n=5, k=6).E6().q_expansion(prec=5) == MFC(group=5, prec=7).E6_ZZ()(q/d).add_bigoh(5)
ModularForms(n=infinity, k=6).E6().q_expansion(prec=5) == MFC(group=infinity, prec=7).E6_ZZ()(q/d).add_bigoh(5)
ModularForms(n=5, k=6).E6().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).E6_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=6).E6().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).E6_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=6).E6()
ModularForms(k=6).f_i() == ModularForms(k=6).E6()
ModularForms(k=6).E6()
EisensteinSeries(k=None)[source]

Return the normalized Eisenstein series of weight k.

Only arithmetic groups or trivial weights (with corresponding one dimensional spaces) are supported.

INPUT:

  • k – a nonnegative even integer, namely the weight. If k is None (default) then the weight of self is chosen if self is homogeneous and the weight is possible, otherwise k is set to \(0\).

OUTPUT:

A modular form element lying in a (holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
sage: MR = ModularFormsRing()
sage: MR.EisensteinSeries() == MR.one()
True
sage: E8 = MR.EisensteinSeries(k=8)
sage: E8 in MR
True
sage: E8
f_rho^2

sage: from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
sage: MF = ModularForms(n=4, k=12)
sage: E12 = MF.EisensteinSeries()
sage: E12 in MF
True
sage: CuspFormsRing(n=4, red_hom=True).EisensteinSeries(k=12).parent()
ModularForms(n=4, k=12, ep=1) over Integer Ring
sage: MF.disp_prec(4)
sage: E12
1 + 1008/691*q + 2129904/691*q^2 + 178565184/691*q^3 + O(q^4)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=3, k=2).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
True
sage: ModularForms(n=3, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
True
sage: ModularForms(n=3, k=6).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
True
sage: ModularForms(n=3, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
True
sage: ModularForms(n=4, k=2).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
True
sage: ModularForms(n=4, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
True
sage: ModularForms(n=4, k=6).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
True
sage: ModularForms(n=4, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
True
sage: ModularForms(n=6, k=2, ep=-1).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
True
sage: ModularForms(n=6, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
True
sage: ModularForms(n=6, k=6, ep=-1).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
True
sage: ModularForms(n=6, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
True

sage: ModularForms(n=3, k=12).EisensteinSeries()
1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
sage: ModularForms(n=4, k=12).EisensteinSeries()
1 + 1008/691*q + 2129904/691*q^2 + 178565184/691*q^3 + O(q^4)
sage: ModularForms(n=6, k=12).EisensteinSeries()
1 + 6552/50443*q + 13425048/50443*q^2 + 1165450104/50443*q^3 + 27494504856/50443*q^4 + O(q^5)
sage: ModularForms(n=3, k=20).EisensteinSeries()
1 + 13200/174611*q + 6920614800/174611*q^2 + 15341851377600/174611*q^3 + 3628395292275600/174611*q^4 + O(q^5)
sage: ModularForms(n=4).EisensteinSeries(k=8)
1 + 480/17*q + 69600/17*q^2 + 1050240/17*q^3 + 8916960/17*q^4 + O(q^5)
sage: ModularForms(n=6).EisensteinSeries(k=20)
1 + 264/206215591*q + 138412296/206215591*q^2 + 306852616488/206215591*q^3 + 72567905845512/206215591*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
>>> MR = ModularFormsRing()
>>> MR.EisensteinSeries() == MR.one()
True
>>> E8 = MR.EisensteinSeries(k=Integer(8))
>>> E8 in MR
True
>>> E8
f_rho^2

>>> from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
>>> MF = ModularForms(n=Integer(4), k=Integer(12))
>>> E12 = MF.EisensteinSeries()
>>> E12 in MF
True
>>> CuspFormsRing(n=Integer(4), red_hom=True).EisensteinSeries(k=Integer(12)).parent()
ModularForms(n=4, k=12, ep=1) over Integer Ring
>>> MF.disp_prec(Integer(4))
>>> E12
1 + 1008/691*q + 2129904/691*q^2 + 178565184/691*q^3 + O(q^4)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(3), k=Integer(2)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(3), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(2))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(3), k=Integer(4)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(3), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(4))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(3), k=Integer(6)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(3), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(6))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(3), k=Integer(8)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(3), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(8))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(4), k=Integer(2)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(4), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(2))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(4), k=Integer(4)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(4), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(4))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(4), k=Integer(6)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(4), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(6))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(4), k=Integer(8)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(4), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(8))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(6), k=Integer(2), ep=-Integer(1)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(6), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(2))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(6), k=Integer(4)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(6), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(4))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(6), k=Integer(6), ep=-Integer(1)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(6), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(6))(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(6), k=Integer(8)).EisensteinSeries().q_expansion(prec=Integer(5)) == MFC(group=Integer(6), prec=Integer(7)).EisensteinSeries_ZZ(k=Integer(8))(q/d).add_bigoh(Integer(5))
True

>>> ModularForms(n=Integer(3), k=Integer(12)).EisensteinSeries()
1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
>>> ModularForms(n=Integer(4), k=Integer(12)).EisensteinSeries()
1 + 1008/691*q + 2129904/691*q^2 + 178565184/691*q^3 + O(q^4)
>>> ModularForms(n=Integer(6), k=Integer(12)).EisensteinSeries()
1 + 6552/50443*q + 13425048/50443*q^2 + 1165450104/50443*q^3 + 27494504856/50443*q^4 + O(q^5)
>>> ModularForms(n=Integer(3), k=Integer(20)).EisensteinSeries()
1 + 13200/174611*q + 6920614800/174611*q^2 + 15341851377600/174611*q^3 + 3628395292275600/174611*q^4 + O(q^5)
>>> ModularForms(n=Integer(4)).EisensteinSeries(k=Integer(8))
1 + 480/17*q + 69600/17*q^2 + 1050240/17*q^3 + 8916960/17*q^4 + O(q^5)
>>> ModularForms(n=Integer(6)).EisensteinSeries(k=Integer(20))
1 + 264/206215591*q + 138412296/206215591*q^2 + 306852616488/206215591*q^3 + 72567905845512/206215591*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
MR = ModularFormsRing()
MR.EisensteinSeries() == MR.one()
E8 = MR.EisensteinSeries(k=8)
E8 in MR
E8
from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
MF = ModularForms(n=4, k=12)
E12 = MF.EisensteinSeries()
E12 in MF
CuspFormsRing(n=4, red_hom=True).EisensteinSeries(k=12).parent()
MF.disp_prec(4)
E12
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
d = MF.get_d()
q = MF.get_q()
ModularForms(n=3, k=2).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
ModularForms(n=3, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
ModularForms(n=3, k=6).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
ModularForms(n=3, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=3, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
ModularForms(n=4, k=2).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
ModularForms(n=4, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
ModularForms(n=4, k=6).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
ModularForms(n=4, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=4, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
ModularForms(n=6, k=2, ep=-1).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=2)(q/d).add_bigoh(5)
ModularForms(n=6, k=4).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=4)(q/d).add_bigoh(5)
ModularForms(n=6, k=6, ep=-1).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=6)(q/d).add_bigoh(5)
ModularForms(n=6, k=8).EisensteinSeries().q_expansion(prec=5) == MFC(group=6, prec=7).EisensteinSeries_ZZ(k=8)(q/d).add_bigoh(5)
ModularForms(n=3, k=12).EisensteinSeries()
ModularForms(n=4, k=12).EisensteinSeries()
ModularForms(n=6, k=12).EisensteinSeries()
ModularForms(n=3, k=20).EisensteinSeries()
ModularForms(n=4).EisensteinSeries(k=8)
ModularForms(n=6).EisensteinSeries(k=20)
Element[source]

alias of FormsRingElement

FormsRingElement[source]

alias of FormsRingElement

G_inv()[source]

If \(2\) divides \(n\): Return the G-invariant of the group of self.

The G-invariant is analogous to the J-invariant but has multiplier \(-1\). I.e. G_inv(-1/t) = -G_inv(t). It is a holomorphic square root of J_inv*(J_inv-1) with real Fourier coefficients.

If \(2\) does not divide \(n\) the function does not exist and an exception is raised.

The G-invariant lies in a (weak) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

NOTE:

If n=infinity then G_inv is holomorphic everywhere except at the cusp -1 where it isn’t even meromorphic. Consequently this function raises an exception for n=infinity.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
sage: MR = WeakModularFormsRing(n=8)
sage: G_inv = MR.G_inv()
sage: G_inv in MR
True
sage: CuspFormsRing(n=8).G_inv() == G_inv
True
sage: G_inv
f_rho^4*f_i*d/(f_rho^8 - f_i^2)
sage: QuasiMeromorphicModularFormsRing(n=8).G_inv() == QuasiMeromorphicModularFormsRing(n=8)(G_inv)
True

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
sage: MF = WeakModularForms(n=8, k=0, ep=-1)
sage: G_inv = MF.G_inv()
sage: G_inv in MF
True
sage: WeakModularFormsRing(n=8, red_hom=True).G_inv() == G_inv
True
sage: CuspForms(n=8, k=12, ep=1).G_inv() == G_inv
True
sage: MF.disp_prec(3)
sage: G_inv
d^2*q^-1 - 15*d/128 - 15139/262144*q - 11575/(1572864*d)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = WeakModularForms(n=8)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: WeakModularForms(n=8).G_inv().q_expansion(prec=5) == (d*MFC(group=8, prec=7).G_inv_ZZ()(q/d)).add_bigoh(5)
True
sage: WeakModularForms(n=8).G_inv().q_expansion(fix_d=1, prec=5) == MFC(group=8, prec=7).G_inv_ZZ().add_bigoh(5)
True

sage: WeakModularForms(n=4, k=0, ep=-1).G_inv()
1/65536*q^-1 - 3/8192 - 955/16384*q - 49/32*q^2 - 608799/32768*q^3 - 659/4*q^4 + O(q^5)

As explained above, the G-invariant exists only for even `n`::

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms
sage: MF = WeakModularForms(n=9)
sage: MF.G_inv()
Traceback (most recent call last):
...
ArithmeticError: G_inv doesn't exist for odd n(=9).
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
>>> MR = WeakModularFormsRing(n=Integer(8))
>>> G_inv = MR.G_inv()
>>> G_inv in MR
True
>>> CuspFormsRing(n=Integer(8)).G_inv() == G_inv
True
>>> G_inv
f_rho^4*f_i*d/(f_rho^8 - f_i^2)
>>> QuasiMeromorphicModularFormsRing(n=Integer(8)).G_inv() == QuasiMeromorphicModularFormsRing(n=Integer(8))(G_inv)
True

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
>>> MF = WeakModularForms(n=Integer(8), k=Integer(0), ep=-Integer(1))
>>> G_inv = MF.G_inv()
>>> G_inv in MF
True
>>> WeakModularFormsRing(n=Integer(8), red_hom=True).G_inv() == G_inv
True
>>> CuspForms(n=Integer(8), k=Integer(12), ep=Integer(1)).G_inv() == G_inv
True
>>> MF.disp_prec(Integer(3))
>>> G_inv
d^2*q^-1 - 15*d/128 - 15139/262144*q - 11575/(1572864*d)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = WeakModularForms(n=Integer(8))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> WeakModularForms(n=Integer(8)).G_inv().q_expansion(prec=Integer(5)) == (d*MFC(group=Integer(8), prec=Integer(7)).G_inv_ZZ()(q/d)).add_bigoh(Integer(5))
True
>>> WeakModularForms(n=Integer(8)).G_inv().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(8), prec=Integer(7)).G_inv_ZZ().add_bigoh(Integer(5))
True

>>> WeakModularForms(n=Integer(4), k=Integer(0), ep=-Integer(1)).G_inv()
1/65536*q^-1 - 3/8192 - 955/16384*q - 49/32*q^2 - 608799/32768*q^3 - 659/4*q^4 + O(q^5)

As explained above, the G-invariant exists only for even `n`::

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms
>>> MF = WeakModularForms(n=Integer(9))
>>> MF.G_inv()
Traceback (most recent call last):
...
ArithmeticError: G_inv doesn't exist for odd n(=9).
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
MR = WeakModularFormsRing(n=8)
G_inv = MR.G_inv()
G_inv in MR
CuspFormsRing(n=8).G_inv() == G_inv
G_inv
QuasiMeromorphicModularFormsRing(n=8).G_inv() == QuasiMeromorphicModularFormsRing(n=8)(G_inv)
from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
MF = WeakModularForms(n=8, k=0, ep=-1)
G_inv = MF.G_inv()
G_inv in MF
WeakModularFormsRing(n=8, red_hom=True).G_inv() == G_inv
CuspForms(n=8, k=12, ep=1).G_inv() == G_inv
MF.disp_prec(3)
G_inv
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = WeakModularForms(n=8)
d = MF.get_d()
q = MF.get_q()
WeakModularForms(n=8).G_inv().q_expansion(prec=5) == (d*MFC(group=8, prec=7).G_inv_ZZ()(q/d)).add_bigoh(5)
WeakModularForms(n=8).G_inv().q_expansion(fix_d=1, prec=5) == MFC(group=8, prec=7).G_inv_ZZ().add_bigoh(5)
WeakModularForms(n=4, k=0, ep=-1).G_inv()
from sage.modular.modform_hecketriangle.space import WeakModularForms
MF = WeakModularForms(n=9)
MF.G_inv()
J_inv()[source]

Return the J-invariant (Hauptmodul) of the group of self. It is normalized such that J_inv(infinity) = infinity, it has real Fourier coefficients starting with d > 0 and J_inv(i) = 1

It lies in a (weak) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
sage: MR = WeakModularFormsRing(n=7)
sage: J_inv = MR.J_inv()
sage: J_inv in MR
True
sage: CuspFormsRing(n=7).J_inv() == J_inv
True
sage: J_inv
f_rho^7/(f_rho^7 - f_i^2)
sage: QuasiMeromorphicModularFormsRing(n=7).J_inv() == QuasiMeromorphicModularFormsRing(n=7)(J_inv)
True

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
sage: MF = WeakModularForms(n=5, k=0)
sage: J_inv = MF.J_inv()
sage: J_inv in MF
True
sage: WeakModularFormsRing(n=5, red_hom=True).J_inv() == J_inv
True
sage: CuspForms(n=5, k=12).J_inv() == J_inv
True
sage: MF.disp_prec(3)
sage: J_inv
d*q^-1 + 79/200 + 42877/(640000*d)*q + 12957/(2000000*d^2)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = WeakModularForms(n=5)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: WeakModularForms(n=5).J_inv().q_expansion(prec=5) == MFC(group=5, prec=7).J_inv_ZZ()(q/d).add_bigoh(5)
True
sage: WeakModularForms(n=infinity).J_inv().q_expansion(prec=5) == MFC(group=infinity, prec=7).J_inv_ZZ()(q/d).add_bigoh(5)
True
sage: WeakModularForms(n=5).J_inv().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).J_inv_ZZ().add_bigoh(5)
True
sage: WeakModularForms(n=infinity).J_inv().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).J_inv_ZZ().add_bigoh(5)
True

sage: WeakModularForms(n=infinity).J_inv()
1/64*q^-1 + 3/8 + 69/16*q + 32*q^2 + 5601/32*q^3 + 768*q^4 + O(q^5)

sage: WeakModularForms().J_inv()
1/1728*q^-1 + 31/72 + 1823/16*q + 335840/27*q^2 + 16005555/32*q^3 + 11716352*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
>>> MR = WeakModularFormsRing(n=Integer(7))
>>> J_inv = MR.J_inv()
>>> J_inv in MR
True
>>> CuspFormsRing(n=Integer(7)).J_inv() == J_inv
True
>>> J_inv
f_rho^7/(f_rho^7 - f_i^2)
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).J_inv() == QuasiMeromorphicModularFormsRing(n=Integer(7))(J_inv)
True

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
>>> MF = WeakModularForms(n=Integer(5), k=Integer(0))
>>> J_inv = MF.J_inv()
>>> J_inv in MF
True
>>> WeakModularFormsRing(n=Integer(5), red_hom=True).J_inv() == J_inv
True
>>> CuspForms(n=Integer(5), k=Integer(12)).J_inv() == J_inv
True
>>> MF.disp_prec(Integer(3))
>>> J_inv
d*q^-1 + 79/200 + 42877/(640000*d)*q + 12957/(2000000*d^2)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = WeakModularForms(n=Integer(5))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> WeakModularForms(n=Integer(5)).J_inv().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).J_inv_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> WeakModularForms(n=infinity).J_inv().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).J_inv_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> WeakModularForms(n=Integer(5)).J_inv().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).J_inv_ZZ().add_bigoh(Integer(5))
True
>>> WeakModularForms(n=infinity).J_inv().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).J_inv_ZZ().add_bigoh(Integer(5))
True

>>> WeakModularForms(n=infinity).J_inv()
1/64*q^-1 + 3/8 + 69/16*q + 32*q^2 + 5601/32*q^3 + 768*q^4 + O(q^5)

>>> WeakModularForms().J_inv()
1/1728*q^-1 + 31/72 + 1823/16*q + 335840/27*q^2 + 16005555/32*q^3 + 11716352*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
MR = WeakModularFormsRing(n=7)
J_inv = MR.J_inv()
J_inv in MR
CuspFormsRing(n=7).J_inv() == J_inv
J_inv
QuasiMeromorphicModularFormsRing(n=7).J_inv() == QuasiMeromorphicModularFormsRing(n=7)(J_inv)
from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
MF = WeakModularForms(n=5, k=0)
J_inv = MF.J_inv()
J_inv in MF
WeakModularFormsRing(n=5, red_hom=True).J_inv() == J_inv
CuspForms(n=5, k=12).J_inv() == J_inv
MF.disp_prec(3)
J_inv
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = WeakModularForms(n=5)
d = MF.get_d()
q = MF.get_q()
WeakModularForms(n=5).J_inv().q_expansion(prec=5) == MFC(group=5, prec=7).J_inv_ZZ()(q/d).add_bigoh(5)
WeakModularForms(n=infinity).J_inv().q_expansion(prec=5) == MFC(group=infinity, prec=7).J_inv_ZZ()(q/d).add_bigoh(5)
WeakModularForms(n=5).J_inv().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).J_inv_ZZ().add_bigoh(5)
WeakModularForms(n=infinity).J_inv().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).J_inv_ZZ().add_bigoh(5)
WeakModularForms(n=infinity).J_inv()
WeakModularForms().J_inv()
analytic_type()[source]

Return the analytic type of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
sage: QuasiMeromorphicModularFormsRing().analytic_type()
quasi meromorphic modular
sage: QuasiWeakModularFormsRing().analytic_type()
quasi weakly holomorphic modular

sage: from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
sage: MeromorphicModularForms(k=10).analytic_type()
meromorphic modular
sage: CuspForms(n=7, k=12, base_ring=AA).analytic_type()
cuspidal
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
>>> QuasiMeromorphicModularFormsRing().analytic_type()
quasi meromorphic modular
>>> QuasiWeakModularFormsRing().analytic_type()
quasi weakly holomorphic modular

>>> from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
>>> MeromorphicModularForms(k=Integer(10)).analytic_type()
meromorphic modular
>>> CuspForms(n=Integer(7), k=Integer(12), base_ring=AA).analytic_type()
cuspidal
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
QuasiMeromorphicModularFormsRing().analytic_type()
QuasiWeakModularFormsRing().analytic_type()
from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
MeromorphicModularForms(k=10).analytic_type()
CuspForms(n=7, k=12, base_ring=AA).analytic_type()
base_ring()[source]

Return base ring of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().base_ring()
Integer Ring

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CuspForms(k=12, base_ring=AA).base_ring()
Algebraic Real Field
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().base_ring()
Integer Ring

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CuspForms(k=Integer(12), base_ring=AA).base_ring()
Algebraic Real Field
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().base_ring()
from sage.modular.modform_hecketriangle.space import CuspForms
CuspForms(k=12, base_ring=AA).base_ring()
change_ring(new_base_ring)[source]

Return the same space as self but over a new base ring new_base_ring.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().change_ring(CC)
ModularFormsRing(n=3) over Complex Field with 53 bits of precision
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().change_ring(CC)
ModularFormsRing(n=3) over Complex Field with 53 bits of precision
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().change_ring(CC)
coeff_ring()[source]

Return coefficient ring of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().coeff_ring()
Fraction Field of Univariate Polynomial Ring in d over Integer Ring

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CuspForms(k=12, base_ring=AA).coeff_ring()
Fraction Field of Univariate Polynomial Ring in d over Algebraic Real Field
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().coeff_ring()
Fraction Field of Univariate Polynomial Ring in d over Integer Ring

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CuspForms(k=Integer(12), base_ring=AA).coeff_ring()
Fraction Field of Univariate Polynomial Ring in d over Algebraic Real Field
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().coeff_ring()
from sage.modular.modform_hecketriangle.space import CuspForms
CuspForms(k=12, base_ring=AA).coeff_ring()
construction()[source]

Return a functor that constructs self (used by the coercion machinery).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().construction()
(ModularFormsRingFunctor(n=3), BaseFacade(Integer Ring))
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().construction()
(ModularFormsRingFunctor(n=3), BaseFacade(Integer Ring))
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().construction()
contains_coeff_ring()[source]

Return whether self contains its coefficient ring.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import CuspFormsRing, ModularFormsRing
sage: CuspFormsRing(n=4).contains_coeff_ring()
False
sage: ModularFormsRing(n=5).contains_coeff_ring()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import CuspFormsRing, ModularFormsRing
>>> CuspFormsRing(n=Integer(4)).contains_coeff_ring()
False
>>> ModularFormsRing(n=Integer(5)).contains_coeff_ring()
True
from sage.modular.modform_hecketriangle.graded_ring import CuspFormsRing, ModularFormsRing
CuspFormsRing(n=4).contains_coeff_ring()
ModularFormsRing(n=5).contains_coeff_ring()
default_num_prec(prec=None)[source]

Set the default numerical precision to prec (default: 53). If prec=None (default) the current default numerical precision is returned instead.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: MF = ModularForms(k=6)
sage: MF.default_prec(20)
sage: MF.default_num_prec(10)
sage: MF.default_num_prec()
10
sage: E6 = MF.E6()
sage: E6(i + 10^(-1000))
0.002... - 6.7...e-1000*I
sage: MF.default_num_prec(100)
sage: E6(i + 10^(-1000))
3.9946838...e-1999 - 6.6578064...e-1000*I

sage: MF = ModularForms(n=5, k=4/3)
sage: f_rho = MF.f_rho()
sage: f_rho.q_expansion(prec=2)[1]
7/(100*d)
sage: MF.default_num_prec(15)
sage: f_rho.q_expansion_fixed_d(prec=2)[1]
9.9...
sage: MF.default_num_prec(100)
sage: f_rho.q_expansion_fixed_d(prec=2)[1]
9.92593243510795915276017782...
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> MF = ModularForms(k=Integer(6))
>>> MF.default_prec(Integer(20))
>>> MF.default_num_prec(Integer(10))
>>> MF.default_num_prec()
10
>>> E6 = MF.E6()
>>> E6(i + Integer(10)**(-Integer(1000)))
0.002... - 6.7...e-1000*I
>>> MF.default_num_prec(Integer(100))
>>> E6(i + Integer(10)**(-Integer(1000)))
3.9946838...e-1999 - 6.6578064...e-1000*I

>>> MF = ModularForms(n=Integer(5), k=Integer(4)/Integer(3))
>>> f_rho = MF.f_rho()
>>> f_rho.q_expansion(prec=Integer(2))[Integer(1)]
7/(100*d)
>>> MF.default_num_prec(Integer(15))
>>> f_rho.q_expansion_fixed_d(prec=Integer(2))[Integer(1)]
9.9...
>>> MF.default_num_prec(Integer(100))
>>> f_rho.q_expansion_fixed_d(prec=Integer(2))[Integer(1)]
9.92593243510795915276017782...
from sage.modular.modform_hecketriangle.space import ModularForms
MF = ModularForms(k=6)
MF.default_prec(20)
MF.default_num_prec(10)
MF.default_num_prec()
E6 = MF.E6()
E6(i + 10^(-1000))
MF.default_num_prec(100)
E6(i + 10^(-1000))
MF = ModularForms(n=5, k=4/3)
f_rho = MF.f_rho()
f_rho.q_expansion(prec=2)[1]
MF.default_num_prec(15)
f_rho.q_expansion_fixed_d(prec=2)[1]
MF.default_num_prec(100)
f_rho.q_expansion_fixed_d(prec=2)[1]
default_prec(prec=None)[source]

Set the default precision prec for the Fourier expansion. If prec=None (default) then the current default precision is returned instead.

INPUT:

  • prec – integer

Note

This is also used as the default precision for the Fourier expansion when evaluating forms.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: MR = ModularFormsRing()
sage: MR.default_prec(3)
sage: MR.default_prec()
3
sage: MR.Delta().q_expansion_fixed_d()
q - 24*q^2 + O(q^3)
sage: MF = ModularForms(k=4)
sage: MF.default_prec(2)
sage: MF.E4()
1 + 240*q + O(q^2)
sage: MF.default_prec()
2
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> MR = ModularFormsRing()
>>> MR.default_prec(Integer(3))
>>> MR.default_prec()
3
>>> MR.Delta().q_expansion_fixed_d()
q - 24*q^2 + O(q^3)
>>> MF = ModularForms(k=Integer(4))
>>> MF.default_prec(Integer(2))
>>> MF.E4()
1 + 240*q + O(q^2)
>>> MF.default_prec()
2
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
from sage.modular.modform_hecketriangle.space import ModularForms
MR = ModularFormsRing()
MR.default_prec(3)
MR.default_prec()
MR.Delta().q_expansion_fixed_d()
MF = ModularForms(k=4)
MF.default_prec(2)
MF.E4()
MF.default_prec()
diff_alg()[source]

Return the algebra of differential operators (over QQ) which is used on rational functions representing elements of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().diff_alg()
Noncommutative Multivariate Polynomial Ring in X, Y, Z, dX, dY, dZ over Rational Field, nc-relations: {dX*X: X*dX + 1, dY*Y: Y*dY + 1, dZ*Z: Z*dZ + 1}

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CuspForms(k=12, base_ring=AA).diff_alg()
Noncommutative Multivariate Polynomial Ring in X, Y, Z, dX, dY, dZ over Rational Field, nc-relations: {dX*X: X*dX + 1, dY*Y: Y*dY + 1, dZ*Z: Z*dZ + 1}
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().diff_alg()
Noncommutative Multivariate Polynomial Ring in X, Y, Z, dX, dY, dZ over Rational Field, nc-relations: {dX*X: X*dX + 1, dY*Y: Y*dY + 1, dZ*Z: Z*dZ + 1}

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CuspForms(k=Integer(12), base_ring=AA).diff_alg()
Noncommutative Multivariate Polynomial Ring in X, Y, Z, dX, dY, dZ over Rational Field, nc-relations: {dX*X: X*dX + 1, dY*Y: Y*dY + 1, dZ*Z: Z*dZ + 1}
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().diff_alg()
from sage.modular.modform_hecketriangle.space import CuspForms
CuspForms(k=12, base_ring=AA).diff_alg()
disp_prec(prec=None)[source]

Set the maximal display precision to prec. If prec="max" the precision is set to the default precision. If prec=None (default) then the current display precision is returned instead.

NOTE:

This is used for displaying/representing (elements of) self as Fourier expansions.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: MF = ModularForms(k=4)
sage: MF.default_prec(5)
sage: MF.disp_prec(3)
sage: MF.disp_prec()
3
sage: MF.E4()
1 + 240*q + 2160*q^2 + O(q^3)
sage: MF.disp_prec("max")
sage: MF.E4()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> MF = ModularForms(k=Integer(4))
>>> MF.default_prec(Integer(5))
>>> MF.disp_prec(Integer(3))
>>> MF.disp_prec()
3
>>> MF.E4()
1 + 240*q + 2160*q^2 + O(q^3)
>>> MF.disp_prec("max")
>>> MF.E4()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.space import ModularForms
MF = ModularForms(k=4)
MF.default_prec(5)
MF.disp_prec(3)
MF.disp_prec()
MF.E4()
MF.disp_prec("max")
MF.E4()
extend_type(analytic_type=None, ring=False)[source]

Return a new space which contains (elements of) self with the analytic type of self extended by analytic_type, possibly extended to a graded ring in case ring is True.

INPUT:

  • analytic_type – an AnalyticType or something which coerces into it (default: None)

  • ring – whether to extend to a graded ring (default: False)

OUTPUT: the new extended space

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: from sage.modular.modform_hecketriangle.space import CuspForms

sage: MR = ModularFormsRing(n=5)
sage: MR.extend_type(["quasi", "weak"])
QuasiWeakModularFormsRing(n=5) over Integer Ring

sage: CF=CuspForms(k=12)
sage: CF.extend_type("holo")
ModularForms(n=3, k=12, ep=1) over Integer Ring
sage: CF.extend_type("quasi", ring=True)
QuasiCuspFormsRing(n=3) over Integer Ring

sage: CF.subspace([CF.Delta()]).extend_type()
CuspForms(n=3, k=12, ep=1) over Integer Ring
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> from sage.modular.modform_hecketriangle.space import CuspForms

>>> MR = ModularFormsRing(n=Integer(5))
>>> MR.extend_type(["quasi", "weak"])
QuasiWeakModularFormsRing(n=5) over Integer Ring

>>> CF=CuspForms(k=Integer(12))
>>> CF.extend_type("holo")
ModularForms(n=3, k=12, ep=1) over Integer Ring
>>> CF.extend_type("quasi", ring=True)
QuasiCuspFormsRing(n=3) over Integer Ring

>>> CF.subspace([CF.Delta()]).extend_type()
CuspForms(n=3, k=12, ep=1) over Integer Ring
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
from sage.modular.modform_hecketriangle.space import CuspForms
MR = ModularFormsRing(n=5)
MR.extend_type(["quasi", "weak"])
CF=CuspForms(k=12)
CF.extend_type("holo")
CF.extend_type("quasi", ring=True)
CF.subspace([CF.Delta()]).extend_type()
f_i()[source]

Return a normalized modular form f_i with exactly one simple zero at i (up to the group action).

It lies in a (holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

The polynomial variable y exactly corresponds to f_i.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
sage: MR = ModularFormsRing(n=7)
sage: f_i = MR.f_i()
sage: f_i in MR
True
sage: CuspFormsRing(n=7).f_i() == f_i
True
sage: f_i
f_i
sage: QuasiMeromorphicModularFormsRing(n=7).f_i() == QuasiMeromorphicModularFormsRing(n=7)(f_i)
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
sage: MF = ModularForms(n=5, k=10/3)
sage: f_i = MF.f_i()
sage: f_i in MF
True
sage: ModularFormsRing(n=5, red_hom=True).f_i() == f_i
True
sage: CuspForms(n=5, k=12).f_i() == f_i
True
sage: MF.disp_prec(3)
sage: f_i
1 - 13/(40*d)*q - 351/(64000*d^2)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = ModularForms(n=5)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=5).f_i().q_expansion(prec=5) == MFC(group=5, prec=7).f_i_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=infinity).f_i().q_expansion(prec=5) == MFC(group=infinity, prec=7).f_i_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=5).f_i().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_i_ZZ().add_bigoh(5)
True
sage: ModularForms(n=infinity).f_i().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_i_ZZ().add_bigoh(5)
True

sage: ModularForms(n=infinity, k=2).f_i()
1 - 24*q + 24*q^2 - 96*q^3 + 24*q^4 + O(q^5)

sage: ModularForms(k=6).f_i() == ModularForms(k=4).E6()
True
sage: ModularForms(k=6).f_i()
1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> f_i = MR.f_i()
>>> f_i in MR
True
>>> CuspFormsRing(n=Integer(7)).f_i() == f_i
True
>>> f_i
f_i
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).f_i() == QuasiMeromorphicModularFormsRing(n=Integer(7))(f_i)
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
>>> MF = ModularForms(n=Integer(5), k=Integer(10)/Integer(3))
>>> f_i = MF.f_i()
>>> f_i in MF
True
>>> ModularFormsRing(n=Integer(5), red_hom=True).f_i() == f_i
True
>>> CuspForms(n=Integer(5), k=Integer(12)).f_i() == f_i
True
>>> MF.disp_prec(Integer(3))
>>> f_i
1 - 13/(40*d)*q - 351/(64000*d^2)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = ModularForms(n=Integer(5))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(5)).f_i().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).f_i_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_i().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).f_i_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(5)).f_i().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).f_i_ZZ().add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_i().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).f_i_ZZ().add_bigoh(Integer(5))
True

>>> ModularForms(n=infinity, k=Integer(2)).f_i()
1 - 24*q + 24*q^2 - 96*q^3 + 24*q^4 + O(q^5)

>>> ModularForms(k=Integer(6)).f_i() == ModularForms(k=Integer(4)).E6()
True
>>> ModularForms(k=Integer(6)).f_i()
1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
MR = ModularFormsRing(n=7)
f_i = MR.f_i()
f_i in MR
CuspFormsRing(n=7).f_i() == f_i
f_i
QuasiMeromorphicModularFormsRing(n=7).f_i() == QuasiMeromorphicModularFormsRing(n=7)(f_i)
from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
MF = ModularForms(n=5, k=10/3)
f_i = MF.f_i()
f_i in MF
ModularFormsRing(n=5, red_hom=True).f_i() == f_i
CuspForms(n=5, k=12).f_i() == f_i
MF.disp_prec(3)
f_i
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = ModularForms(n=5)
d = MF.get_d()
q = MF.get_q()
ModularForms(n=5).f_i().q_expansion(prec=5) == MFC(group=5, prec=7).f_i_ZZ()(q/d).add_bigoh(5)
ModularForms(n=infinity).f_i().q_expansion(prec=5) == MFC(group=infinity, prec=7).f_i_ZZ()(q/d).add_bigoh(5)
ModularForms(n=5).f_i().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_i_ZZ().add_bigoh(5)
ModularForms(n=infinity).f_i().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_i_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=2).f_i()
ModularForms(k=6).f_i() == ModularForms(k=4).E6()
ModularForms(k=6).f_i()
f_inf()[source]

Return a normalized (according to its first nontrivial Fourier coefficient) cusp form f_inf with exactly one simple zero at infinity (up to the group action).

It lies in a (cuspidal) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

NOTE:

If n=infinity then f_inf is no longer a cusp form since it doesn’t vanish at the cusp -1. The first non-trivial cusp form is given by E4*f_inf.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
sage: MR = CuspFormsRing(n=7)
sage: f_inf = MR.f_inf()
sage: f_inf in MR
True
sage: f_inf
f_rho^7*d - f_i^2*d
sage: QuasiMeromorphicModularFormsRing(n=7).f_inf() == QuasiMeromorphicModularFormsRing(n=7)(f_inf)
True

sage: from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
sage: MF = CuspForms(n=5, k=20/3)
sage: f_inf = MF.f_inf()
sage: f_inf in MF
True
sage: CuspFormsRing(n=5, red_hom=True).f_inf() == f_inf
True
sage: CuspForms(n=5, k=0).f_inf() == f_inf
True
sage: MF.disp_prec(3)
sage: f_inf
q - 9/(200*d)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = ModularForms(n=5)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=5).f_inf().q_expansion(prec=5) == (d*MFC(group=5, prec=7).f_inf_ZZ()(q/d)).add_bigoh(5)
True
sage: ModularForms(n=infinity).f_inf().q_expansion(prec=5) == (d*MFC(group=infinity, prec=7).f_inf_ZZ()(q/d)).add_bigoh(5)
True
sage: ModularForms(n=5).f_inf().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_inf_ZZ().add_bigoh(5)
True
sage: ModularForms(n=infinity).f_inf().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_inf_ZZ().add_bigoh(5)
True

sage: ModularForms(n=infinity, k=4).f_inf().reduced_parent()
ModularForms(n=+Infinity, k=4, ep=1) over Integer Ring
sage: ModularForms(n=infinity, k=4).f_inf()
q - 8*q^2 + 28*q^3 - 64*q^4 + O(q^5)

sage: CuspForms(k=12).f_inf() == CuspForms(k=12).Delta()
True
sage: CuspForms(k=12).f_inf()
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
>>> MR = CuspFormsRing(n=Integer(7))
>>> f_inf = MR.f_inf()
>>> f_inf in MR
True
>>> f_inf
f_rho^7*d - f_i^2*d
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).f_inf() == QuasiMeromorphicModularFormsRing(n=Integer(7))(f_inf)
True

>>> from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
>>> MF = CuspForms(n=Integer(5), k=Integer(20)/Integer(3))
>>> f_inf = MF.f_inf()
>>> f_inf in MF
True
>>> CuspFormsRing(n=Integer(5), red_hom=True).f_inf() == f_inf
True
>>> CuspForms(n=Integer(5), k=Integer(0)).f_inf() == f_inf
True
>>> MF.disp_prec(Integer(3))
>>> f_inf
q - 9/(200*d)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = ModularForms(n=Integer(5))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(5)).f_inf().q_expansion(prec=Integer(5)) == (d*MFC(group=Integer(5), prec=Integer(7)).f_inf_ZZ()(q/d)).add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_inf().q_expansion(prec=Integer(5)) == (d*MFC(group=infinity, prec=Integer(7)).f_inf_ZZ()(q/d)).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(5)).f_inf().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).f_inf_ZZ().add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_inf().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).f_inf_ZZ().add_bigoh(Integer(5))
True

>>> ModularForms(n=infinity, k=Integer(4)).f_inf().reduced_parent()
ModularForms(n=+Infinity, k=4, ep=1) over Integer Ring
>>> ModularForms(n=infinity, k=Integer(4)).f_inf()
q - 8*q^2 + 28*q^3 - 64*q^4 + O(q^5)

>>> CuspForms(k=Integer(12)).f_inf() == CuspForms(k=Integer(12)).Delta()
True
>>> CuspForms(k=Integer(12)).f_inf()
q - 24*q^2 + 252*q^3 - 1472*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, CuspFormsRing
MR = CuspFormsRing(n=7)
f_inf = MR.f_inf()
f_inf in MR
f_inf
QuasiMeromorphicModularFormsRing(n=7).f_inf() == QuasiMeromorphicModularFormsRing(n=7)(f_inf)
from sage.modular.modform_hecketriangle.space import CuspForms, ModularForms
MF = CuspForms(n=5, k=20/3)
f_inf = MF.f_inf()
f_inf in MF
CuspFormsRing(n=5, red_hom=True).f_inf() == f_inf
CuspForms(n=5, k=0).f_inf() == f_inf
MF.disp_prec(3)
f_inf
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = ModularForms(n=5)
d = MF.get_d()
q = MF.get_q()
ModularForms(n=5).f_inf().q_expansion(prec=5) == (d*MFC(group=5, prec=7).f_inf_ZZ()(q/d)).add_bigoh(5)
ModularForms(n=infinity).f_inf().q_expansion(prec=5) == (d*MFC(group=infinity, prec=7).f_inf_ZZ()(q/d)).add_bigoh(5)
ModularForms(n=5).f_inf().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_inf_ZZ().add_bigoh(5)
ModularForms(n=infinity).f_inf().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_inf_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=4).f_inf().reduced_parent()
ModularForms(n=infinity, k=4).f_inf()
CuspForms(k=12).f_inf() == CuspForms(k=12).Delta()
CuspForms(k=12).f_inf()
f_rho()[source]

Return a normalized modular form f_rho with exactly one simple zero at rho (up to the group action).

It lies in a (holomorphic) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

The polynomial variable x exactly corresponds to f_rho.

NOTE:

If n=infinity the situation is different, there we have: f_rho=1 (since that’s the limit as n goes to infinity) and the polynomial variable x no longer refers to f_rho. Instead it refers to E4 which has exactly one simple zero at the cusp -1. Also note that E4 is the limit of f_rho^(n-2).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
sage: MR = ModularFormsRing(n=7)
sage: f_rho = MR.f_rho()
sage: f_rho in MR
True
sage: CuspFormsRing(n=7).f_rho() == f_rho
True
sage: f_rho
f_rho
sage: QuasiMeromorphicModularFormsRing(n=7).f_rho() == QuasiMeromorphicModularFormsRing(n=7)(f_rho)
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
sage: MF = ModularForms(n=5, k=4/3)
sage: f_rho = MF.f_rho()
sage: f_rho in MF
True
sage: ModularFormsRing(n=5, red_hom=True).f_rho() == f_rho
True
sage: CuspForms(n=5, k=12).f_rho() == f_rho
True
sage: MF.disp_prec(3)
sage: f_rho
1 + 7/(100*d)*q + 21/(160000*d^2)*q^2 + O(q^3)

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
sage: MF = ModularForms(n=5)
sage: d = MF.get_d()
sage: q = MF.get_q()
sage: ModularForms(n=5).f_rho().q_expansion(prec=5) == MFC(group=5, prec=7).f_rho_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=infinity).f_rho().q_expansion(prec=5) == MFC(group=infinity, prec=7).f_rho_ZZ()(q/d).add_bigoh(5)
True
sage: ModularForms(n=5).f_rho().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_rho_ZZ().add_bigoh(5)
True
sage: ModularForms(n=infinity).f_rho().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_rho_ZZ().add_bigoh(5)
True

sage: ModularForms(n=infinity, k=0).f_rho() == ModularForms(n=infinity, k=0)(1)
True

sage: ModularForms(k=4).f_rho() == ModularForms(k=4).E4()
True
sage: ModularForms(k=4).f_rho()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> f_rho = MR.f_rho()
>>> f_rho in MR
True
>>> CuspFormsRing(n=Integer(7)).f_rho() == f_rho
True
>>> f_rho
f_rho
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).f_rho() == QuasiMeromorphicModularFormsRing(n=Integer(7))(f_rho)
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
>>> MF = ModularForms(n=Integer(5), k=Integer(4)/Integer(3))
>>> f_rho = MF.f_rho()
>>> f_rho in MF
True
>>> ModularFormsRing(n=Integer(5), red_hom=True).f_rho() == f_rho
True
>>> CuspForms(n=Integer(5), k=Integer(12)).f_rho() == f_rho
True
>>> MF.disp_prec(Integer(3))
>>> f_rho
1 + 7/(100*d)*q + 21/(160000*d^2)*q^2 + O(q^3)

>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
>>> MF = ModularForms(n=Integer(5))
>>> d = MF.get_d()
>>> q = MF.get_q()
>>> ModularForms(n=Integer(5)).f_rho().q_expansion(prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).f_rho_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_rho().q_expansion(prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).f_rho_ZZ()(q/d).add_bigoh(Integer(5))
True
>>> ModularForms(n=Integer(5)).f_rho().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=Integer(5), prec=Integer(7)).f_rho_ZZ().add_bigoh(Integer(5))
True
>>> ModularForms(n=infinity).f_rho().q_expansion(fix_d=Integer(1), prec=Integer(5)) == MFC(group=infinity, prec=Integer(7)).f_rho_ZZ().add_bigoh(Integer(5))
True

>>> ModularForms(n=infinity, k=Integer(0)).f_rho() == ModularForms(n=infinity, k=Integer(0))(Integer(1))
True

>>> ModularForms(k=Integer(4)).f_rho() == ModularForms(k=Integer(4)).E4()
True
>>> ModularForms(k=Integer(4)).f_rho()
1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, ModularFormsRing, CuspFormsRing
MR = ModularFormsRing(n=7)
f_rho = MR.f_rho()
f_rho in MR
CuspFormsRing(n=7).f_rho() == f_rho
f_rho
QuasiMeromorphicModularFormsRing(n=7).f_rho() == QuasiMeromorphicModularFormsRing(n=7)(f_rho)
from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
MF = ModularForms(n=5, k=4/3)
f_rho = MF.f_rho()
f_rho in MF
ModularFormsRing(n=5, red_hom=True).f_rho() == f_rho
CuspForms(n=5, k=12).f_rho() == f_rho
MF.disp_prec(3)
f_rho
from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor as MFC
MF = ModularForms(n=5)
d = MF.get_d()
q = MF.get_q()
ModularForms(n=5).f_rho().q_expansion(prec=5) == MFC(group=5, prec=7).f_rho_ZZ()(q/d).add_bigoh(5)
ModularForms(n=infinity).f_rho().q_expansion(prec=5) == MFC(group=infinity, prec=7).f_rho_ZZ()(q/d).add_bigoh(5)
ModularForms(n=5).f_rho().q_expansion(fix_d=1, prec=5) == MFC(group=5, prec=7).f_rho_ZZ().add_bigoh(5)
ModularForms(n=infinity).f_rho().q_expansion(fix_d=1, prec=5) == MFC(group=infinity, prec=7).f_rho_ZZ().add_bigoh(5)
ModularForms(n=infinity, k=0).f_rho() == ModularForms(n=infinity, k=0)(1)
ModularForms(k=4).f_rho() == ModularForms(k=4).E4()
ModularForms(k=4).f_rho()
g_inv()[source]

If \(2\) divides \(n\): Return the g-invariant of the group of self.

The g-invariant is analogous to the j-invariant but has multiplier -1. I.e. g_inv(-1/t) = -g_inv(t). It is a (normalized) holomorphic square root of J_inv*(J_inv-1), normalized such that its first nontrivial Fourier coefficient is 1.

If \(2\) does not divide n the function does not exist and an exception is raised.

The g-invariant lies in a (weak) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

NOTE:

If n=infinity then g_inv is holomorphic everywhere except at the cusp -1 where it isn’t even meromorphic. Consequently this function raises an exception for n=infinity.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
sage: MR = WeakModularFormsRing(n=8)
sage: g_inv = MR.g_inv()
sage: g_inv in MR
True
sage: CuspFormsRing(n=8).g_inv() == g_inv
True
sage: g_inv
f_rho^4*f_i/(f_rho^8*d - f_i^2*d)
sage: QuasiMeromorphicModularFormsRing(n=8).g_inv() == QuasiMeromorphicModularFormsRing(n=8)(g_inv)
True

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
sage: MF = WeakModularForms(n=8, k=0, ep=-1)
sage: g_inv = MF.g_inv()
sage: g_inv in MF
True
sage: WeakModularFormsRing(n=8, red_hom=True).g_inv() == g_inv
True
sage: CuspForms(n=8, k=12, ep=1).g_inv() == g_inv
True
sage: MF.disp_prec(3)
sage: g_inv
q^-1 - 15/(128*d) - 15139/(262144*d^2)*q - 11575/(1572864*d^3)*q^2 + O(q^3)

sage: WeakModularForms(n=4, k=0, ep=-1).g_inv()
q^-1 - 24 - 3820*q - 100352*q^2 - 1217598*q^3 - 10797056*q^4 + O(q^5)

As explained above, the g-invariant exists only for even `n`::

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms
sage: MF = WeakModularForms(n=9)
sage: MF.g_inv()
Traceback (most recent call last):
...
ArithmeticError: g_inv doesn't exist for odd n(=9).
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
>>> MR = WeakModularFormsRing(n=Integer(8))
>>> g_inv = MR.g_inv()
>>> g_inv in MR
True
>>> CuspFormsRing(n=Integer(8)).g_inv() == g_inv
True
>>> g_inv
f_rho^4*f_i/(f_rho^8*d - f_i^2*d)
>>> QuasiMeromorphicModularFormsRing(n=Integer(8)).g_inv() == QuasiMeromorphicModularFormsRing(n=Integer(8))(g_inv)
True

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
>>> MF = WeakModularForms(n=Integer(8), k=Integer(0), ep=-Integer(1))
>>> g_inv = MF.g_inv()
>>> g_inv in MF
True
>>> WeakModularFormsRing(n=Integer(8), red_hom=True).g_inv() == g_inv
True
>>> CuspForms(n=Integer(8), k=Integer(12), ep=Integer(1)).g_inv() == g_inv
True
>>> MF.disp_prec(Integer(3))
>>> g_inv
q^-1 - 15/(128*d) - 15139/(262144*d^2)*q - 11575/(1572864*d^3)*q^2 + O(q^3)

>>> WeakModularForms(n=Integer(4), k=Integer(0), ep=-Integer(1)).g_inv()
q^-1 - 24 - 3820*q - 100352*q^2 - 1217598*q^3 - 10797056*q^4 + O(q^5)

As explained above, the g-invariant exists only for even `n`::

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms
>>> MF = WeakModularForms(n=Integer(9))
>>> MF.g_inv()
Traceback (most recent call last):
...
ArithmeticError: g_inv doesn't exist for odd n(=9).
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
MR = WeakModularFormsRing(n=8)
g_inv = MR.g_inv()
g_inv in MR
CuspFormsRing(n=8).g_inv() == g_inv
g_inv
QuasiMeromorphicModularFormsRing(n=8).g_inv() == QuasiMeromorphicModularFormsRing(n=8)(g_inv)
from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
MF = WeakModularForms(n=8, k=0, ep=-1)
g_inv = MF.g_inv()
g_inv in MF
WeakModularFormsRing(n=8, red_hom=True).g_inv() == g_inv
CuspForms(n=8, k=12, ep=1).g_inv() == g_inv
MF.disp_prec(3)
g_inv
WeakModularForms(n=4, k=0, ep=-1).g_inv()
from sage.modular.modform_hecketriangle.space import WeakModularForms
MF = WeakModularForms(n=9)
MF.g_inv()
get_d(fix_d=False, d_num_prec=None)[source]

Return the parameter d of self either as a formal parameter or as a numerical approximation with the specified precision (resp. an exact value in the arithmetic cases).

For an (exact) symbolic expression also see HeckeTriangleGroup().dvalue().

INPUT:

  • fix_d – if False (default) a formal parameter is used for d. If True then the numerical value of d is used (or an exact value if the group is arithmetic). Otherwise, the given value is used for d.

  • d_num_prec – integer (default: None); the numerical precision of d. By default, the default numerical precision of self.parent() is used.

OUTPUT:

The corresponding formal, numerical or exact parameter d of self, depending on the arguments and whether self.group() is arithmetic.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing(n=8).get_d()
d
sage: ModularFormsRing(n=8).get_d().parent()
Fraction Field of Univariate Polynomial Ring in d over Integer Ring
sage: ModularFormsRing(n=infinity).get_d(fix_d = True)
1/64
sage: ModularFormsRing(n=infinity).get_d(fix_d = True).parent()
Rational Field
sage: ModularFormsRing(n=5).default_num_prec(40)
sage: ModularFormsRing(n=5).get_d(fix_d = True)
0.0070522341...
sage: ModularFormsRing(n=5).get_d(fix_d = True).parent()
Real Field with 40 bits of precision
sage: ModularFormsRing(n=5).get_d(fix_d = True, d_num_prec=100).parent()
Real Field with 100 bits of precision
sage: ModularFormsRing(n=5).get_d(fix_d=1).parent()
Integer Ring
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing(n=Integer(8)).get_d()
d
>>> ModularFormsRing(n=Integer(8)).get_d().parent()
Fraction Field of Univariate Polynomial Ring in d over Integer Ring
>>> ModularFormsRing(n=infinity).get_d(fix_d = True)
1/64
>>> ModularFormsRing(n=infinity).get_d(fix_d = True).parent()
Rational Field
>>> ModularFormsRing(n=Integer(5)).default_num_prec(Integer(40))
>>> ModularFormsRing(n=Integer(5)).get_d(fix_d = True)
0.0070522341...
>>> ModularFormsRing(n=Integer(5)).get_d(fix_d = True).parent()
Real Field with 40 bits of precision
>>> ModularFormsRing(n=Integer(5)).get_d(fix_d = True, d_num_prec=Integer(100)).parent()
Real Field with 100 bits of precision
>>> ModularFormsRing(n=Integer(5)).get_d(fix_d=Integer(1)).parent()
Integer Ring
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing(n=8).get_d()
ModularFormsRing(n=8).get_d().parent()
ModularFormsRing(n=infinity).get_d(fix_d = True)
ModularFormsRing(n=infinity).get_d(fix_d = True).parent()
ModularFormsRing(n=5).default_num_prec(40)
ModularFormsRing(n=5).get_d(fix_d = True)
ModularFormsRing(n=5).get_d(fix_d = True).parent()
ModularFormsRing(n=5).get_d(fix_d = True, d_num_prec=100).parent()
ModularFormsRing(n=5).get_d(fix_d=1).parent()
get_q(prec=None, fix_d=False, d_num_prec=None)[source]

Return the generator of the power series of the Fourier expansion of self.

INPUT:

  • prec – an integer or None (default), namely the desired default precision of the space of power series. If nothing is specified the default precision of self is used.

  • fix_d – if False (default) a formal parameter is used for d. If True then the numerical value of d is used (resp. an exact value if the group is arithmetic). Otherwise the given value is used for d.

  • d_num_prec – the precision to be used if a numerical value for d is substituted (default: None), otherwise the default numerical precision of self.parent() is used

OUTPUT:

The generator of the PowerSeriesRing of corresponding to the given parameters. The base ring of the power series ring is given by the corresponding parent of self.get_d() with the same arguments.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing(n=8).default_prec(5)
sage: ModularFormsRing(n=8).get_q().parent()
Power Series Ring in q over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
sage: ModularFormsRing(n=8).get_q().parent().default_prec()
5
sage: ModularFormsRing(n=infinity).get_q(prec=12, fix_d = True).parent()
Power Series Ring in q over Rational Field
sage: ModularFormsRing(n=infinity).get_q(prec=12, fix_d = True).parent().default_prec()
12
sage: ModularFormsRing(n=5).default_num_prec(40)
sage: ModularFormsRing(n=5).get_q(fix_d = True).parent()
Power Series Ring in q over Real Field with 40 bits of precision
sage: ModularFormsRing(n=5).get_q(fix_d = True, d_num_prec=100).parent()
Power Series Ring in q over Real Field with 100 bits of precision
sage: ModularFormsRing(n=5).get_q(fix_d=1).parent()
Power Series Ring in q over Rational Field
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing(n=Integer(8)).default_prec(Integer(5))
>>> ModularFormsRing(n=Integer(8)).get_q().parent()
Power Series Ring in q over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
>>> ModularFormsRing(n=Integer(8)).get_q().parent().default_prec()
5
>>> ModularFormsRing(n=infinity).get_q(prec=Integer(12), fix_d = True).parent()
Power Series Ring in q over Rational Field
>>> ModularFormsRing(n=infinity).get_q(prec=Integer(12), fix_d = True).parent().default_prec()
12
>>> ModularFormsRing(n=Integer(5)).default_num_prec(Integer(40))
>>> ModularFormsRing(n=Integer(5)).get_q(fix_d = True).parent()
Power Series Ring in q over Real Field with 40 bits of precision
>>> ModularFormsRing(n=Integer(5)).get_q(fix_d = True, d_num_prec=Integer(100)).parent()
Power Series Ring in q over Real Field with 100 bits of precision
>>> ModularFormsRing(n=Integer(5)).get_q(fix_d=Integer(1)).parent()
Power Series Ring in q over Rational Field
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing(n=8).default_prec(5)
ModularFormsRing(n=8).get_q().parent()
ModularFormsRing(n=8).get_q().parent().default_prec()
ModularFormsRing(n=infinity).get_q(prec=12, fix_d = True).parent()
ModularFormsRing(n=infinity).get_q(prec=12, fix_d = True).parent().default_prec()
ModularFormsRing(n=5).default_num_prec(40)
ModularFormsRing(n=5).get_q(fix_d = True).parent()
ModularFormsRing(n=5).get_q(fix_d = True, d_num_prec=100).parent()
ModularFormsRing(n=5).get_q(fix_d=1).parent()
graded_ring()[source]

Return the graded ring containing self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
sage: from sage.modular.modform_hecketriangle.space import CuspForms

sage: MR = ModularFormsRing(n=5)
sage: MR.graded_ring() == MR
True

sage: CF=CuspForms(k=12)
sage: CF.graded_ring() == CuspFormsRing()
False
sage: CF.graded_ring() == CuspFormsRing(red_hom=True)
True

sage: CF.subspace([CF.Delta()]).graded_ring() == CuspFormsRing(red_hom=True)
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
>>> from sage.modular.modform_hecketriangle.space import CuspForms

>>> MR = ModularFormsRing(n=Integer(5))
>>> MR.graded_ring() == MR
True

>>> CF=CuspForms(k=Integer(12))
>>> CF.graded_ring() == CuspFormsRing()
False
>>> CF.graded_ring() == CuspFormsRing(red_hom=True)
True

>>> CF.subspace([CF.Delta()]).graded_ring() == CuspFormsRing(red_hom=True)
True
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing, CuspFormsRing
from sage.modular.modform_hecketriangle.space import CuspForms
MR = ModularFormsRing(n=5)
MR.graded_ring() == MR
CF=CuspForms(k=12)
CF.graded_ring() == CuspFormsRing()
CF.graded_ring() == CuspFormsRing(red_hom=True)
CF.subspace([CF.Delta()]).graded_ring() == CuspFormsRing(red_hom=True)
group()[source]

Return the (Hecke triangle) group of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: MR = ModularFormsRing(n=7)
sage: MR.group()
Hecke triangle group for n = 7

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CF = CuspForms(n=7, k=4/5)
sage: CF.group()
Hecke triangle group for n = 7
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> MR.group()
Hecke triangle group for n = 7

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CF = CuspForms(n=Integer(7), k=Integer(4)/Integer(5))
>>> CF.group()
Hecke triangle group for n = 7
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
MR = ModularFormsRing(n=7)
MR.group()
from sage.modular.modform_hecketriangle.space import CuspForms
CF = CuspForms(n=7, k=4/5)
CF.group()
has_reduce_hom()[source]

Return whether the method reduce should reduce homogeneous elements to the corresponding space of homogeneous elements.

This is mainly used by binary operations on homogeneous spaces which temporarily produce an element of self but want to consider it as a homogeneous element (also see reduce).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().has_reduce_hom()
False
sage: ModularFormsRing(red_hom=True).has_reduce_hom()
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: ModularForms(k=6).has_reduce_hom()
True
sage: ModularForms(k=6).graded_ring().has_reduce_hom()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().has_reduce_hom()
False
>>> ModularFormsRing(red_hom=True).has_reduce_hom()
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> ModularForms(k=Integer(6)).has_reduce_hom()
True
>>> ModularForms(k=Integer(6)).graded_ring().has_reduce_hom()
True
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().has_reduce_hom()
ModularFormsRing(red_hom=True).has_reduce_hom()
from sage.modular.modform_hecketriangle.space import ModularForms
ModularForms(k=6).has_reduce_hom()
ModularForms(k=6).graded_ring().has_reduce_hom()
hecke_n()[source]

Return the parameter n of the (Hecke triangle) group of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: MR = ModularFormsRing(n=7)
sage: MR.hecke_n()
7

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CF = CuspForms(n=7, k=4/5)
sage: CF.hecke_n()
7
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> MR = ModularFormsRing(n=Integer(7))
>>> MR.hecke_n()
7

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CF = CuspForms(n=Integer(7), k=Integer(4)/Integer(5))
>>> CF.hecke_n()
7
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
MR = ModularFormsRing(n=7)
MR.hecke_n()
from sage.modular.modform_hecketriangle.space import CuspForms
CF = CuspForms(n=7, k=4/5)
CF.hecke_n()
homogeneous_part(k, ep)[source]

Return the homogeneous component of degree (k, e) of self.

INPUT:

  • k – integer

  • ep\(+1\) or \(-1\)

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
sage: QuasiMeromorphicModularFormsRing(n=7).homogeneous_part(k=2, ep=-1)
QuasiMeromorphicModularForms(n=7, k=2, ep=-1) over Integer Ring
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).homogeneous_part(k=Integer(2), ep=-Integer(1))
QuasiMeromorphicModularForms(n=7, k=2, ep=-1) over Integer Ring
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing
QuasiMeromorphicModularFormsRing(n=7).homogeneous_part(k=2, ep=-1)
is_cuspidal()[source]

Return whether self only contains cuspidal elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing, QuasiCuspFormsRing
sage: QuasiModularFormsRing().is_cuspidal()
False
sage: QuasiCuspFormsRing().is_cuspidal()
True

sage: from sage.modular.modform_hecketriangle.space import ModularForms, QuasiCuspForms
sage: ModularForms(k=12).is_cuspidal()
False
sage: QuasiCuspForms(k=12).is_cuspidal()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing, QuasiCuspFormsRing
>>> QuasiModularFormsRing().is_cuspidal()
False
>>> QuasiCuspFormsRing().is_cuspidal()
True

>>> from sage.modular.modform_hecketriangle.space import ModularForms, QuasiCuspForms
>>> ModularForms(k=Integer(12)).is_cuspidal()
False
>>> QuasiCuspForms(k=Integer(12)).is_cuspidal()
True
from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing, QuasiCuspFormsRing
QuasiModularFormsRing().is_cuspidal()
QuasiCuspFormsRing().is_cuspidal()
from sage.modular.modform_hecketriangle.space import ModularForms, QuasiCuspForms
ModularForms(k=12).is_cuspidal()
QuasiCuspForms(k=12).is_cuspidal()
is_holomorphic()[source]

Return whether self only contains holomorphic modular elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, QuasiModularFormsRing
sage: QuasiWeakModularFormsRing().is_holomorphic()
False
sage: QuasiModularFormsRing().is_holomorphic()
True

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
sage: WeakModularForms(k=10).is_holomorphic()
False
sage: CuspForms(n=7, k=12, base_ring=AA).is_holomorphic()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, QuasiModularFormsRing
>>> QuasiWeakModularFormsRing().is_holomorphic()
False
>>> QuasiModularFormsRing().is_holomorphic()
True

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
>>> WeakModularForms(k=Integer(10)).is_holomorphic()
False
>>> CuspForms(n=Integer(7), k=Integer(12), base_ring=AA).is_holomorphic()
True
from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, QuasiModularFormsRing
QuasiWeakModularFormsRing().is_holomorphic()
QuasiModularFormsRing().is_holomorphic()
from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
WeakModularForms(k=10).is_holomorphic()
CuspForms(n=7, k=12, base_ring=AA).is_holomorphic()
is_homogeneous()[source]

Return whether self is homogeneous component.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().is_homogeneous()
False

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: ModularForms(k=6).is_homogeneous()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().is_homogeneous()
False

>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> ModularForms(k=Integer(6)).is_homogeneous()
True
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().is_homogeneous()
from sage.modular.modform_hecketriangle.space import ModularForms
ModularForms(k=6).is_homogeneous()
is_modular()[source]

Return whether self only contains modular elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, CuspFormsRing
sage: QuasiWeakModularFormsRing().is_modular()
False
sage: CuspFormsRing(n=7).is_modular()
True

sage: from sage.modular.modform_hecketriangle.space import QuasiWeakModularForms, CuspForms
sage: QuasiWeakModularForms(k=10).is_modular()
False
sage: CuspForms(n=7, k=12, base_ring=AA).is_modular()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, CuspFormsRing
>>> QuasiWeakModularFormsRing().is_modular()
False
>>> CuspFormsRing(n=Integer(7)).is_modular()
True

>>> from sage.modular.modform_hecketriangle.space import QuasiWeakModularForms, CuspForms
>>> QuasiWeakModularForms(k=Integer(10)).is_modular()
False
>>> CuspForms(n=Integer(7), k=Integer(12), base_ring=AA).is_modular()
True
from sage.modular.modform_hecketriangle.graded_ring import QuasiWeakModularFormsRing, CuspFormsRing
QuasiWeakModularFormsRing().is_modular()
CuspFormsRing(n=7).is_modular()
from sage.modular.modform_hecketriangle.space import QuasiWeakModularForms, CuspForms
QuasiWeakModularForms(k=10).is_modular()
CuspForms(n=7, k=12, base_ring=AA).is_modular()
is_weakly_holomorphic()[source]

Return whether self only contains weakly holomorphic modular elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing, CuspFormsRing
sage: QuasiMeromorphicModularFormsRing().is_weakly_holomorphic()
False
sage: QuasiWeakModularFormsRing().is_weakly_holomorphic()
True

sage: from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
sage: MeromorphicModularForms(k=10).is_weakly_holomorphic()
False
sage: CuspForms(n=7, k=12, base_ring=AA).is_weakly_holomorphic()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing, CuspFormsRing
>>> QuasiMeromorphicModularFormsRing().is_weakly_holomorphic()
False
>>> QuasiWeakModularFormsRing().is_weakly_holomorphic()
True

>>> from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
>>> MeromorphicModularForms(k=Integer(10)).is_weakly_holomorphic()
False
>>> CuspForms(n=Integer(7), k=Integer(12), base_ring=AA).is_weakly_holomorphic()
True
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, QuasiWeakModularFormsRing, CuspFormsRing
QuasiMeromorphicModularFormsRing().is_weakly_holomorphic()
QuasiWeakModularFormsRing().is_weakly_holomorphic()
from sage.modular.modform_hecketriangle.space import MeromorphicModularForms, CuspForms
MeromorphicModularForms(k=10).is_weakly_holomorphic()
CuspForms(n=7, k=12, base_ring=AA).is_weakly_holomorphic()
is_zerospace()[source]

Return whether self is the (\(0\)-dimensional) zero space.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().is_zerospace()
False

sage: from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
sage: ModularForms(k=12).is_zerospace()
False
sage: CuspForms(k=12).reduce_type([]).is_zerospace()
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().is_zerospace()
False

>>> from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
>>> ModularForms(k=Integer(12)).is_zerospace()
False
>>> CuspForms(k=Integer(12)).reduce_type([]).is_zerospace()
True
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().is_zerospace()
from sage.modular.modform_hecketriangle.space import ModularForms, CuspForms
ModularForms(k=12).is_zerospace()
CuspForms(k=12).reduce_type([]).is_zerospace()
j_inv()[source]

Return the j-invariant (Hauptmodul) of the group of self. It is normalized such that j_inv(infinity) = infinity, and such that it has real Fourier coefficients starting with 1.

It lies in a (weak) extension of the graded ring of self. In case has_reduce_hom is True it is given as an element of the corresponding space of homogeneous elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
sage: MR = WeakModularFormsRing(n=7)
sage: j_inv = MR.j_inv()
sage: j_inv in MR
True
sage: CuspFormsRing(n=7).j_inv() == j_inv
True
sage: j_inv
f_rho^7/(f_rho^7*d - f_i^2*d)
sage: QuasiMeromorphicModularFormsRing(n=7).j_inv() == QuasiMeromorphicModularFormsRing(n=7)(j_inv)
True

sage: from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
sage: MF = WeakModularForms(n=5, k=0)
sage: j_inv = MF.j_inv()
sage: j_inv in MF
True
sage: WeakModularFormsRing(n=5, red_hom=True).j_inv() == j_inv
True
sage: CuspForms(n=5, k=12).j_inv() == j_inv
True
sage: MF.disp_prec(3)
sage: j_inv
q^-1 + 79/(200*d) + 42877/(640000*d^2)*q + 12957/(2000000*d^3)*q^2 + O(q^3)

sage: WeakModularForms(n=infinity).j_inv()
q^-1 + 24 + 276*q + 2048*q^2 + 11202*q^3 + 49152*q^4 + O(q^5)

sage: WeakModularForms().j_inv()
q^-1 + 744 + 196884*q + 21493760*q^2 + 864299970*q^3 + 20245856256*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
>>> MR = WeakModularFormsRing(n=Integer(7))
>>> j_inv = MR.j_inv()
>>> j_inv in MR
True
>>> CuspFormsRing(n=Integer(7)).j_inv() == j_inv
True
>>> j_inv
f_rho^7/(f_rho^7*d - f_i^2*d)
>>> QuasiMeromorphicModularFormsRing(n=Integer(7)).j_inv() == QuasiMeromorphicModularFormsRing(n=Integer(7))(j_inv)
True

>>> from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
>>> MF = WeakModularForms(n=Integer(5), k=Integer(0))
>>> j_inv = MF.j_inv()
>>> j_inv in MF
True
>>> WeakModularFormsRing(n=Integer(5), red_hom=True).j_inv() == j_inv
True
>>> CuspForms(n=Integer(5), k=Integer(12)).j_inv() == j_inv
True
>>> MF.disp_prec(Integer(3))
>>> j_inv
q^-1 + 79/(200*d) + 42877/(640000*d^2)*q + 12957/(2000000*d^3)*q^2 + O(q^3)

>>> WeakModularForms(n=infinity).j_inv()
q^-1 + 24 + 276*q + 2048*q^2 + 11202*q^3 + 49152*q^4 + O(q^5)

>>> WeakModularForms().j_inv()
q^-1 + 744 + 196884*q + 21493760*q^2 + 864299970*q^3 + 20245856256*q^4 + O(q^5)
from sage.modular.modform_hecketriangle.graded_ring import QuasiMeromorphicModularFormsRing, WeakModularFormsRing, CuspFormsRing
MR = WeakModularFormsRing(n=7)
j_inv = MR.j_inv()
j_inv in MR
CuspFormsRing(n=7).j_inv() == j_inv
j_inv
QuasiMeromorphicModularFormsRing(n=7).j_inv() == QuasiMeromorphicModularFormsRing(n=7)(j_inv)
from sage.modular.modform_hecketriangle.space import WeakModularForms, CuspForms
MF = WeakModularForms(n=5, k=0)
j_inv = MF.j_inv()
j_inv in MF
WeakModularFormsRing(n=5, red_hom=True).j_inv() == j_inv
CuspForms(n=5, k=12).j_inv() == j_inv
MF.disp_prec(3)
j_inv
WeakModularForms(n=infinity).j_inv()
WeakModularForms().j_inv()
pol_ring()[source]

Return the underlying polynomial ring used by self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().pol_ring()
Multivariate Polynomial Ring in x, y, z, d over Integer Ring

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CuspForms(k=12, base_ring=AA).pol_ring()
Multivariate Polynomial Ring in x, y, z, d over Algebraic Real Field
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().pol_ring()
Multivariate Polynomial Ring in x, y, z, d over Integer Ring

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CuspForms(k=Integer(12), base_ring=AA).pol_ring()
Multivariate Polynomial Ring in x, y, z, d over Algebraic Real Field
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().pol_ring()
from sage.modular.modform_hecketriangle.space import CuspForms
CuspForms(k=12, base_ring=AA).pol_ring()
rat_field()[source]

Return the underlying rational field used by self to construct/represent elements.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
sage: ModularFormsRing().rat_field()
Fraction Field of Multivariate Polynomial Ring in x, y, z, d over Integer Ring

sage: from sage.modular.modform_hecketriangle.space import CuspForms
sage: CuspForms(k=12, base_ring=AA).rat_field()
Fraction Field of Multivariate Polynomial Ring in x, y, z, d over Algebraic Real Field
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
>>> ModularFormsRing().rat_field()
Fraction Field of Multivariate Polynomial Ring in x, y, z, d over Integer Ring

>>> from sage.modular.modform_hecketriangle.space import CuspForms
>>> CuspForms(k=Integer(12), base_ring=AA).rat_field()
Fraction Field of Multivariate Polynomial Ring in x, y, z, d over Algebraic Real Field
from sage.modular.modform_hecketriangle.graded_ring import ModularFormsRing
ModularFormsRing().rat_field()
from sage.modular.modform_hecketriangle.space import CuspForms
CuspForms(k=12, base_ring=AA).rat_field()
reduce_type(analytic_type=None, degree=None)[source]

Return a new space with analytic properties shared by both self and analytic_type, possibly reduced to its space of homogeneous elements of the given degree (if degree is set). Elements of the new space are contained in self.

INPUT:

  • analytic_type – an AnalyticType or something which coerces into it (default: None)

  • degreeNone (default) or the degree of the homogeneous component to which self should be reduced

OUTPUT: the new reduced space

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing
sage: from sage.modular.modform_hecketriangle.space import QuasiModularForms

sage: MR = QuasiModularFormsRing()
sage: MR.reduce_type(["quasi", "cusp"])
QuasiCuspFormsRing(n=3) over Integer Ring

sage: MR.reduce_type("cusp", degree=(12,1))
CuspForms(n=3, k=12, ep=1) over Integer Ring

sage: MF=QuasiModularForms(k=6)
sage: MF.reduce_type("holo")
ModularForms(n=3, k=6, ep=-1) over Integer Ring

sage: MF.reduce_type([])
ZeroForms(n=3, k=6, ep=-1) over Integer Ring
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing
>>> from sage.modular.modform_hecketriangle.space import QuasiModularForms

>>> MR = QuasiModularFormsRing()
>>> MR.reduce_type(["quasi", "cusp"])
QuasiCuspFormsRing(n=3) over Integer Ring

>>> MR.reduce_type("cusp", degree=(Integer(12),Integer(1)))
CuspForms(n=3, k=12, ep=1) over Integer Ring

>>> MF=QuasiModularForms(k=Integer(6))
>>> MF.reduce_type("holo")
ModularForms(n=3, k=6, ep=-1) over Integer Ring

>>> MF.reduce_type([])
ZeroForms(n=3, k=6, ep=-1) over Integer Ring
from sage.modular.modform_hecketriangle.graded_ring import QuasiModularFormsRing
from sage.modular.modform_hecketriangle.space import QuasiModularForms
MR = QuasiModularFormsRing()
MR.reduce_type(["quasi", "cusp"])
MR.reduce_type("cusp", degree=(12,1))
MF=QuasiModularForms(k=6)
MF.reduce_type("holo")
MF.reduce_type([])