Series constructor for modular forms for Hecke triangle groups

AUTHORS:

  • Based on the thesis of John Garrett Leo (2008)

  • Jonas Jermann (2013): initial version

Note

J_inv_ZZ is the main function used to determine all Fourier expansions.

class sage.modular.modform_hecketriangle.series_constructor.MFSeriesConstructor(group, prec)[source]

Bases: SageObject, UniqueRepresentation

Constructor for the Fourier expansion of some (specific, basic) modular forms.

The constructor is used by forms elements in case their Fourier expansion is needed or requested.

Delta_ZZ()[source]

Return the rational Fourier expansion of Delta, where the parameter d is replaced by 1.

Note

The Fourier expansion of Delta for d!=1 is given by d*Delta_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).Delta_ZZ()
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
sage: MFSeriesConstructor(group=5, prec=3).Delta_ZZ()
q + 47/200*q^2 + 11367/640000*q^3 + O(q^4)
sage: MFSeriesConstructor(group=5, prec=3).Delta_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).Delta_ZZ()
q + 3/8*q^2 + 63/1024*q^3 + O(q^4)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).Delta_ZZ()
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).Delta_ZZ()
q + 47/200*q^2 + 11367/640000*q^3 + O(q^4)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).Delta_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).Delta_ZZ()
q + 3/8*q^2 + 63/1024*q^3 + O(q^4)
E2_ZZ()[source]

Return the rational Fourier expansion of E2, where the parameter d is replaced by 1.

Note

The Fourier expansion of E2 for d!=1 is given by E2_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).E2_ZZ()
1 - 1/72*q - 1/41472*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E2_ZZ()
1 - 9/200*q - 369/320000*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E2_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).E2_ZZ()
1 - 1/8*q - 1/512*q^2 + O(q^3)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).E2_ZZ()
1 - 1/72*q - 1/41472*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E2_ZZ()
1 - 9/200*q - 369/320000*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E2_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).E2_ZZ()
1 - 1/8*q - 1/512*q^2 + O(q^3)
E4_ZZ()[source]

Return the rational Fourier expansion of E_4, where the parameter d is replaced by 1.

Note

The Fourier expansion of E4 for d!=1 is given by E4_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).E4_ZZ()
1 + 5/36*q + 5/6912*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E4_ZZ()
1 + 21/100*q + 483/32000*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E4_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).E4_ZZ()
1 + 1/4*q + 7/256*q^2 + O(q^3)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).E4_ZZ()
1 + 5/36*q + 5/6912*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E4_ZZ()
1 + 21/100*q + 483/32000*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E4_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).E4_ZZ()
1 + 1/4*q + 7/256*q^2 + O(q^3)
E6_ZZ()[source]

Return the rational Fourier expansion of E_6, where the parameter d is replaced by 1.

Note

The Fourier expansion of E6 for d!=1 is given by E6_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).E6_ZZ()
1 - 7/24*q - 77/13824*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E6_ZZ()
1 - 37/200*q - 14663/320000*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).E6_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).E6_ZZ()
1 - 1/8*q - 31/512*q^2 + O(q^3)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).E6_ZZ()
1 - 7/24*q - 77/13824*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E6_ZZ()
1 - 37/200*q - 14663/320000*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).E6_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).E6_ZZ()
1 - 1/8*q - 31/512*q^2 + O(q^3)
EisensteinSeries_ZZ(k)[source]

Return the rational Fourier expansion of the normalized Eisenstein series of weight k, where the parameter d is replaced by 1.

Only arithmetic groups with n < infinity are supported!

Note

THe Fourier expansion of the series is given by EisensteinSeries_ZZ(q/d).

INPUT:

  • k – a nonnegative even integer, namely the weight

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFC = MFSeriesConstructor(prec=6)
sage: MFC.EisensteinSeries_ZZ(k=0)
1
sage: MFC.EisensteinSeries_ZZ(k=2)
1 - 1/72*q - 1/41472*q^2 - 1/53747712*q^3 - 7/371504185344*q^4 - 1/106993205379072*q^5 + O(q^6)
sage: MFC.EisensteinSeries_ZZ(k=6)
1 - 7/24*q - 77/13824*q^2 - 427/17915904*q^3 - 7399/123834728448*q^4 - 3647/35664401793024*q^5 + O(q^6)
sage: MFC.EisensteinSeries_ZZ(k=12)
1 + 455/8292*q + 310765/4776192*q^2 + 20150585/6189944832*q^3 + 1909340615/42784898678784*q^4 + 3702799555/12322050819489792*q^5 + O(q^6)
sage: MFC.EisensteinSeries_ZZ(k=12).parent()
Power Series Ring in q over Rational Field

sage: MFC = MFSeriesConstructor(group=4, prec=5)
sage: MFC.EisensteinSeries_ZZ(k=2)
1 - 1/32*q - 5/8192*q^2 - 1/524288*q^3 - 13/536870912*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=4)
1 + 3/16*q + 39/4096*q^2 + 21/262144*q^3 + 327/268435456*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=6)
1 - 7/32*q - 287/8192*q^2 - 427/524288*q^3 - 9247/536870912*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=12)
1 + 63/11056*q + 133119/2830336*q^2 + 2790081/181141504*q^3 + 272631807/185488900096*q^4 + O(q^5)

sage: MFC = MFSeriesConstructor(group=6, prec=5)
sage: MFC.EisensteinSeries_ZZ(k=2)
1 - 1/18*q - 1/648*q^2 - 7/209952*q^3 - 7/22674816*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=4)
1 + 2/9*q + 1/54*q^2 + 37/52488*q^3 + 73/5668704*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=6)
1 - 1/6*q - 11/216*q^2 - 271/69984*q^3 - 1057/7558272*q^4 + O(q^5)
sage: MFC.EisensteinSeries_ZZ(k=12)
1 + 182/151329*q + 62153/2723922*q^2 + 16186807/882550728*q^3 + 381868123/95315478624*q^4 + O(q^5)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFC = MFSeriesConstructor(prec=Integer(6))
>>> MFC.EisensteinSeries_ZZ(k=Integer(0))
1
>>> MFC.EisensteinSeries_ZZ(k=Integer(2))
1 - 1/72*q - 1/41472*q^2 - 1/53747712*q^3 - 7/371504185344*q^4 - 1/106993205379072*q^5 + O(q^6)
>>> MFC.EisensteinSeries_ZZ(k=Integer(6))
1 - 7/24*q - 77/13824*q^2 - 427/17915904*q^3 - 7399/123834728448*q^4 - 3647/35664401793024*q^5 + O(q^6)
>>> MFC.EisensteinSeries_ZZ(k=Integer(12))
1 + 455/8292*q + 310765/4776192*q^2 + 20150585/6189944832*q^3 + 1909340615/42784898678784*q^4 + 3702799555/12322050819489792*q^5 + O(q^6)
>>> MFC.EisensteinSeries_ZZ(k=Integer(12)).parent()
Power Series Ring in q over Rational Field

>>> MFC = MFSeriesConstructor(group=Integer(4), prec=Integer(5))
>>> MFC.EisensteinSeries_ZZ(k=Integer(2))
1 - 1/32*q - 5/8192*q^2 - 1/524288*q^3 - 13/536870912*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(4))
1 + 3/16*q + 39/4096*q^2 + 21/262144*q^3 + 327/268435456*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(6))
1 - 7/32*q - 287/8192*q^2 - 427/524288*q^3 - 9247/536870912*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(12))
1 + 63/11056*q + 133119/2830336*q^2 + 2790081/181141504*q^3 + 272631807/185488900096*q^4 + O(q^5)

>>> MFC = MFSeriesConstructor(group=Integer(6), prec=Integer(5))
>>> MFC.EisensteinSeries_ZZ(k=Integer(2))
1 - 1/18*q - 1/648*q^2 - 7/209952*q^3 - 7/22674816*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(4))
1 + 2/9*q + 1/54*q^2 + 37/52488*q^3 + 73/5668704*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(6))
1 - 1/6*q - 11/216*q^2 - 271/69984*q^3 - 1057/7558272*q^4 + O(q^5)
>>> MFC.EisensteinSeries_ZZ(k=Integer(12))
1 + 182/151329*q + 62153/2723922*q^2 + 16186807/882550728*q^3 + 381868123/95315478624*q^4 + O(q^5)
G_inv_ZZ()[source]

Return the rational Fourier expansion of G_inv, where the parameter d is replaced by 1.

Note

The Fourier expansion of G_inv for d!=1 is given by d*G_inv_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(group=4, prec=3).G_inv_ZZ()
q^-1 - 3/32 - 955/16384*q + O(q^2)
sage: MFSeriesConstructor(group=8, prec=3).G_inv_ZZ()
q^-1 - 15/128 - 15139/262144*q + O(q^2)
sage: MFSeriesConstructor(group=8, prec=3).G_inv_ZZ().parent()
Laurent Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).G_inv_ZZ()
q^-1 - 1/8 - 59/1024*q + O(q^2)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(group=Integer(4), prec=Integer(3)).G_inv_ZZ()
q^-1 - 3/32 - 955/16384*q + O(q^2)
>>> MFSeriesConstructor(group=Integer(8), prec=Integer(3)).G_inv_ZZ()
q^-1 - 15/128 - 15139/262144*q + O(q^2)
>>> MFSeriesConstructor(group=Integer(8), prec=Integer(3)).G_inv_ZZ().parent()
Laurent Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).G_inv_ZZ()
q^-1 - 1/8 - 59/1024*q + O(q^2)
J_inv_ZZ()[source]

Return the rational Fourier expansion of J_inv, where the parameter d is replaced by 1.

This is the main function used to determine all Fourier expansions!

Note

The Fourier expansion of J_inv for d!=1 is given by J_inv_ZZ(q/d).

Todo

The functions that are used in this implementation are products of hypergeometric series with other, elementary, functions. Implement them and clean up this representation.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).J_inv_ZZ()
q^-1 + 31/72 + 1823/27648*q + O(q^2)
sage: MFSeriesConstructor(group=5, prec=3).J_inv_ZZ()
q^-1 + 79/200 + 42877/640000*q + O(q^2)
sage: MFSeriesConstructor(group=5, prec=3).J_inv_ZZ().parent()
Laurent Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).J_inv_ZZ()
q^-1 + 3/8 + 69/1024*q + O(q^2)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).J_inv_ZZ()
q^-1 + 31/72 + 1823/27648*q + O(q^2)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).J_inv_ZZ()
q^-1 + 79/200 + 42877/640000*q + O(q^2)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).J_inv_ZZ().parent()
Laurent Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).J_inv_ZZ()
q^-1 + 3/8 + 69/1024*q + O(q^2)
f_i_ZZ()[source]

Return the rational Fourier expansion of f_i, where the parameter d is replaced by 1.

Note

The Fourier expansion of f_i for d!=1 is given by f_i_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).f_i_ZZ()
1 - 7/24*q - 77/13824*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).f_i_ZZ()
1 - 13/40*q - 351/64000*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).f_i_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).f_i_ZZ()
1 - 3/8*q + 3/512*q^2 + O(q^3)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).f_i_ZZ()
1 - 7/24*q - 77/13824*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_i_ZZ()
1 - 13/40*q - 351/64000*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_i_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).f_i_ZZ()
1 - 3/8*q + 3/512*q^2 + O(q^3)
f_inf_ZZ()[source]

Return the rational Fourier expansion of f_inf, where the parameter d is replaced by 1.

Note

The Fourier expansion of f_inf for d!=1 is given by d*f_inf_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).f_inf_ZZ()
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
sage: MFSeriesConstructor(group=5, prec=3).f_inf_ZZ()
q - 9/200*q^2 + 279/640000*q^3 + O(q^4)
sage: MFSeriesConstructor(group=5, prec=3).f_inf_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).f_inf_ZZ()
q - 1/8*q^2 + 7/1024*q^3 + O(q^4)
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).f_inf_ZZ()
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_inf_ZZ()
q - 9/200*q^2 + 279/640000*q^3 + O(q^4)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_inf_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).f_inf_ZZ()
q - 1/8*q^2 + 7/1024*q^3 + O(q^4)
f_rho_ZZ()[source]

Return the rational Fourier expansion of f_rho, where the parameter d is replaced by 1.

Note

The Fourier expansion of f_rho for d!=1 is given by f_rho_ZZ(q/d).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(prec=3).f_rho_ZZ()
1 + 5/36*q + 5/6912*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).f_rho_ZZ()
1 + 7/100*q + 21/160000*q^2 + O(q^3)
sage: MFSeriesConstructor(group=5, prec=3).f_rho_ZZ().parent()
Power Series Ring in q over Rational Field

sage: MFSeriesConstructor(group=infinity, prec=3).f_rho_ZZ()
1
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(prec=Integer(3)).f_rho_ZZ()
1 + 5/36*q + 5/6912*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_rho_ZZ()
1 + 7/100*q + 21/160000*q^2 + O(q^3)
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(3)).f_rho_ZZ().parent()
Power Series Ring in q over Rational Field

>>> MFSeriesConstructor(group=infinity, prec=Integer(3)).f_rho_ZZ()
1
group()[source]

Return the (Hecke triangle) group of self.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(group=4).group()
Hecke triangle group for n = 4
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(group=Integer(4)).group()
Hecke triangle group for n = 4
hecke_n()[source]

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

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(group=4).hecke_n()
4
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(group=Integer(4)).hecke_n()
4
prec()[source]

Return the used default precision for the PowerSeriesRing or LaurentSeriesRing.

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
sage: MFSeriesConstructor(group=5).prec()
10
sage: MFSeriesConstructor(group=5, prec=20).prec()
20
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
>>> MFSeriesConstructor(group=Integer(5)).prec()
10
>>> MFSeriesConstructor(group=Integer(5), prec=Integer(20)).prec()
20