Eisenstein series

sage.modular.modform.eis_series.compute_eisenstein_params(character, k)[source]

Compute and return a list of all parameters \((\chi,\psi,t)\) that define the Eisenstein series with given character and weight \(k\).

Only the parity of \(k\) is relevant (unless k = 1, which is a slightly different case).

If character is an integer \(N\), then the parameters for \(\Gamma_1(N)\) are computed instead. Then the condition is that \(\chi(-1)*\psi(-1) =(-1)^k\).

If character is a list of integers, the parameters for \(\Gamma_H(N)\) are computed, where \(H\) is the subgroup of \((\ZZ/N\ZZ)^\times\) generated by the integers in the given list.

EXAMPLES:

sage: sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 3)
[]

sage: pars =  sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 4)
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
[((1, 1), (1, 1), 1),
((1, 1), (1, 1), 2),
((1, 1), (1, 1), 3),
((1, 1), (1, 1), 5),
((1, 1), (1, 1), 6),
((1, 1), (1, 1), 10),
((1, 1), (1, 1), 15),
((1, 1), (1, 1), 30)]

sage: pars = sage.modular.modform.eis_series.compute_eisenstein_params(15, 1)
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
[((1, 1), (-1, 1), 1),
((1, 1), (-1, 1), 5),
((1, 1), (1, zeta4), 1),
((1, 1), (1, zeta4), 3),
((1, 1), (-1, -1), 1),
((1, 1), (1, -zeta4), 1),
((1, 1), (1, -zeta4), 3),
((-1, 1), (1, -1), 1)]

sage: sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(15).0, 1)
[(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 1),
(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 5)]

sage: len(sage.modular.modform.eis_series.compute_eisenstein_params(GammaH(15, [4]), 3))
8
>>> from sage.all import *
>>> sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(Integer(30))(Integer(1)), Integer(3))
[]

>>> pars =  sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(Integer(30))(Integer(1)), Integer(4))
>>> [(x[Integer(0)].values_on_gens(), x[Integer(1)].values_on_gens(), x[Integer(2)]) for x in pars]
[((1, 1), (1, 1), 1),
((1, 1), (1, 1), 2),
((1, 1), (1, 1), 3),
((1, 1), (1, 1), 5),
((1, 1), (1, 1), 6),
((1, 1), (1, 1), 10),
((1, 1), (1, 1), 15),
((1, 1), (1, 1), 30)]

>>> pars = sage.modular.modform.eis_series.compute_eisenstein_params(Integer(15), Integer(1))
>>> [(x[Integer(0)].values_on_gens(), x[Integer(1)].values_on_gens(), x[Integer(2)]) for x in pars]
[((1, 1), (-1, 1), 1),
((1, 1), (-1, 1), 5),
((1, 1), (1, zeta4), 1),
((1, 1), (1, zeta4), 3),
((1, 1), (-1, -1), 1),
((1, 1), (1, -zeta4), 1),
((1, 1), (1, -zeta4), 3),
((-1, 1), (1, -1), 1)]

>>> sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(Integer(15)).gen(0), Integer(1))
[(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 1),
(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 5)]

>>> len(sage.modular.modform.eis_series.compute_eisenstein_params(GammaH(Integer(15), [Integer(4)]), Integer(3)))
8
sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 3)
pars =  sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 4)
[(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
pars = sage.modular.modform.eis_series.compute_eisenstein_params(15, 1)
[(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(15).0, 1)
len(sage.modular.modform.eis_series.compute_eisenstein_params(GammaH(15, [4]), 3))
sage.modular.modform.eis_series.eisenstein_series_lseries(weight, prec=53, max_imaginary_part=0, max_asymp_coeffs=40)[source]

Return the \(L\)-series of the weight \(2k\) Eisenstein series \(E_{2k}\) on \(\SL_2(\ZZ)\).

This actually returns an interface to Tim Dokchitser’s program for computing with the \(L\)-series of the Eisenstein series. See Dokchitser.

INPUT:

  • weight – even integer

  • prec – integer (bits precision)

  • max_imaginary_part – real number

  • max_asymp_coeffs – integer

OUTPUT: the \(L\)-series of the Eisenstein series. This can be evaluated at argument \(s\), or have derivative() called, etc.

EXAMPLES:

We compute with the \(L\)-series of \(E_{16}\) and then \(E_{20}\):

sage: L = eisenstein_series_lseries(16)
sage: L(1)
-0.291657724743874
sage: L.derivative(1)
0.0756072194360656
sage: L = eisenstein_series_lseries(20)
sage: L(2)
-5.02355351645998
>>> from sage.all import *
>>> L = eisenstein_series_lseries(Integer(16))
>>> L(Integer(1))
-0.291657724743874
>>> L.derivative(Integer(1))
0.0756072194360656
>>> L = eisenstein_series_lseries(Integer(20))
>>> L(Integer(2))
-5.02355351645998
L = eisenstein_series_lseries(16)
L(1)
L.derivative(1)
L = eisenstein_series_lseries(20)
L(2)

Now with higher precision:

sage: L = eisenstein_series_lseries(20, prec=200)
sage: L(2)
-5.0235535164599797471968418348135050804419155747868718371029
>>> from sage.all import *
>>> L = eisenstein_series_lseries(Integer(20), prec=Integer(200))
>>> L(Integer(2))
-5.0235535164599797471968418348135050804419155747868718371029
L = eisenstein_series_lseries(20, prec=200)
L(2)
sage.modular.modform.eis_series.eisenstein_series_qexp(k, prec=10, K=Rational Field, var='q', normalization='linear')[source]

Return the \(q\)-expansion of the normalized weight \(k\) Eisenstein series on \(\SL_2(\ZZ)\) to precision prec in the ring \(K\). Three normalizations are available, depending on the parameter normalization; the default normalization is the one for which the linear coefficient is 1.

INPUT:

  • k – an even positive integer

  • prec – (default: 10) a nonnegative integer

  • K – (default: \(\QQ\)) a ring

  • var – (default: 'q') variable name to use for \(q\)-expansion

  • normalization – (default: 'linear') normalization to use. If this is 'linear', then the series will be normalized so that the linear term is 1. If it is 'constant', the series will be normalized to have constant term 1. If it is 'integral', then the series will be normalized to have integer coefficients and no common factor, and linear term that is positive. Note that 'integral' will work over arbitrary base rings, while 'linear' or 'constant' will fail if the denominator (resp. numerator) of \(B_k / 2k\) is invertible.

ALGORITHM:

We know \(E_k = \text{constant} + \sum_n \sigma_{k-1}(n) q^n\). So we compute all the \(\sigma_{k-1}(n)\) simultaneously, using the fact that \(\sigma\) is multiplicative.

EXAMPLES:

sage: eisenstein_series_qexp(2,5)
-1/24 + q + 3*q^2 + 4*q^3 + 7*q^4 + O(q^5)
sage: eisenstein_series_qexp(2,0)
O(q^0)
sage: eisenstein_series_qexp(2,5,GF(7))
2 + q + 3*q^2 + 4*q^3 + O(q^5)
sage: eisenstein_series_qexp(2,5,GF(7),var='T')
2 + T + 3*T^2 + 4*T^3 + O(T^5)
>>> from sage.all import *
>>> eisenstein_series_qexp(Integer(2),Integer(5))
-1/24 + q + 3*q^2 + 4*q^3 + 7*q^4 + O(q^5)
>>> eisenstein_series_qexp(Integer(2),Integer(0))
O(q^0)
>>> eisenstein_series_qexp(Integer(2),Integer(5),GF(Integer(7)))
2 + q + 3*q^2 + 4*q^3 + O(q^5)
>>> eisenstein_series_qexp(Integer(2),Integer(5),GF(Integer(7)),var='T')
2 + T + 3*T^2 + 4*T^3 + O(T^5)
eisenstein_series_qexp(2,5)
eisenstein_series_qexp(2,0)
eisenstein_series_qexp(2,5,GF(7))
eisenstein_series_qexp(2,5,GF(7),var='T')

We illustrate the use of the normalization parameter:

sage: eisenstein_series_qexp(12, 5, normalization='integral')
691 + 65520*q + 134250480*q^2 + 11606736960*q^3 + 274945048560*q^4 + O(q^5)
sage: eisenstein_series_qexp(12, 5, normalization='constant')
1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
sage: eisenstein_series_qexp(12, 5, normalization='linear')
691/65520 + q + 2049*q^2 + 177148*q^3 + 4196353*q^4 + O(q^5)
sage: eisenstein_series_qexp(12, 50, K=GF(13), normalization='constant')
1 + O(q^50)
>>> from sage.all import *
>>> eisenstein_series_qexp(Integer(12), Integer(5), normalization='integral')
691 + 65520*q + 134250480*q^2 + 11606736960*q^3 + 274945048560*q^4 + O(q^5)
>>> eisenstein_series_qexp(Integer(12), Integer(5), normalization='constant')
1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
>>> eisenstein_series_qexp(Integer(12), Integer(5), normalization='linear')
691/65520 + q + 2049*q^2 + 177148*q^3 + 4196353*q^4 + O(q^5)
>>> eisenstein_series_qexp(Integer(12), Integer(50), K=GF(Integer(13)), normalization='constant')
1 + O(q^50)
eisenstein_series_qexp(12, 5, normalization='integral')
eisenstein_series_qexp(12, 5, normalization='constant')
eisenstein_series_qexp(12, 5, normalization='linear')
eisenstein_series_qexp(12, 50, K=GF(13), normalization='constant')

AUTHORS:

  • William Stein: original implementation

  • Craig Citro (2007-06-01): rewrote for massive speedup

  • Martin Raum (2009-08-02): port to cython for speedup

  • David Loeffler (2010-04-07): work around an integer overflow when \(k\) is large

  • David Loeffler (2012-03-15): add options for alternative normalizations (motivated by Issue #12043)