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.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 on \(\SL_2(\ZZ)\).

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

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.

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 = 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 = eisenstein_series_lseries(Integer(20))
>>> L(Integer(2))
-5.02355351645998

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
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)

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)

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)