# Elements of Hecke modular forms spaces#

AUTHORS:

• Jonas Jermann (2013): initial version

class sage.modular.modform_hecketriangle.element.FormsElement(parent, rat)[source]#

Bases: FormsRingElement

(Hecke) modular forms.

ambient_coordinate_vector()[source]#

Return the coordinate vector of self with respect to self.parent().ambient_space().gens().

The returned coordinate vector is an element of self.parent().module().

Note

This uses the corresponding function of the parent. If the parent has not defined a coordinate vector function or an ambient module for coordinate vectors then an exception is raised by the parent (default implementation).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: MF = ModularForms(n=4, k=24, ep=-1)
sage: MF.gen(0).ambient_coordinate_vector().parent()
Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
sage: MF.gen(0).ambient_coordinate_vector()
(1, 0, 0)
sage: subspace = MF.subspace([MF.gen(0), MF.gen(2)])
sage: subspace.gen(0).ambient_coordinate_vector().parent()
Vector space of degree 3 and dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
Basis matrix:
[1 0 0]
[0 0 1]
sage: subspace.gen(0).ambient_coordinate_vector()
(1, 0, 0)
sage: subspace.gen(0).ambient_coordinate_vector() == subspace.ambient_coordinate_vector(subspace.gen(0))
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> MF = ModularForms(n=Integer(4), k=Integer(24), ep=-Integer(1))
>>> MF.gen(Integer(0)).ambient_coordinate_vector().parent()
Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
>>> MF.gen(Integer(0)).ambient_coordinate_vector()
(1, 0, 0)
>>> subspace = MF.subspace([MF.gen(Integer(0)), MF.gen(Integer(2))])
>>> subspace.gen(Integer(0)).ambient_coordinate_vector().parent()
Vector space of degree 3 and dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
Basis matrix:
[1 0 0]
[0 0 1]
>>> subspace.gen(Integer(0)).ambient_coordinate_vector()
(1, 0, 0)
>>> subspace.gen(Integer(0)).ambient_coordinate_vector() == subspace.ambient_coordinate_vector(subspace.gen(Integer(0)))
True
coordinate_vector()[source]#

Return the coordinate vector of self with respect to self.parent().gens().

Note

This uses the corresponding function of the parent. If the parent has not defined a coordinate vector function or a module for coordinate vectors then an exception is raised by the parent (default implementation).

EXAMPLES:

sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: MF = ModularForms(n=4, k=24, ep=-1)
sage: MF.gen(0).coordinate_vector().parent()
Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
sage: MF.gen(0).coordinate_vector()
(1, 0, 0)
sage: subspace = MF.subspace([MF.gen(0), MF.gen(2)])
sage: subspace.gen(0).coordinate_vector().parent()
Vector space of dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
sage: subspace.gen(0).coordinate_vector()
(1, 0)
sage: subspace.gen(0).coordinate_vector() == subspace.coordinate_vector(subspace.gen(0))
True
>>> from sage.all import *
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> MF = ModularForms(n=Integer(4), k=Integer(24), ep=-Integer(1))
>>> MF.gen(Integer(0)).coordinate_vector().parent()
Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
>>> MF.gen(Integer(0)).coordinate_vector()
(1, 0, 0)
>>> subspace = MF.subspace([MF.gen(Integer(0)), MF.gen(Integer(2))])
>>> subspace.gen(Integer(0)).coordinate_vector().parent()
Vector space of dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring
>>> subspace.gen(Integer(0)).coordinate_vector()
(1, 0)
>>> subspace.gen(Integer(0)).coordinate_vector() == subspace.coordinate_vector(subspace.gen(Integer(0)))
True
lseries(num_prec=None, max_imaginary_part=0, max_asymp_coeffs=40)[source]#

Return the L-series of self if self is modular and holomorphic.

This relies on the (pari) based function Dokchitser.

INPUT:

• num_prec – An integer denoting the to-be-used numerical precision. If integer num_prec=None (default) the default numerical precision of the parent of self is used.

• max_imaginary_part – A real number (default: 0), indicating up to which imaginary part the L-series is going to be studied.

• max_asymp_coeffs – An integer (default: 40).

OUTPUT:

An interface to Tim Dokchitser’s program for computing L-series, namely the series given by the Fourier coefficients of self.

EXAMPLES:

sage: from sage.modular.modform.eis_series import eisenstein_series_lseries
sage: from sage.modular.modform_hecketriangle.space import ModularForms
sage: f = ModularForms(n=3, k=4).E4()/240
sage: L = f.lseries()
sage: L
L-series associated to the modular form 1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + O(q^5)
sage: L.conductor
1
sage: L(1).prec()
53
sage: L.check_functional_equation() < 2^(-50)
True
sage: L(1)
-0.0304484570583...
sage: abs(L(1) - eisenstein_series_lseries(4)(1)) < 2^(-53)
True
sage: L.derivative(1, 1)
-0.0504570844798...
sage: L.derivative(1, 2)/2
-0.0350657360354...
sage: L.taylor_series(1, 3)
-0.0304484570583... - 0.0504570844798...*z - 0.0350657360354...*z^2 + O(z^3)
sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
sage: sum([coeffs[k] * ZZ(k)^(-10) for k in range(1,len(coeffs))]).n(53)
1.00935215408...
sage: L(10)
1.00935215649...

sage: f = ModularForms(n=6, k=4).E4()
sage: L = f.lseries(num_prec=200)
sage: L.conductor
3
sage: L.check_functional_equation() < 2^(-180)
True
sage: L(1)
-2.92305187760575399490414692523085855811204642031749788...
sage: L(1).prec()
200
sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
sage: sum([coeffs[k] * ZZ(k)^(-10) for k in range(1,len(coeffs))]).n(53)
24.2281438789...
sage: L(10).n(53)
24.2281439447...

sage: f = ModularForms(n=8, k=6, ep=-1).E6()
sage: L = f.lseries()
sage: L.check_functional_equation() < 2^(-45)
True
sage: L.taylor_series(3, 3)
0.000000000000... + 0.867197036668...*z + 0.261129628199...*z^2 + O(z^3)
sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
sage: sum([coeffs[k]*k^(-10) for k in range(1,len(coeffs))]).n(53)
-13.0290002560...
sage: L(10).n(53)
-13.0290184579...

sage: # long time
sage: f = (ModularForms(n=17, k=24).Delta()^2)
sage: L = f.lseries()
sage: L.check_functional_equation() < 2^(-50)
True
sage: L.taylor_series(12, 3)
0.000683924755280... - 0.000875942285963...*z + 0.000647618966023...*z^2 + O(z^3)
sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
sage: sum([coeffs[k]*k^(-30) for k in range(1,len(coeffs))]).n(53)
9.31562890589...e-10
sage: L(30).n(53)
9.31562890589...e-10

sage: f = ModularForms(n=infinity, k=2, ep=-1).f_i()
sage: L = f.lseries()
sage: L.check_functional_equation() < 2^(-50)
True
sage: L.taylor_series(1, 3)
0.000000000000... + 5.76543616701...*z + 9.92776715593...*z^2 + O(z^3)
sage: coeffs = f.q_expansion_vector(min_exp=0, max_exp=20, fix_d=True)
sage: sum([coeffs[k] * ZZ(k)^(-10) for k in range(1,len(coeffs))]).n(53)
-23.9781792831...
sage: L(10).n(53)
-23.9781792831...
>>> from sage.all import *
>>> from sage.modular.modform.eis_series import eisenstein_series_lseries
>>> from sage.modular.modform_hecketriangle.space import ModularForms
>>> f = ModularForms(n=Integer(3), k=Integer(4)).E4()/Integer(240)
>>> L = f.lseries()
>>> L
L-series associated to the modular form 1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + O(q^5)
>>> L.conductor
1
>>> L(Integer(1)).prec()
53
>>> L.check_functional_equation() < Integer(2)**(-Integer(50))
True
>>> L(Integer(1))
-0.0304484570583...
>>> abs(L(Integer(1)) - eisenstein_series_lseries(Integer(4))(Integer(1))) < Integer(2)**(-Integer(53))
True
>>> L.derivative(Integer(1), Integer(1))
-0.0504570844798...
>>> L.derivative(Integer(1), Integer(2))/Integer(2)
-0.0350657360354...
>>> L.taylor_series(Integer(1), Integer(3))
-0.0304484570583... - 0.0504570844798...*z - 0.0350657360354...*z^2 + O(z^3)
>>> coeffs = f.q_expansion_vector(min_exp=Integer(0), max_exp=Integer(20), fix_d=True)
>>> sum([coeffs[k] * ZZ(k)**(-Integer(10)) for k in range(Integer(1),len(coeffs))]).n(Integer(53))
1.00935215408...
>>> L(Integer(10))
1.00935215649...

>>> f = ModularForms(n=Integer(6), k=Integer(4)).E4()
>>> L = f.lseries(num_prec=Integer(200))
>>> L.conductor
3
>>> L.check_functional_equation() < Integer(2)**(-Integer(180))
True
>>> L(Integer(1))
-2.92305187760575399490414692523085855811204642031749788...
>>> L(Integer(1)).prec()
200
>>> coeffs = f.q_expansion_vector(min_exp=Integer(0), max_exp=Integer(20), fix_d=True)
>>> sum([coeffs[k] * ZZ(k)**(-Integer(10)) for k in range(Integer(1),len(coeffs))]).n(Integer(53))
24.2281438789...
>>> L(Integer(10)).n(Integer(53))
24.2281439447...

>>> f = ModularForms(n=Integer(8), k=Integer(6), ep=-Integer(1)).E6()
>>> L = f.lseries()
>>> L.check_functional_equation() < Integer(2)**(-Integer(45))
True
>>> L.taylor_series(Integer(3), Integer(3))
0.000000000000... + 0.867197036668...*z + 0.261129628199...*z^2 + O(z^3)
>>> coeffs = f.q_expansion_vector(min_exp=Integer(0), max_exp=Integer(20), fix_d=True)
>>> sum([coeffs[k]*k**(-Integer(10)) for k in range(Integer(1),len(coeffs))]).n(Integer(53))
-13.0290002560...
>>> L(Integer(10)).n(Integer(53))
-13.0290184579...

>>> # long time
>>> f = (ModularForms(n=Integer(17), k=Integer(24)).Delta()**Integer(2))
>>> L = f.lseries()
>>> L.check_functional_equation() < Integer(2)**(-Integer(50))
True
>>> L.taylor_series(Integer(12), Integer(3))
0.000683924755280... - 0.000875942285963...*z + 0.000647618966023...*z^2 + O(z^3)
>>> coeffs = f.q_expansion_vector(min_exp=Integer(0), max_exp=Integer(20), fix_d=True)
>>> sum([coeffs[k]*k**(-Integer(30)) for k in range(Integer(1),len(coeffs))]).n(Integer(53))
9.31562890589...e-10
>>> L(Integer(30)).n(Integer(53))
9.31562890589...e-10

>>> f = ModularForms(n=infinity, k=Integer(2), ep=-Integer(1)).f_i()
>>> L = f.lseries()
>>> L.check_functional_equation() < Integer(2)**(-Integer(50))
True
>>> L.taylor_series(Integer(1), Integer(3))
0.000000000000... + 5.76543616701...*z + 9.92776715593...*z^2 + O(z^3)
>>> coeffs = f.q_expansion_vector(min_exp=Integer(0), max_exp=Integer(20), fix_d=True)
>>> sum([coeffs[k] * ZZ(k)**(-Integer(10)) for k in range(Integer(1),len(coeffs))]).n(Integer(53))
-23.9781792831...
>>> L(Integer(10)).n(Integer(53))
-23.9781792831...