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 \(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 integerprec
– integer (bits precision)max_imaginary_part
– real numbermax_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
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 parameternormalization
; the default normalization is the one for which the linear coefficient is 1.INPUT:
k
– an even positive integerprec
– (default: 10) a nonnegative integerK
– (default: \(\QQ\)) a ringvar
– (default:'q'
) variable name to use for \(q\)-expansionnormalization
– (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)