Skip to content

Commit aebf9bc

Browse files
committed
Eisenstein q exp identity (#27606)
We prove that Eisenstein series have a q-expansion of the form `1 - (2k / bernoulli k) ∑' n, σ_{k-1}(n) q^n`
1 parent aa53d9b commit aebf9bc

File tree

1 file changed

+116
-6
lines changed

1 file changed

+116
-6
lines changed

Mathlib/NumberTheory/ModularForms/EisensteinSeries/QExpansion.lean

Lines changed: 116 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,37 @@ Authors: Chris Birkbeck
55
-/
66
import Mathlib.Analysis.Complex.SummableUniformlyOn
77
import Mathlib.Analysis.SpecialFunctions.Trigonometric.Cotangent
8+
import Mathlib.NumberTheory.LSeries.Dirichlet
9+
import Mathlib.NumberTheory.LSeries.HurwitzZetaValues
10+
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
11+
import Mathlib.NumberTheory.TsumDivsorsAntidiagonal
812

913
/-!
10-
# Einstein series q-expansions
14+
# Eisenstein series q-expansions
1115
12-
We give some identities for q-expansions of Eisenstein series that will be used in describing their
13-
q-expansions.
16+
We give the q-expansion of Eisenstein series of weight `k` and level 1. In particular, we prove
17+
`EisensteinSeries.q_expansion_bernoulli` which says that for even `k` with `3 ≤ k`
18+
Eisenstein series can we written as `1 - (2k / bernoulli k) ∑' n, σ_{k-1}(n) q^n` where
19+
`q = exp(2πiz)` and `σ_{k-1}(n)` is the sum of the `(k-1)`-th powers of the divisors of `n`.
20+
We need `k` to be even so that the Eisenstein series are non-zero and we require `k ≥ 3` so that
21+
the series converges absolutely.
22+
23+
The proof relies on the identity
24+
`∑' n : ℤ, 1 / (z + n) ^ (k + 1) = ((-2πi)^(k+1) / k!) ∑' n : ℕ, n^k q^n` which comes from
25+
differentiating the expansion of `π cot(πz)` in terms of exponentials. Since our Eisenstein series
26+
are defined as sums over coprime integer pairs, we also need to relate these to sums over all pairs
27+
of integers, which is done in `tsum_eisSummand_eq_riemannZeta_mul_eisensteinSeries`. This then
28+
gives the q-expansion with a Riemann zeta factor, which we simplify using the formula for
29+
`ζ(k)` in terms of Bernoulli numbers to get the final result.
1430
1531
-/
1632

17-
open Set Metric TopologicalSpace Function Filter Complex EisensteinSeries
33+
open Set Metric TopologicalSpace Function Filter Complex ArithmeticFunction
34+
ModularForm EisensteinSeries
1835

19-
open _root_.UpperHalfPlane hiding I
36+
open scoped Topology Real Nat Complex Pointwise ArithmeticFunction.sigma
2037

21-
open scoped Topology Real Nat Complex Pointwise
38+
open _root_.UpperHalfPlane hiding I
2239

2340
local notation "ℍₒ" => upperHalfPlaneSet
2441

@@ -181,3 +198,96 @@ theorem EisensteinSeries.qExpansion_identity_pnat {k : ℕ} (hk : 1 ≤ k) (z :
181198
· simp [show k ≠ 0 by grind]
182199
· apply (summable_pow_mul_cexp k 1 z).congr
183200
simp
201+
202+
lemma summable_eisSummand {k : ℕ} (hk : 3 ≤ k) (z : ℍ) :
203+
Summable (eisSummand k · z) :=
204+
summable_norm_iff.mp <| summable_norm_eisSummand (Int.toNat_le.mp hk) z
205+
206+
lemma summable_prod_eisSummand {k : ℕ} (hk : 3 ≤ k) (z : ℍ) :
207+
Summable fun x : ℤ × ℤ ↦ eisSummand k ![x.1, x.2] z := by
208+
refine (finTwoArrowEquiv ℤ).summable_iff.mp <| (summable_eisSummand hk z).congr (fun v ↦ ?_)
209+
simp [show ![v 0, v 1] = v from List.ofFn_inj.mp rfl]
210+
211+
lemma tsum_eisSummand_eq_tsum_sigma_mul_cexp_pow {k : ℕ} (hk : 3 ≤ k) (hk2 : Even k) (z : ℍ) :
212+
∑' v, eisSummand k v z = 2 * riemannZeta k + 2 * ((-2 * π * I) ^ k / (k - 1)!) *
213+
∑' (n : ℕ+), σ (k - 1) n * cexp (2 * π * I * z) ^ (n : ℕ) := by
214+
rw [← (finTwoArrowEquiv ℤ).symm.tsum_eq, finTwoArrowEquiv_symm_apply,
215+
Summable.tsum_prod (summable_prod_eisSummand hk z),
216+
tsum_int_eq_zero_add_two_mul_tsum_pnat (fun n ↦ ?h₁)
217+
(by simpa using (summable_prod_eisSummand hk z).prod)]
218+
case h₁ =>
219+
nth_rewrite 1 [← tsum_comp_neg]
220+
exact tsum_congr fun y ↦ by simp [eisSummand, ← neg_add _ (y : ℂ), -neg_add_rev, hk2.neg_pow]
221+
have H (b : ℕ+) := qExpansion_identity_pnat (k := k - 1) (by grind) ⟨b * z, by simpa using z.2
222+
simp_rw [show k - 1 + 1 = k by grind, one_div] at H
223+
simp only [coe_mk_subtype, neg_mul] at H
224+
rw [nsmul_eq_mul, mul_assoc]
225+
congr
226+
· simp [eisSummand, two_mul_riemannZeta_eq_tsum_int_inv_pow_of_even (by grind) hk2]
227+
· suffices ∑' (m : ℕ+) (n : ℕ+), (n : ℕ) ^ (k - 1) * cexp (2 * π * I * (m * z)) ^ (n : ℕ) =
228+
∑' (m : ℕ+) (n : ℕ+), (n : ℕ) ^ (k - 1) * cexp (2 * π * I * z) ^ (m * n : ℕ) by
229+
simp [eisSummand, H, tsum_mul_left,
230+
← tsum_prod_pow_eq_tsum_sigma (k - 1) (norm_exp_two_pi_I_lt_one z), this]
231+
simp_rw [← Complex.exp_nat_mul]
232+
exact tsum_congr₂ (fun m n ↦ by push_cast; ring_nf)
233+
234+
lemma eisSummand_of_gammaSet_eq_divIntMap (k : ℤ) (z : ℍ) {n : ℕ} (v : gammaSet 1 n 0) :
235+
eisSummand k v z = ((n : ℂ) ^ k)⁻¹ * eisSummand k (divIntMap n v) z := by
236+
simp_rw [eisSummand]
237+
nth_rw 1 2 [gammaSet_eq_gcd_mul_divIntMap v.2]
238+
simp [← mul_inv, ← mul_zpow, mul_add, mul_assoc]
239+
240+
lemma tsum_eisSummand_eq_riemannZeta_mul_eisensteinSeries {k : ℕ} (hk : 3 ≤ k) (z : ℍ) :
241+
∑' v : Fin 2 → ℤ, eisSummand k v z = riemannZeta k * eisensteinSeries (N := 1) 0 k z := by
242+
have hk1 : 1 < k := by grind
243+
have hk2 : 3 ≤ (k : ℤ) := mod_cast hk
244+
simp_rw [← gammaSetDivGcdSigmaEquiv.symm.tsum_eq, gammaSetDivGcdSigmaEquiv_symm_eq]
245+
rw [eisensteinSeries, Summable.tsum_sigma ?hsumm, zeta_nat_eq_tsum_of_gt_one hk1,
246+
tsum_mul_tsum_of_summable_norm (by simp [hk1]) ((summable_norm_eisSummand hk2 z).subtype _)]
247+
case hsumm =>
248+
exact gammaSetDivGcdSigmaEquiv.symm.summable_iff.mpr (summable_norm_eisSummand hk2 z).of_norm
249+
|>.congr <| by simp
250+
simp_rw [one_div]
251+
rw [Summable.tsum_prod' ?h₁ fun b ↦ ?h₂]
252+
case h₁ =>
253+
exact summable_mul_of_summable_norm (f := fun (n : ℕ) ↦ ((n : ℂ) ^ k)⁻¹)
254+
(g := fun (v : gammaSet 1 1 0) ↦ eisSummand k v z) (by simp [hk1])
255+
((summable_norm_eisSummand hk2 z).subtype _)
256+
case h₂ =>
257+
simpa using ((summable_norm_eisSummand hk2 z).subtype _).of_norm.mul_left (a := ((b : ℂ) ^ k)⁻¹)
258+
refine tsum_congr fun b ↦ ?_
259+
rcases eq_or_ne b 0 with rfl | hb
260+
· simp [show ((0 : ℂ) ^ k)⁻¹ = 0 by aesop, eisSummand_of_gammaSet_eq_divIntMap]
261+
· have : NeZero b := ⟨hb⟩
262+
simpa [eisSummand_of_gammaSet_eq_divIntMap k z, tsum_mul_left, hb]
263+
using (gammaSetDivGcdEquiv b).tsum_eq (eisSummand k · z)
264+
265+
/-- The q-Expansion of normalised Eisenstein series of level one with `riemannZeta` term. -/
266+
lemma EisensteinSeries.q_expansion_riemannZeta {k : ℕ} (hk : 3 ≤ k) (hk2 : Even k) (z : ℍ) :
267+
E hk z = 1 + (riemannZeta k)⁻¹ * (-2 * π * I) ^ k / (k - 1)! *
268+
∑' n : ℕ+, σ (k - 1) n * cexp (2 * π * I * z) ^ (n : ℤ) := by
269+
have : eisensteinSeries_MF (Int.toNat_le.mp hk) 0 z = eisensteinSeries_SIF (N := 1) 0 k z := rfl
270+
rw [E, ModularForm.IsGLPos.smul_apply, this, eisensteinSeries_SIF_apply 0 k z, eisensteinSeries]
271+
have HE1 := tsum_eisSummand_eq_tsum_sigma_mul_cexp_pow hk hk2 z
272+
have HE2 := tsum_eisSummand_eq_riemannZeta_mul_eisensteinSeries hk z
273+
have z2 : riemannZeta k ≠ 0 := riemannZeta_ne_zero_of_one_lt_re <| by norm_cast; grind
274+
simp [eisSummand, eisensteinSeries, ← inv_mul_eq_iff_eq_mul₀ z2] at HE1 HE2 ⊢
275+
grind
276+
277+
private lemma eisensteinSeries_coeff_identity {k : ℕ} (hk2 : Even k) (hkn0 : k ≠ 0) :
278+
(riemannZeta k)⁻¹ * (-2 * π * I) ^ k / (k - 1)! = -(2 * k / bernoulli k) := by
279+
have h2 : k = 2 * (k / 2 - 1 + 1) := by grind
280+
set m := k / 2 - 1
281+
rw [h2, Nat.cast_mul 2 (m + 1), Nat.cast_two, riemannZeta_two_mul_nat (show m + 10 by grind),
282+
show (2 * (m + 1))! = 2 * (m + 1) * (2 * m + 1)! by grind [Nat.factorial_succ],
283+
show 2 * (m + 1) - 1 = 2 * m + 1 by grind, mul_pow, mul_pow, pow_mul I, I_sq]
284+
norm_cast
285+
simp [field]
286+
grind
287+
288+
/-- The q-Expansion of normalised Eisenstein series of level one with `bernoulli` term. -/
289+
lemma EisensteinSeries.q_expansion_bernoulli {k : ℕ} (hk : 3 ≤ k) (hk2 : Even k) (z : ℍ) :
290+
E hk z = 1 - (2 * k / bernoulli k) *
291+
∑' n : ℕ+, σ (k - 1) n * cexp (2 * π * I * z) ^ (n : ℤ) := by
292+
convert q_expansion_riemannZeta hk hk2 z using 1
293+
rw [eisensteinSeries_coeff_identity hk2 (by grind), neg_mul, ← sub_eq_add_neg]

0 commit comments

Comments
 (0)