Skip to content

Commit 9553ddf

Browse files
CBirkbeckBeibeiX0
authored andcommitted
Add q-expansion identities for Eisenstein series. (leanprover-community#27844)
This is PR contains some q-expansion identities that are needed to give the q-expansions of Eisenstein series, which will be added as part of leanprover-community#27606.
1 parent 772eab1 commit 9553ddf

File tree

7 files changed

+257
-0
lines changed

7 files changed

+257
-0
lines changed

Mathlib.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,7 @@ import Mathlib.Analysis.Complex.ReImTopology
15921592
import Mathlib.Analysis.Complex.RealDeriv
15931593
import Mathlib.Analysis.Complex.RemovableSingularity
15941594
import Mathlib.Analysis.Complex.Schwarz
1595+
import Mathlib.Analysis.Complex.SummableUniformlyOn
15951596
import Mathlib.Analysis.Complex.TaylorSeries
15961597
import Mathlib.Analysis.Complex.Tietze
15971598
import Mathlib.Analysis.Complex.Trigonometric
@@ -4890,6 +4891,7 @@ import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
48904891
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Defs
48914892
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.IsBoundedAtImInfty
48924893
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.MDifferentiable
4894+
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.QExpansion
48934895
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Summable
48944896
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.UniformConvergence
48954897
import Mathlib.NumberTheory.ModularForms.Identities

Mathlib/Analysis/Complex/Exponential.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ theorem exp_sum {α : Type*} (s : Finset α) (f : α → ℂ) :
141141
lemma exp_nsmul (x : ℂ) (n : ℕ) : exp (n • x) = exp x ^ n :=
142142
@MonoidHom.map_pow (Multiplicative ℂ) ℂ _ _ expMonoidHom _ _
143143

144+
/-- This is a useful version of `exp_nsmul` for q-expansions of modular forms. -/
145+
lemma exp_nsmul' (x a p : ℂ) (n : ℕ) : exp (a * n * x / p) = exp (a * x / p) ^ n := by
146+
rw [← Complex.exp_nsmul]
147+
ring_nf
148+
144149
theorem exp_nat_mul (x : ℂ) : ∀ n : ℕ, exp (n * x) = exp x ^ n
145150
| 0 => by rw [Nat.cast_zero, zero_mul, exp_zero, pow_zero]
146151
| Nat.succ n => by rw [pow_succ, Nat.cast_add_one, add_mul, exp_add, ← exp_nat_mul _ n, one_mul]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/-
2+
Copyright (c) 2025 Chris Birkbeck. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Chris Birkbeck
5+
-/
6+
import Mathlib.Analysis.CStarAlgebra.Classes
7+
import Mathlib.Analysis.Complex.LocallyUniformLimit
8+
import Mathlib.Topology.Algebra.InfiniteSum.UniformOn
9+
10+
/-!
11+
# Differentiability of uniformly convergent series sums of functions
12+
13+
We collect some results about the differentiability of infinite sums.
14+
15+
-/
16+
17+
lemma SummableLocallyUniformlyOn.differentiableOn {ι E : Type*} [NormedAddCommGroup E]
18+
[NormedSpace ℂ E] [CompleteSpace E] {f : ι → ℂ → E} {s : Set ℂ}
19+
(hs : IsOpen s) (h : SummableLocallyUniformlyOn (fun n ↦ ((fun z ↦ f n z))) s)
20+
(hf2 : ∀ n r, r ∈ s → DifferentiableAt ℂ (f n) r) :
21+
DifferentiableOn ℂ (fun z ↦ ∑' n , f n z) s := by
22+
obtain ⟨g, hg⟩ := h
23+
have hc := (hasSumLocallyUniformlyOn_iff_tendstoLocallyUniformlyOn.mp hg).differentiableOn ?_ hs
24+
· apply hc.congr
25+
apply hg.tsum_eqOn
26+
· filter_upwards with t r hr using
27+
DifferentiableWithinAt.fun_sum fun a ha ↦ (hf2 a r hr).differentiableWithinAt

Mathlib/Analysis/Normed/Module/FiniteDimension.lean

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import Mathlib.Analysis.Normed.Affine.Isometry
99
import Mathlib.Analysis.Normed.Operator.NormedSpace
1010
import Mathlib.Analysis.NormedSpace.RieszLemma
1111
import Mathlib.Analysis.Normed.Module.Ball.Pointwise
12+
import Mathlib.Analysis.SpecificLimits.Normed
1213
import Mathlib.Logic.Encodable.Pi
1314
import Mathlib.Topology.Algebra.AffineSubspace
1415
import Mathlib.Topology.Algebra.Module.FiniteDimension
1516
import Mathlib.Topology.Algebra.InfiniteSum.Module
1617
import Mathlib.Topology.Instances.Matrix
1718
import Mathlib.LinearAlgebra.Dimension.LinearMap
1819

20+
1921
/-!
2022
# Finite-dimensional normed spaces over complete fields
2123
@@ -675,6 +677,29 @@ theorem summable_of_isBigO_nat' {E F : Type*} [NormedAddCommGroup E] [CompleteSp
675677
(hg : Summable g) (h : f =O[atTop] g) : Summable f :=
676678
summable_of_isBigO_nat hg.norm h.norm_right
677679

680+
681+
open Nat Asymptotics in
682+
/-- This is a version of `summable_norm_mul_geometric_of_norm_lt_one` for more general codomains. We
683+
keep the original one due to import restrictions. -/
684+
theorem summable_norm_mul_geometric_of_norm_lt_one' {F : Type*} [NormedRing F]
685+
[NormOneClass F] [NormMulClass F] {k : ℕ} {r : F} (hr : ‖r‖ < 1) {u : ℕ → F}
686+
(hu : u =O[atTop] fun n ↦ ((n ^ k : ℕ) : F)) : Summable fun n : ℕ ↦ ‖u n * r ^ n‖ := by
687+
rcases exists_between hr with ⟨r', hrr', h⟩
688+
apply summable_of_isBigO_nat (summable_geometric_of_lt_one ((norm_nonneg _).trans hrr'.le) h).norm
689+
calc
690+
fun n ↦ ‖(u n) * r ^ n‖
691+
_ =O[atTop] fun n ↦ ‖u n‖ * ‖r‖ ^ n := by
692+
apply (IsBigOWith.of_bound (c := ‖(1 : ℝ)‖) ?_).isBigO
693+
filter_upwards [eventually_norm_pow_le r] with n hn
694+
simp
695+
_ =O[atTop] fun n ↦ ‖((n : F) ^ k)‖ * ‖r‖ ^ n := by
696+
simpa [Nat.cast_pow] using
697+
(isBigO_norm_left.mpr (isBigO_norm_right.mpr hu)).mul (isBigO_refl (fun n ↦ (‖r‖ ^ n)) atTop)
698+
_ =O[atTop] fun n ↦ ‖r' ^ n‖ := by
699+
convert isBigO_norm_right.mpr (isBigO_norm_left.mpr
700+
(isLittleO_pow_const_mul_const_pow_const_pow_of_norm_lt k hrr').isBigO)
701+
simp only [norm_pow, norm_mul]
702+
678703
theorem summable_of_isEquivalent {ι E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E]
679704
[FiniteDimensional ℝ E] {f : ι → E} {g : ι → E} (hg : Summable g) (h : f ~[cofinite] g) :
680705
Summable f :=

Mathlib/NumberTheory/LSeries/RiemannZeta.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,17 @@ theorem zeta_nat_eq_tsum_of_gt_one {k : ℕ} (hk : 1 < k) :
197197
(by rwa [← ofReal_natCast, ofReal_re, ← Nat.cast_one, Nat.cast_lt] : 1 < re k),
198198
cpow_natCast]
199199

200+
lemma two_mul_riemannZeta_eq_tsum_int_inv_pow_of_even {k : ℕ} (hk : 2 ≤ k) (hk2 : Even k) :
201+
2 * riemannZeta k = ∑' (n : ℤ), ((n : ℂ) ^ k)⁻¹ := by
202+
have hkk : 1 < k := by linarith
203+
rw [tsum_int_eq_zero_add_two_mul_tsum_pnat]
204+
· have h0 : (0 ^ k : ℂ)⁻¹ = 0 := by simp; omega
205+
norm_cast
206+
simp [h0, zeta_eq_tsum_one_div_nat_add_one_cpow (s := k) (by simp [hkk]),
207+
tsum_pnat_eq_tsum_succ (f := fun n => ((n : ℂ) ^ k)⁻¹)]
208+
· simp [Even.neg_pow hk2]
209+
· exact (Summable.of_nat_of_neg (by simp [hkk]) (by simp [hkk])).of_norm
210+
200211
/-- The residue of `ζ(s)` at `s = 1` is equal to 1. -/
201212
lemma riemannZeta_residue_one : Tendsto (fun s ↦ (s - 1) * riemannZeta s) (𝓝[≠] 1) (𝓝 1) := by
202213
exact hurwitzZetaEven_residue_one 0

Mathlib/NumberTheory/ModularForms/EisensteinSeries/Defs.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ lemma gammaSet_eq_gcd_mul_divIntMap {r : ℕ} {v : Fin 2 → ℤ} (hv : v ∈ ga
120120
def gammaSetDivGcdEquiv (r : ℕ) [NeZero r] : gammaSet 1 r 0 ≃ gammaSet 1 1 0 :=
121121
Set.BijOn.equiv _ (gammaSet_div_gcd_to_gammaSet10_bijection r)
122122

123+
@[simp]
124+
lemma gammaSetDivGcdEquiv_eq (r : ℕ) [NeZero r] (v : gammaSet 1 r 0) :
125+
(gammaSetDivGcdEquiv r) v = divIntMap r v.1 := rfl
126+
123127
/-- The equivalence between `(Fin 2 → ℤ)` and `Σ n : ℕ, gammaSet 1 n 0)` . -/
124128
def gammaSetDivGcdSigmaEquiv : (Fin 2 → ℤ) ≃ (Σ r : ℕ, gammaSet 1 r 0) := by
125129
apply (Equiv.sigmaFiberEquiv finGcdMap).symm.trans
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/-
2+
Copyright (c) 2025 Chris Birkbeck. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Chris Birkbeck
5+
-/
6+
import Mathlib.Analysis.Complex.SummableUniformlyOn
7+
import Mathlib.Analysis.SpecialFunctions.Trigonometric.Cotangent
8+
9+
/-!
10+
# Einstein series q-expansions
11+
12+
We give some identities for q-expansions of Eisenstein series that will be used in describing their
13+
q-expansions.
14+
15+
-/
16+
17+
open Set Metric TopologicalSpace Function Filter Complex EisensteinSeries
18+
19+
open _root_.UpperHalfPlane hiding I
20+
21+
open scoped Topology Real Nat Complex Pointwise
22+
23+
local notation "ℍₒ" => upperHalfPlaneSet
24+
25+
private lemma iteratedDerivWithin_cexp_aux (k m : ℕ) (p : ℝ) {S : Set ℂ} (hs : IsOpen S) :
26+
EqOn (iteratedDerivWithin k (fun s : ℂ ↦ cexp (2 * π * I * m * s / p)) S)
27+
(fun s ↦ (2 * π * I * m / p) ^ k * cexp (2 * π * I * m * s / p)) S := by
28+
apply EqOn.trans (iteratedDerivWithin_of_isOpen hs)
29+
intro x hx
30+
have : (fun s ↦ cexp (2 * π * I * m * s / p)) = fun s ↦ cexp (((2 * π * I * m) / p) * s) := by
31+
ext z
32+
ring_nf
33+
simp only [this, iteratedDeriv_cexp_const_mul]
34+
ring_nf
35+
36+
private lemma aux_IsBigO_mul (k l : ℕ) (p : ℝ) {f : ℕ → ℂ}
37+
(hf : f =O[atTop] fun n ↦ ((n ^ l) : ℝ)) :
38+
(fun n ↦ f n * (2 * π * I * n / p) ^ k) =O[atTop] fun n ↦ (↑(n ^ (l + k)) : ℝ) := by
39+
have h0 : (fun n : ℕ ↦ (2 * π * I * n / p) ^ k) =O[atTop] fun n ↦ ((n ^ k) : ℝ) := by
40+
have h1 : (fun n : ℕ ↦ (2 * π * I * n / p) ^ k) =
41+
fun n : ℕ ↦ ((2 * π * I / p) ^ k) * n ^ k := by
42+
ext z
43+
ring
44+
simpa [h1] using isBigO_ofReal_right.mp (Asymptotics.isBigO_const_mul_self
45+
((2 * π * I / p) ^ k) (fun (n : ℕ) ↦ (↑(n ^ k) : ℝ)) atTop)
46+
simp only [Nat.cast_pow]
47+
convert hf.mul h0
48+
ring
49+
50+
open BoundedContinuousFunction in
51+
/-- The infinte sum of `k`-th iterated derivative of the complex exponential multiplied by a
52+
function that grows polynomially is absolutely and uniformly convergent. -/
53+
theorem summableLocallyUniformlyOn_iteratedDerivWithin_smul_cexp (k l : ℕ) {f : ℕ → ℂ} {p : ℝ}
54+
(hp : 0 < p) (hf : f =O[atTop] (fun n ↦ ((n ^ l) : ℝ))) :
55+
SummableLocallyUniformlyOn (fun n ↦ (f n) •
56+
iteratedDerivWithin k (fun z ↦ cexp (2 * π * I * z / p) ^ n) ℍₒ) ℍₒ := by
57+
apply SummableLocallyUniformlyOn_of_locally_bounded isOpen_upperHalfPlaneSet
58+
intro K hK hKc
59+
have : CompactSpace K := isCompact_univ_iff.mp (isCompact_iff_isCompact_univ.mp hKc)
60+
let c : ContinuousMap K ℂ := ⟨fun r : K ↦ Complex.exp (2 * π * I * r / p), by fun_prop⟩
61+
let r : ℝ := ‖mkOfCompact c‖
62+
have hr : ‖r‖ < 1 := by
63+
simp only [norm_norm, r, norm_lt_iff_of_compact Real.zero_lt_one, mkOfCompact_apply,
64+
ContinuousMap.coe_mk, c]
65+
intro x
66+
have h1 : cexp (2 * π * I * (x / p)) = cexp (2 * π * I * x / p) := by
67+
ring_nf
68+
simpa using h1 ▸ norm_exp_two_pi_I_lt_one ⟨((x : ℂ) / p), by aesop⟩
69+
refine ⟨_, by simpa using (summable_norm_mul_geometric_of_norm_lt_one' hr
70+
(Asymptotics.isBigO_norm_left.mpr (aux_IsBigO_mul k l p hf))), fun n z hz ↦ ?_⟩
71+
have h0 := pow_le_pow_left₀ (norm_nonneg _) (norm_coe_le_norm (mkOfCompact c) ⟨z, hz⟩) n
72+
simp only [norm_mkOfCompact, mkOfCompact_apply, ContinuousMap.coe_mk, ← exp_nsmul', Pi.smul_apply,
73+
iteratedDerivWithin_cexp_aux k n p isOpen_upperHalfPlaneSet (hK hz), smul_eq_mul,
74+
norm_mul, norm_pow, Complex.norm_div, norm_ofNat, norm_real, Real.norm_eq_abs, norm_I, mul_one,
75+
norm_natCast, abs_norm, ge_iff_le, r, c] at *
76+
rw [← mul_assoc]
77+
gcongr
78+
convert h0
79+
rw [← norm_pow, ← exp_nsmul']
80+
81+
/-- This is a version of `summableLocallyUniformlyOn_iteratedDerivWithin_smul_cexp` for level one
82+
and q-expansion coefficients all `1`. -/
83+
theorem summableLocallyUniformlyOn_iteratedDerivWithin_cexp (k : ℕ) :
84+
SummableLocallyUniformlyOn
85+
(fun n ↦ iteratedDerivWithin k (fun z ↦ cexp (2 * π * I * z) ^ n) ℍₒ) ℍₒ := by
86+
have h0 : (fun n : ℕ ↦ (1 : ℂ)) =O[atTop] fun n ↦ ((n ^ 1) : ℝ) := by
87+
simp only [Asymptotics.isBigO_iff, norm_one, norm_pow, Real.norm_natCast,
88+
eventually_atTop, ge_iff_le]
89+
exact ⟨1, 1, fun b hb ↦ by norm_cast; simp [hb]⟩
90+
simpa using summableLocallyUniformlyOn_iteratedDerivWithin_smul_cexp k 1 (p := 1)
91+
(by norm_num) h0
92+
93+
lemma differentiableAt_iteratedDerivWithin_cexp (n a : ℕ) {s : Set ℂ} (hs : IsOpen s)
94+
{r : ℂ} (hr : r ∈ s) : DifferentiableAt ℂ
95+
(iteratedDerivWithin a (fun z ↦ cexp (2 * π * I * z) ^ n) s) r := by
96+
apply DifferentiableOn.differentiableAt _ (hs.mem_nhds hr)
97+
suffices DifferentiableOn ℂ (iteratedDeriv a (fun z ↦ cexp (2 * π * I * z) ^ n)) s by
98+
apply this.congr (iteratedDerivWithin_of_isOpen hs)
99+
fun_prop
100+
101+
lemma iteratedDerivWithin_tsum_cexp_eq (k : ℕ) (z : ℍ) :
102+
iteratedDerivWithin k (fun z ↦ ∑' n : ℕ, cexp (2 * π * I * z) ^ n) ℍₒ z =
103+
∑' n : ℕ, iteratedDerivWithin k (fun s : ℂ ↦ cexp (2 * π * I * s) ^ n) ℍₒ z := by
104+
rw [iteratedDerivWithin_tsum k isOpen_upperHalfPlaneSet (by simpa using z.2)]
105+
· exact fun x hx ↦ summable_geometric_iff_norm_lt_one.mpr
106+
(UpperHalfPlane.norm_exp_two_pi_I_lt_one ⟨x, hx⟩)
107+
· exact fun n _ _ ↦ summableLocallyUniformlyOn_iteratedDerivWithin_cexp n
108+
· exact fun n l z hl hz ↦ differentiableAt_iteratedDerivWithin_cexp n l
109+
isOpen_upperHalfPlaneSet hz
110+
111+
lemma contDiffOn_tsum_cexp (k : ℕ∞) :
112+
ContDiffOn ℂ k (fun z : ℂ ↦ ∑' n : ℕ, cexp (2 * π * I * z) ^ n) ℍₒ :=
113+
contDiffOn_of_differentiableOn_deriv fun m _ z hz ↦
114+
(((summableLocallyUniformlyOn_iteratedDerivWithin_cexp m).differentiableOn
115+
isOpen_upperHalfPlaneSet (fun n _ hz ↦ differentiableAt_iteratedDerivWithin_cexp n m
116+
isOpen_upperHalfPlaneSet hz)) z hz).congr (fun z hz ↦ iteratedDerivWithin_tsum_cexp_eq m ⟨z, hz⟩)
117+
(iteratedDerivWithin_tsum_cexp_eq m ⟨z, hz⟩)
118+
119+
private lemma iteratedDerivWithin_tsum_exp_aux_eq {k : ℕ} (hk : 1 ≤ k) (z : ℍ) :
120+
iteratedDerivWithin k (fun z ↦ ((π * I) -
121+
(2 * π * I) * ∑' n : ℕ, cexp (2 * π * I * z) ^ n)) ℍₒ z =
122+
-(2 * π * I) ^ (k + 1) * ∑' n : ℕ, n ^ k * cexp (2 * π * I * z) ^ n := by
123+
have : iteratedDerivWithin k (fun z ↦ ((π * I) -
124+
(2 * π * I) * ∑' n : ℕ, cexp (2 * π * I * z) ^ n)) ℍₒ z =
125+
-(2 * π * I) * ∑' n : ℕ, iteratedDerivWithin k (fun s : ℂ ↦ cexp (2 * π * I * s) ^ n) ℍₒ z := by
126+
rw [iteratedDerivWithin_const_sub hk, iteratedDerivWithin_fun_neg,
127+
iteratedDerivWithin_const_mul (by simpa using z.2) (isOpen_upperHalfPlaneSet.uniqueDiffOn)]
128+
· simp only [iteratedDerivWithin_tsum_cexp_eq, neg_mul]
129+
· exact (contDiffOn_tsum_cexp k).contDiffWithinAt (by simpa using z.2)
130+
have h : -(2 * π * I * (2 * π * I) ^ k) * ∑' (n : ℕ), n ^ k * cexp (2 * π * I * z) ^ n =
131+
-(2 * π * I) * ∑' n : ℕ, (2 * π * I * n) ^ k * cexp (2 * π * I * z) ^ n := by
132+
simp_rw [← tsum_mul_left]
133+
congr
134+
ext y
135+
ring
136+
simp only [this, neg_mul, pow_succ', h, neg_inj, mul_eq_mul_left_iff, mul_eq_zero,
137+
OfNat.ofNat_ne_zero, ofReal_eq_zero, Real.pi_ne_zero, or_self, I_ne_zero, or_false]
138+
congr
139+
ext n
140+
have := exp_nsmul' (p := 1) (a := 2 * π * I) (n := n)
141+
simp_rw [div_one] at this
142+
simpa [this, UpperHalfPlane.coe] using
143+
iteratedDerivWithin_cexp_aux k n 1 isOpen_upperHalfPlaneSet z.2
144+
145+
/-- This is one key identity relating infinite series to q-expansions which shows that
146+
`∑' n, 1 / (z + n) ^ (k + 1) = ((-2 π I) ^ (k + 1) / k !) * ∑' n, n ^ k q ^n` where
147+
`q = cexp (2 π I z)`. -/
148+
theorem EisensteinSeries.qExpansion_identity {k : ℕ} (hk : 1 ≤ k) (z : ℍ) :
149+
∑' n : ℤ, 1 / ((z : ℂ) + n) ^ (k + 1) = ((-2 * π * I) ^ (k + 1) / k !) *
150+
∑' n : ℕ, n ^ k * cexp (2 * π * I * z) ^ n := by
151+
have : (-1) ^ k * k ! * ∑' n : ℤ, 1 / ((z : ℂ) + n) ^ (k + 1) =
152+
-(2 * π * I) ^ (k + 1) * ∑' n : ℕ, n ^ k * cexp (2 * π * I * z) ^ n := by
153+
rw [← iteratedDerivWithin_tsum_exp_aux_eq hk z,
154+
← iteratedDerivWithin_cot_pi_mul_eq_mul_tsum_div_pow hk (by simpa using z.2)]
155+
exact iteratedDerivWithin_congr (fun x hx ↦ by (simpa using pi_mul_cot_pi_q_exp ⟨x, hx⟩))
156+
(by simpa using z.2)
157+
simp_rw [(eq_inv_mul_iff_mul_eq₀ (by simp [Nat.factorial_ne_zero])).mpr this, ← tsum_mul_left]
158+
congr
159+
ext n
160+
rw [show (-2 * π * I) ^ (k + 1) = (-1) ^ (k + 1) * (2 * π * I) ^ (k + 1) by rw [← neg_pow]; ring]
161+
field_simp
162+
ring_nf
163+
simp [Nat.mul_two]
164+
165+
lemma summable_pow_mul_cexp (k : ℕ) (e : ℕ+) (z : ℍ) :
166+
Summable fun c : ℕ ↦ (c : ℂ) ^ k * cexp (2 * π * I * e * z) ^ c := by
167+
have he : 0 < (e * (z : ℂ)).im := by
168+
simpa using z.2
169+
apply ((summableLocallyUniformlyOn_iteratedDerivWithin_smul_cexp 0 k (p := 1)
170+
(f := fun n ↦ (n ^ k : ℂ)) (by norm_num)
171+
(by simp [← Complex.isBigO_ofReal_right, Asymptotics.isBigO_refl])).summable he).congr
172+
grind [ofReal_one, iteratedDerivWithin_zero, Pi.smul_apply, smul_eq_mul]
173+
174+
/-- This is a version of `EisensteinSeries.qExpansion_identity` for positive naturals,
175+
which shows that `∑' n, 1 / (z + n) ^ (k + 1) = ((-2 π I) ^ (k + 1) / k !) * ∑' n : ℕ+, n ^ k q ^n`
176+
where `q = cexp (2 π I z)`. -/
177+
theorem EisensteinSeries.qExpansion_identity_pnat {k : ℕ} (hk : 1 ≤ k) (z : ℍ) :
178+
∑' n : ℤ, 1 / ((z : ℂ) + n) ^ (k + 1) = ((-2 * π * I) ^ (k + 1) / k !) *
179+
∑' n : ℕ+, n ^ k * cexp (2 * π * I * z) ^ (n : ℕ) := by
180+
rw [EisensteinSeries.qExpansion_identity hk z, ← tsum_zero_pnat_eq_tsum_nat]
181+
· simp [show k ≠ 0 by grind]
182+
· apply (summable_pow_mul_cexp k 1 z).congr
183+
simp

0 commit comments

Comments
 (0)