forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathE2.lean
More file actions
173 lines (148 loc) · 7.42 KB
/
E2.lean
File metadata and controls
173 lines (148 loc) · 7.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/-
Copyright (c) 2025 Chris Birkbeck. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
-/
import Mathlib.Algebra.Order.Ring.Star
import Mathlib.Analysis.CStarAlgebra.Classes
import Mathlib.Data.Int.Star
import Mathlib.NumberTheory.LSeries.RiemannZeta
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.UniformConvergence
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.QExpansion
/-!
# Eisenstein Series E2
We define the Eisenstein series `E2` of weight `2` and level `1` as a limit of partial sums
over non-symmetric intervals.
-/
open ModularForm EisensteinSeries TopologicalSpace intervalIntegral
Metric Filter Function Complex MatrixGroups Finset ArithmeticFunction
open _root_.UpperHalfPlane hiding I
open scoped Interval Real Topology BigOperators Nat
noncomputable section
/-- This is an auxilary summand used to define the Eisenstein serires `G2`. -/
def e2Summand (m : ℤ) (z : ℍ) : ℂ := ∑' (n : ℤ), eisSummand 2 ![m, n] z
lemma e2Summand_summable (m : ℤ) (z : ℍ) : Summable (fun n => eisSummand 2 ![m, n] z) := by
apply (linear_right_summable z m (k := 2) (by omega)).congr
simp [eisSummand]
@[simp]
lemma e2Summand_zero_eq_riemannZeta_two (z : ℍ) : e2Summand 0 z = 2 * riemannZeta 2 := by
simpa [e2Summand, eisSummand] using
(two_riemannZeta_eq_tsum_int_inv_even_pow (k := 2) (by omega) (by simp)).symm
/-- The Eisenstein series of weight `2` and level `1` defined as the limit as `N` tends to
infinity of the partial sum of `m` in `[N,N)` of `e2Summand m`. This sum over symmetric
intervals is handy in showing it is Cauchy. -/
def G2 : ℍ → ℂ := fun z => limUnder atTop (fun N : ℕ => ∑ m ∈ Icc (-N : ℤ) N, e2Summand m z)
/-- The normalised Eisenstein series of weight `2` and level `1`. -/
def E2 : ℍ → ℂ := (1 / (2 * riemannZeta 2)) • G2
/-- This function measures the defect in `E2` being a modular form. -/
def D2 (γ : SL(2, ℤ)) : ℍ → ℂ := fun z => (2 * π * I * γ 1 0) / (denom γ z)
--moves these two elsewhere
lemma Icc_succ_succ (n : ℕ) : Finset.Icc (-(n + 1) : ℤ) (n + 1) = Finset.Icc (-n : ℤ) n ∪
{(-(n + 1) : ℤ), (n + 1 : ℤ)} := by
refine Finset.ext_iff.mpr ?_
intro a
simp only [neg_add_rev, Int.reduceNeg, Finset.mem_Icc, add_neg_le_iff_le_add, Finset.union_insert,
Finset.mem_insert, Finset.mem_union, Finset.mem_singleton]
omega
lemma sum_Icc_of_even_eq_range {α : Type*} [CommRing α] (f : ℤ → α) (hf : ∀ n, f n = f (-n))
(N : ℕ) : ∑ m ∈ Finset.Icc (-N : ℤ) N, f m = 2 * ∑ m ∈ Finset.range (N + 1), f m - f 0 := by
induction' N with N ih
· simp [two_mul]
· have := Icc_succ_succ N
simp only [neg_add_rev, Int.reduceNeg, Nat.cast_add, Nat.cast_one] at *
rw [this, Finset.sum_union (by simp), Finset.sum_pair (by omega), ih]
nth_rw 2 [Finset.sum_range_succ]
have HF := hf (N + 1)
simp only [neg_add_rev, Int.reduceNeg] at HF
rw [← HF]
ring_nf
norm_cast
lemma G2_partial_sum_eq (z : ℍ) (N : ℕ) : (∑ m ∈ Icc (-N : ℤ) N, e2Summand m z) =
(2 * riemannZeta 2) + (∑ m ∈ Finset.range N, 2 * (-2 * ↑π * I) ^ 2 *
∑' n : ℕ+, n * cexp (2 * ↑π * I * (m + 1) * z) ^ (n : ℕ)) := by
rw [sum_Icc_of_even_eq_range, Finset.sum_range_succ', mul_add]
· nth_rw 2 [two_mul]
ring_nf
have (a : ℕ):= EisensteinSeries.qExpansion_identity_pnat (k := 1) (by omega) ⟨(a + 1) * z, by
have ha : 0 < a + (1 : ℝ) := by linarith
simpa [ha] using z.2⟩
simp only [coe_mk_subtype, add_comm, Nat.reduceAdd, one_div, mul_comm, mul_neg, even_two,
Even.neg_pow, Nat.factorial_one, Nat.cast_one, div_one, pow_one, e2Summand, eisSummand,
Nat.cast_add, Fin.isValue, Matrix.cons_val_zero, Int.cast_add, Int.cast_natCast, Int.cast_one,
Matrix.cons_val_one, Matrix.cons_val_fin_one, Int.reduceNeg, zpow_neg, mul_sum, Int.cast_zero,
zero_mul, add_zero, I_sq, neg_mul, one_mul] at *
congr
· simpa using (two_riemannZeta_eq_tsum_int_inv_even_pow (k := 2) (by omega) (by simp)).symm
· ext a
norm_cast at *
simp_rw [this a, ← tsum_mul_left, ← tsum_neg,ofReal_mul, ofReal_ofNat, mul_pow, I_sq, neg_mul,
one_mul, Nat.cast_add, Nat.cast_one, mul_neg, ofReal_pow]
apply tsum_congr
intro b
ring_nf
· intro n
simp only [e2Summand, eisSummand, Fin.isValue, Matrix.cons_val_zero, Matrix.cons_val_one,
Matrix.cons_val_fin_one, Int.reduceNeg, zpow_neg, Int.cast_neg, neg_mul]
nth_rw 2 [← tsum_int_eq_tsum_neg]
apply tsum_congr
intro b
norm_cast
ring_nf
aesop
private lemma aux_tsum_identity (z : ℍ) : ∑' m : ℕ, (2 * (-2 * ↑π * I) ^ 2 *
∑' n : ℕ+, n * cexp (2 * ↑π * I * (m + 1) * z) ^ (n : ℕ)) =
-8 * π ^ 2 * ∑' (n : ℕ+), (sigma 1 n) * cexp (2 * π * I * z) ^ (n : ℕ) := by
have := tsum_prod_pow_cexp_eq_tsum_sigma 1 z
rw [tsum_pnat_eq_tsum_succ (fun d =>
∑' (c : ℕ+), (c ^ 1 : ℂ) * cexp (2 * ↑π * I * d * z) ^ (c : ℕ))] at this
simp only [neg_mul, even_two, Even.neg_pow, ← tsum_mul_left, ← this, Nat.cast_add, Nat.cast_one]
apply tsum_congr2
intro b c
rw [mul_pow, I_sq, mul_neg, mul_one]
ring
theorem G2_tendsto (z : ℍ) : Tendsto (fun N ↦ ∑ x ∈ range N, 2 * (2 * ↑π * I) ^ 2 *
∑' (n : ℕ+), n * cexp (2 * ↑π * I * (↑x + 1) * ↑z) ^ (n : ℕ)) atTop
(𝓝 (-8 * ↑π ^ 2 * ∑' (n : ℕ+), ↑((σ 1) ↑n) * cexp (2 * ↑π * I * ↑z) ^ (n : ℕ))) := by
rw [← aux_tsum_identity]
have hf : Summable fun m : ℕ => ( 2 * (-2 * ↑π * I) ^ 2 *
∑' n : ℕ+, n ^ ((2 - 1)) * Complex.exp (2 * ↑π * I * (m + 1) * z) ^ (n : ℕ)) := by
apply Summable.mul_left
have := (summable_prod_aux 1 z).prod_symm.prod
have h0 := pnat_summable_iff_summable_succ
(f := fun b ↦ ∑' (c : ℕ+), c * cexp (2 * ↑π * I * ↑↑b * ↑z) ^ (c : ℕ))
simp at *
rw [← h0]
apply this
simpa using (hf.hasSum).comp tendsto_finset_range
lemma G2_cauchy (z : ℍ) : CauchySeq (fun N : ℕ => ∑ m ∈ Icc (-N : ℤ) N, e2Summand m z) := by
conv =>
enter [1]
ext n
rw [G2_partial_sum_eq]
apply CauchySeq.const_add
apply Filter.Tendsto.cauchySeq (x := -8 * π ^ 2 *
∑' (n : ℕ+), (σ 1 n) * cexp (2 * π * I * z) ^ (n : ℕ))
simpa using G2_tendsto z
lemma G2_q_exp (z : ℍ) : G2 z = (2 * riemannZeta 2) - 8 * π ^ 2 *
∑' n : ℕ+, sigma 1 n * cexp (2 * π * I * z) ^ (n : ℕ) := by
rw [G2, Filter.Tendsto.limUnder_eq, sub_eq_add_neg]
conv =>
enter [1]
ext N
rw [G2_partial_sum_eq z N]
exact Filter.Tendsto.add (by simp) (by simpa using G2_tendsto z)
/- lemma Asymptotics.IsBigO.map {α β ι γ : Type*} [Norm α] [Norm β] {f : ι → α} {g : ι → β}
{p : Filter ι} (hf : f =O[p] g) (c : γ → ι) :
(fun (n : γ) => f (c n)) =O[p.comap c] fun n => g (c n) := by
rw [isBigO_iff] at *
obtain ⟨C, hC⟩ := hf
refine ⟨C, ?_⟩
simp only [eventually_comap] at *
filter_upwards [hC] with n hn
exact fun a ha ↦ Eq.mpr (id (congrArg (fun _a ↦ ‖f _a‖ ≤ C * ‖g _a‖) ha)) hn
lemma Asymptotics.IsBigO.nat_of_int {α β : Type*} [Norm α] [SeminormedAddCommGroup β] {f : ℤ → α}
{g : ℤ → β} (hf : f =O[cofinite] g) : (fun (n : ℕ) => f n) =O[cofinite] fun n => g n := by
have := Asymptotics.IsBigO.map hf Nat.cast
simp only [Int.cofinite_eq, isBigO_sup, comap_sup, Asymptotics.isBigO_sup] at *
rw [Nat.cofinite_eq_atTop]
simpa using this.2 -/