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]#

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 non-negative 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
```