Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Eisenstein series uniform convergence #10377

Closed
wants to merge 143 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
143 commits
Select commit Hold shift + click to select a range
1114eea
wip save
CBirkbeck Feb 6, 2024
e9440a2
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/Finset_Deco…
CBirkbeck Feb 6, 2024
e229b84
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/Finset_Deco…
CBirkbeck Feb 6, 2024
3a0fc10
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
b74fe5c
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
bcf756c
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
b241e15
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
a456d5b
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
eed710a
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
6b00e1f
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
0655fb3
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
b2a5942
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck Feb 6, 2024
80e3230
some linting
CBirkbeck Feb 6, 2024
0b42af4
missed one
CBirkbeck Feb 6, 2024
8b3ca2e
missed one
CBirkbeck Feb 6, 2024
3b6159b
more lint
CBirkbeck Feb 6, 2024
0fc98a5
more lint
CBirkbeck Feb 6, 2024
79fe9ac
save
CBirkbeck Feb 9, 2024
a68247d
add file names
CBirkbeck Feb 9, 2024
99469cb
shake fix
CBirkbeck Feb 9, 2024
89c9ee8
save
CBirkbeck Feb 9, 2024
8e0f4a8
sections
CBirkbeck Feb 9, 2024
3e94fcb
simplifications, but golfing still needed
CBirkbeck Feb 10, 2024
6012f67
save
CBirkbeck Feb 10, 2024
d63d918
save2
CBirkbeck Feb 10, 2024
bc282a0
lint fix
CBirkbeck Feb 10, 2024
49d5d22
golf
CBirkbeck Feb 10, 2024
edf1752
save
CBirkbeck Feb 10, 2024
38ca47f
more golf
CBirkbeck Feb 12, 2024
b402c36
build fix
CBirkbeck Feb 12, 2024
a3c4d21
fix imports
CBirkbeck Feb 12, 2024
90b37fe
more cleanup
CBirkbeck Feb 12, 2024
83ee7dc
rename file
YaelDillies Feb 13, 2024
9ba96ec
rev fixes wip
CBirkbeck Feb 13, 2024
01f2d44
Merge branch 'eisensteinSeries_Uniform_convergence' of https://github…
CBirkbeck Feb 13, 2024
c4bfb5b
Box theory
YaelDillies Feb 13, 2024
224f82e
feat: Boxes in locally finite ordered rings
YaelDillies Feb 13, 2024
1c0a1e8
moved some lemmas around, while waiting for boxes to be PRd
CBirkbeck Feb 13, 2024
e534563
Merge branch 'eisensteinSeries_Uniform_convergence' of https://github…
CBirkbeck Feb 13, 2024
de4faf1
fix updates
CBirkbeck Feb 13, 2024
0788f1b
fix simp
CBirkbeck Feb 13, 2024
5d9708c
fix simp nf
YaelDillies Feb 13, 2024
cc886d8
fix doc string
CBirkbeck Feb 13, 2024
57154ca
save before trying to generalise the bound
CBirkbeck Feb 13, 2024
627b254
fix
CBirkbeck Feb 13, 2024
f6d0b12
fix
CBirkbeck Feb 13, 2024
682f525
remove junk lemma
CBirkbeck Feb 13, 2024
d2182d3
fix merge issue
CBirkbeck Feb 13, 2024
e653c32
fix merge issue
CBirkbeck Feb 13, 2024
f82014d
shake fix?
CBirkbeck Feb 14, 2024
034f09d
fix import
CBirkbeck Feb 14, 2024
c638374
shake ignore?
CBirkbeck Feb 14, 2024
12d7fdf
save
CBirkbeck Feb 14, 2024
a4ca86a
Merge remote-tracking branch 'origin/master' into finset_box
YaelDillies Feb 16, 2024
bbb7c23
Merge remote-tracking branch 'origin/finset_box' into eisensteinSerie…
CBirkbeck Feb 16, 2024
c99c5a9
fix merge update
CBirkbeck Feb 16, 2024
4b566d2
remove junk lemma
CBirkbeck Feb 16, 2024
23246b3
golf
CBirkbeck Feb 16, 2024
c4bf406
update bound to real powers
CBirkbeck Feb 16, 2024
27421d7
style fix
CBirkbeck Feb 16, 2024
22374fc
remove unused lemma
CBirkbeck Feb 16, 2024
08452b5
Merge remote-tracking branch 'origin/master' into eisensteinSeries_Un…
YaelDillies Feb 20, 2024
ebcf5be
cleanup
YaelDillies Feb 20, 2024
80fce6b
Merge remote-tracking branch 'origin/master' into eisensteinSeries_Un…
CBirkbeck Feb 23, 2024
4c85191
small golf
CBirkbeck Feb 23, 2024
b8ccdad
lint fix and re-squeeze some simps
CBirkbeck Feb 23, 2024
87297e8
2
CBirkbeck Feb 23, 2024
2ed727d
fix last thm
CBirkbeck Feb 23, 2024
9e4428b
fix last thm name
CBirkbeck Feb 23, 2024
33f9ee3
lint fix
CBirkbeck Feb 23, 2024
b887845
generalise fun_ne_zero_cases
CBirkbeck Feb 23, 2024
42b6b8a
add a complex version of main thm
CBirkbeck Feb 27, 2024
96e63cc
fix name
CBirkbeck Feb 27, 2024
dcd880a
rev updates
CBirkbeck Mar 1, 2024
3a09ccc
make arg implicit
CBirkbeck Mar 1, 2024
623b79f
lint fix
CBirkbeck Mar 1, 2024
1ad2e31
some golf
CBirkbeck Mar 6, 2024
8f1d15e
more golf
CBirkbeck Mar 6, 2024
bc25990
more cleanup
CBirkbeck Mar 6, 2024
b5b30b6
move files around
CBirkbeck Mar 6, 2024
eaa2ca5
fix
CBirkbeck Mar 6, 2024
15a5ff6
rev fixes wip
CBirkbeck Mar 8, 2024
9a7b913
this can probs be golfed more, but I'm stoopid
CBirkbeck Mar 8, 2024
3600a74
composing non_zero function with inj fun is non_zero
CBirkbeck Mar 8, 2024
07ec99b
use inj func pr
CBirkbeck Mar 8, 2024
2b6b90d
clean a bit
CBirkbeck Mar 8, 2024
c36b011
merge
CBirkbeck Mar 8, 2024
b4cd118
merge fix
CBirkbeck Mar 18, 2024
4e2ac14
fix
CBirkbeck Mar 25, 2024
db21b89
merge fix
CBirkbeck Apr 15, 2024
083ea46
Merge branch 'eisensteinSeries_Uniform_convergence' of https://github…
CBirkbeck Apr 15, 2024
a0e1e79
Update Mathlib.lean
CBirkbeck Apr 15, 2024
77bafcb
fix
CBirkbeck Apr 15, 2024
e981f3d
rev fixes
CBirkbeck Apr 15, 2024
ab3cec4
Merge branch 'eisensteinSeries_Uniform_convergence' of https://github…
CBirkbeck Apr 15, 2024
f6f8b08
missed one
CBirkbeck Apr 15, 2024
123dd62
merge fix/update
CBirkbeck Apr 26, 2024
405b34d
Merge remote-tracking branch 'origin/master' into eisensteinSeries_Un…
CBirkbeck Apr 26, 2024
dc0a5b1
fix
CBirkbeck Apr 26, 2024
fdeeff6
feat(Complex/UpperHalfPlane): add vertical strips needed for mod form…
CBirkbeck Apr 26, 2024
a243ce6
doc string
CBirkbeck Apr 26, 2024
f18cfea
move strips into topology
CBirkbeck Apr 26, 2024
61b0056
summable lems move test
CBirkbeck Apr 26, 2024
e5e78c0
test2
CBirkbeck Apr 26, 2024
a8380ae
do todo from port
CBirkbeck Apr 26, 2024
95f199f
build fix
CBirkbeck Apr 26, 2024
0472942
fix
CBirkbeck Apr 26, 2024
a5f0f87
Merge branch 'CB_summable_partion_lemmas' of https://github.com/leanp…
CBirkbeck Apr 26, 2024
b8b7b44
merge fix
CBirkbeck Apr 26, 2024
8fbe573
Merge remote-tracking branch 'origin/upper_half_plane_stip_lemmas' in…
CBirkbeck Apr 26, 2024
ac145a1
merge fix
CBirkbeck Apr 26, 2024
01a9357
more fixes
CBirkbeck Apr 26, 2024
3a77b2f
fix docstring
CBirkbeck Apr 26, 2024
10365c4
build fixes
CBirkbeck Apr 26, 2024
105e5d5
fix import
CBirkbeck Apr 26, 2024
8891f5a
remove junk complex.abs
CBirkbeck Apr 30, 2024
9c1c1d2
fix
CBirkbeck Apr 30, 2024
e6b0cdf
updates
CBirkbeck May 1, 2024
9bdf78f
Merge remote-tracking branch 'origin/master' into eisensteinSeries_Un…
CBirkbeck May 1, 2024
1e48883
fix2
CBirkbeck May 1, 2024
aeb0b43
fix lintr
CBirkbeck May 2, 2024
1c05238
updates
CBirkbeck May 2, 2024
8f0e3bc
Merge remote-tracking branch 'origin/master' into eisensteinSeries_Un…
CBirkbeck May 2, 2024
1325630
fix merge
CBirkbeck May 7, 2024
7606655
lintr fix
CBirkbeck May 7, 2024
5852fe8
space
CBirkbeck May 10, 2024
7fb014d
rev changes wip
CBirkbeck May 10, 2024
6823211
small golf
CBirkbeck May 12, 2024
26d9524
more speedups
CBirkbeck May 13, 2024
5b3cfb8
more speedups 2
CBirkbeck May 13, 2024
6c6ddf3
lintr fix
CBirkbeck May 13, 2024
5201ffb
replace rpow_bound
CBirkbeck May 14, 2024
fec3908
some style fixes, wip
CBirkbeck May 14, 2024
bbab1d5
more golf
CBirkbeck May 14, 2024
036b016
Merge branch 'eisensteinSeries_Uniform_convergence' of github.com:lea…
loefflerd May 14, 2024
f748460
refactor using norm, etc
loefflerd May 14, 2024
2bb8c9b
fix truncated docstring
loefflerd May 14, 2024
2cc8984
move lemma
loefflerd May 14, 2024
81c1c0c
prune `open` statements
loefflerd May 14, 2024
80b223b
rename norm_def to norm_eq_max_natAbs
CBirkbeck May 15, 2024
346bbd0
rename norm_def to norm_eq_max_natAbs
CBirkbeck May 15, 2024
1bb0494
Update Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConv…
CBirkbeck May 15, 2024
911192d
add David as Author
CBirkbeck May 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -3058,6 +3058,7 @@ import Mathlib.NumberTheory.Modular
import Mathlib.NumberTheory.ModularForms.Basic
import Mathlib.NumberTheory.ModularForms.CongruenceSubgroups
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.UniformConvergence
import Mathlib.NumberTheory.ModularForms.JacobiTheta.Bounds
import Mathlib.NumberTheory.ModularForms.JacobiTheta.Manifold
CBirkbeck marked this conversation as resolved.
Show resolved Hide resolved
import Mathlib.NumberTheory.ModularForms.JacobiTheta.OneVariable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
/-
Copyright (c) 2024 Chris Birkbeck. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck, David Loeffler
-/

import Mathlib.Analysis.Complex.UpperHalfPlane.Topology
import Mathlib.Analysis.NormedSpace.FunctionSeries
import Mathlib.Analysis.PSeries
import Mathlib.Order.Interval.Finset.Box
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic

/-!
# Uniform convergence of Eisenstein series

We show that the sum of `eisSummand` converges locally uniformly on `ℍ` to the Eisenstein series
of weight `k` and level `Γ(N)` with congruence condition `a : Fin 2 → ZMod N`.

## Outline of argument

The key lemma `r_mul_max_le` shows that, for `z ∈ ℍ` and `c, d ∈ ℤ` (not both zero),
`|c z + d|` is bounded below by `r z * max (|c|, |d|)`, where `r z` is an explicit function of `z`
(independent of `c, d`) satisfying `0 < r z < 1` for all `z`.

We then show in `summable_one_div_rpow_max` that the sum of `max (|c|, |d|) ^ (-k)` over
`(c, d) ∈ ℤ × ℤ` is convergent for `2 < k`. This is proved by decomposing `ℤ × ℤ` using the
`Finset.box` lemmas.
-/

noncomputable section

open Complex UpperHalfPlane Set Finset

open scoped BigOperators

variable (z : ℍ)

namespace EisensteinSeries

lemma norm_eq_max_natAbs (x : Fin 2 → ℤ) : ‖x‖ = max (x 0).natAbs (x 1).natAbs := by
rw [← coe_nnnorm, ← NNReal.coe_natCast, NNReal.coe_inj, Nat.cast_max]
refine eq_of_forall_ge_iff fun c ↦ ?_
simp only [pi_nnnorm_le_iff, Fin.forall_fin_two, max_le_iff, NNReal.natCast_natAbs]

section bounding_functions

/-- Auxiliary function used for bounding Eisenstein series, defined as
`z.im ^ 2 / (z.re ^ 2 + z.im ^ 2)`. -/
def r1 : ℝ := z.im ^ 2 / (z.re ^ 2 + z.im ^ 2)

lemma r1_eq : r1 z = 1 / ((z.re / z.im) ^ 2 + 1) := by
rw [div_pow, div_add_one (by positivity), one_div_div, r1]

lemma r1_pos : 0 < r1 z := by
dsimp only [r1]
positivity

/-- For `c, d ∈ ℝ` with `1 ≤ d ^ 2`, we have `r1 z ≤ |c * z + d| ^ 2`. -/
lemma r1_aux_bound (c : ℝ) {d : ℝ} (hd : 1 ≤ d ^ 2) :
r1 z ≤ (c * z.re + d) ^ 2 + (c * z.im) ^ 2 := by
have H1 : (c * z.re + d) ^ 2 + (c * z.im) ^ 2 =
c ^ 2 * (z.re ^ 2 + z.im ^ 2) + d * 2 * c * z.re + d ^ 2 := by ring
have H2 : (c ^ 2 * (z.re ^ 2 + z.im ^ 2) + d * 2 * c * z.re + d ^ 2) * (z.re ^ 2 + z.im ^ 2)
- z.im ^ 2 = (c * (z.re ^ 2 + z.im ^ 2) + d * z.re) ^ 2 + (d ^ 2 - 1) * z.im ^ 2 := by ring
rw [r1, H1, div_le_iff (by positivity), ← sub_nonneg, H2]
exact add_nonneg (sq_nonneg _) (mul_nonneg (sub_nonneg.mpr hd) (sq_nonneg _))

/-- This function is used to give an upper bound on the summands in Eisenstein series; it is
defined by `z ↦ min z.im √(z.im ^ 2 / (z.re ^ 2 + z.im ^ 2))`. -/
def r : ℝ := min z.im √(r1 z)

lemma r_pos : 0 < r z := by
simp only [r, lt_min_iff, im_pos, Real.sqrt_pos, r1_pos, and_self]

lemma r_lower_bound_on_verticalStrip {A B : ℝ} (h : 0 < B) (hz : z ∈ verticalStrip A B) :
r ⟨⟨A, B⟩, h⟩ ≤ r z := by
apply min_le_min hz.2
rw [Real.sqrt_le_sqrt_iff (by apply (r1_pos z).le)]
simp only [r1_eq, div_pow, one_div]
rw [inv_le_inv (by positivity) (by positivity), add_le_add_iff_right]
apply div_le_div (sq_nonneg _) _ (by positivity) (pow_le_pow_left h.le hz.2 2)
simpa only [even_two.pow_abs] using pow_le_pow_left (abs_nonneg _) hz.1 2

lemma auxbound1 {c : ℝ} (d : ℝ) (hc : 1 ≤ c ^ 2) : r z ≤ Complex.abs (c * z + d) := by
rcases z with ⟨z, hz⟩
have H1 : z.im ≤ √((c * z.re + d) ^ 2 + (c * z).im ^ 2) := by
rw [Real.le_sqrt' hz, im_ofReal_mul, mul_pow]
exact (le_mul_of_one_le_left (sq_nonneg _) hc).trans <| le_add_of_nonneg_left (sq_nonneg _)
simpa only [r, abs_apply, normSq_apply, add_re, re_ofReal_mul, coe_re, ← pow_two, add_im, mul_im,
coe_im, ofReal_im, zero_mul, add_zero, min_le_iff] using Or.inl H1

lemma auxbound2 (c : ℝ) {d : ℝ} (hd : 1 ≤ d ^ 2) : r z ≤ Complex.abs (c * z + d) := by
have H1 : √(r1 z) ≤ √((c * z.re + d) ^ 2 + (c * z.im) ^ 2) :=
(Real.sqrt_le_sqrt_iff (by positivity)).mpr (r1_aux_bound _ _ hd)
simpa only [r, abs_apply, normSq_apply, add_re, re_ofReal_mul, coe_re, ofReal_re, ← pow_two,
add_im, im_ofReal_mul, coe_im, ofReal_im, add_zero, min_le_iff] using Or.inr H1

lemma div_max_sq_ge_one (x : Fin 2 → ℤ) (hx : x ≠ 0) :
1 ≤ (x 0 / ‖x‖) ^ 2 ∨ 1 ≤ (x 1 / ‖x‖) ^ 2 := by
refine (max_choice (x 0).natAbs (x 1).natAbs).imp (fun H0 ↦ ?_) (fun H1 ↦ ?_)
· have : x 0 ≠ 0 := by
rwa [← norm_ne_zero_iff, norm_eq_max_natAbs, H0, Nat.cast_ne_zero, Int.natAbs_ne_zero] at hx
simp only [norm_eq_max_natAbs, H0, Int.cast_natAbs, Int.cast_abs, div_pow, _root_.sq_abs, ne_eq,
OfNat.ofNat_ne_zero, not_false_eq_true, pow_eq_zero_iff, Int.cast_eq_zero, this, div_self,
le_refl]
· have : x 1 ≠ 0 := by
rwa [← norm_ne_zero_iff, norm_eq_max_natAbs, H1, Nat.cast_ne_zero, Int.natAbs_ne_zero] at hx
simp only [norm_eq_max_natAbs, H1, Int.cast_natAbs, Int.cast_abs, div_pow, _root_.sq_abs, ne_eq,
OfNat.ofNat_ne_zero, not_false_eq_true, pow_eq_zero_iff, Int.cast_eq_zero, this, div_self,
le_refl]

lemma r_mul_max_le {x : Fin 2 → ℤ} (hx : x ≠ 0) : r z * ‖x‖ ≤ Complex.abs (x 0 * z + x 1) := by
have hn0 : ‖x‖ ≠ 0 := by rwa [norm_ne_zero_iff]
have h11 : x 0 * (z : ℂ) + x 1 = (x 0 / ‖x‖ * z + x 1 / ‖x‖) * ‖x‖ := by
rw [div_mul_eq_mul_div, ← add_div, div_mul_cancel₀ _ (mod_cast hn0)]
rw [norm_eq_max_natAbs, h11, map_mul, Complex.abs_ofReal, abs_norm, norm_eq_max_natAbs]
gcongr
· rcases div_max_sq_ge_one x hx with H1 | H2
· simpa only [norm_eq_max_natAbs, ofReal_div, ofReal_intCast] using auxbound1 z (x 1 / ‖x‖) H1
· simpa only [norm_eq_max_natAbs, ofReal_div, ofReal_intCast] using auxbound2 z (x 0 / ‖x‖) H2

/-- Upper bound for the summand `|c * z + d| ^ (-k)`, as a product of a function of `z` and a
function of `c, d`. -/
lemma summand_bound {k : ℝ} (hk : 0 ≤ k) (x : Fin 2 → ℤ) :
Complex.abs (x 0 * z + x 1) ^ (-k) ≤ (r z) ^ (-k) * ‖x‖ ^ (-k) := by
by_cases hx : x = 0
· simp only [hx, Pi.zero_apply, Int.cast_zero, zero_mul, add_zero, ← norm_eq_abs, norm_zero]
by_cases h : -k = 0
· rw [h, Real.rpow_zero, Real.rpow_zero, one_mul]
· rw [Real.zero_rpow h, mul_zero]
· rw [← Real.mul_rpow (r_pos _).le (norm_nonneg _)]
exact Real.rpow_le_rpow_of_nonpos (mul_pos (r_pos _) (norm_pos_iff.mpr hx)) (r_mul_max_le z hx)
(neg_nonpos.mpr hk)

variable {z} in
lemma summand_bound_of_mem_verticalStrip {k : ℝ} (hk : 0 ≤ k) (x : Fin 2 → ℤ)
{A B : ℝ} (hB : 0 < B) (hz : z ∈ verticalStrip A B) :
Complex.abs (x 0 * z + x 1) ^ (-k) ≤ r ⟨⟨A, B⟩, hB⟩ ^ (-k) * ‖x‖ ^ (-k) := by
refine (summand_bound z hk x).trans (mul_le_mul_of_nonneg_right ?_ (by positivity))
exact Real.rpow_le_rpow_of_nonpos (r_pos _) (r_lower_bound_on_verticalStrip z hB hz)
(neg_nonpos.mpr hk)

end bounding_functions

section summability
CBirkbeck marked this conversation as resolved.
Show resolved Hide resolved

/-- The function `ℤ ^ 2 → ℝ` given by `x ↦ ‖x‖ ^ (-k)` is summable if `2 < k`. We prove this by
splitting into boxes using `Finset.box`. -/
lemma summable_one_div_norm_rpow {k : ℝ} (hk : 2 < k) :
Summable fun (x : Fin 2 → ℤ) ↦ ‖x‖ ^ (-k) := by
rw [← (finTwoArrowEquiv _).symm.summable_iff, summable_partition _ Int.existsUnique_mem_box]
· simp only [finTwoArrowEquiv_symm_apply, Function.comp_def]
refine ⟨fun n ↦ (hasSum_fintype (β := box (α := ℤ × ℤ) n) _).summable, ?_⟩
suffices Summable fun n : ℕ ↦ ∑' (_ : box (α := ℤ × ℤ) n), (n : ℝ) ^ (-k) by
refine this.congr fun n ↦ tsum_congr fun p ↦ ?_
simp only [← Int.mem_box.mp p.2, Nat.cast_max, norm_eq_max_natAbs, Matrix.cons_val_zero,
Matrix.cons_val_one, Matrix.head_cons]
simp only [tsum_fintype, univ_eq_attach, sum_const, card_attach, nsmul_eq_mul]
apply ((Real.summable_nat_rpow.mpr (by linarith : 1 - k < -1)).mul_left
8).of_norm_bounded_eventually_nat
filter_upwards [Filter.eventually_gt_atTop 0] with n hn
rw [Int.card_box hn.ne', Real.norm_of_nonneg (by positivity), sub_eq_add_neg,
Real.rpow_add (Nat.cast_pos.mpr hn), Real.rpow_one, Nat.cast_mul, Nat.cast_ofNat, mul_assoc]
· exact fun n ↦ Real.rpow_nonneg (norm_nonneg _) _

/-- The sum defining the Eisenstein series (of weight `k` and level `Γ(N)` with congruence
condition `a : Fin 2 → ZMod N`) converges locally uniformly on `ℍ`. -/
theorem eisensteinSeries_tendstoLocallyUniformly {k : ℤ} (hk : 3 ≤ k) {N : ℕ} (a : Fin 2 → ZMod N) :
TendstoLocallyUniformly (fun (s : Finset (gammaSet N a)) ↦ (∑ x in s, eisSummand k x ·))
(eisensteinSeries a k ·) Filter.atTop := by
have hk' : (2 : ℝ) < k := by norm_cast
have p_sum : Summable fun x : gammaSet N a ↦ ‖x.val‖ ^ (-k) :=
mod_cast (summable_one_div_norm_rpow hk').subtype (gammaSet N a)
simp only [tendstoLocallyUniformly_iff_forall_isCompact, eisensteinSeries]
intro K hK
obtain ⟨A, B, hB, HABK⟩ := subset_verticalStrip_of_isCompact hK
refine (tendstoUniformlyOn_tsum (hu := p_sum.mul_left <| r ⟨⟨A, B⟩, hB⟩ ^ (-k : ℝ))
(fun p z hz ↦ ?_)).mono HABK
simpa only [eisSummand, one_div, ← zpow_neg, norm_eq_abs, abs_zpow, ← Real.rpow_intCast,
Int.cast_neg] using summand_bound_of_mem_verticalStrip (by positivity) p hB hz

/-- Extend a function on `ℍ` arbitrarily to a function on all of `ℂ`. -/
local notation "↑ₕ" f => f ∘ (PartialHomeomorph.symm (openEmbedding_coe.toPartialHomeomorph _))

/-- Variant of `eisensteinSeries_tendstoLocallyUniformly` formulated with maps `ℂ → ℂ`, which is
nice to have for holomorphicity later. -/
lemma eisensteinSeries_tendstoLocallyUniformlyOn {k : ℤ} {N : ℕ} (hk : 3 ≤ k)
(a : Fin 2 → ZMod N) : TendstoLocallyUniformlyOn (fun (s : Finset (gammaSet N a )) ↦
↑ₕ(fun (z : ℍ) ↦ ∑ x in s, eisSummand k x z )) (↑ₕ(eisensteinSeries_SIF a k).toFun)
CBirkbeck marked this conversation as resolved.
Show resolved Hide resolved
Filter.atTop (UpperHalfPlane.coe '' ⊤) := by
apply TendstoLocallyUniformlyOn.comp (s := ⊤) _ _ _ (PartialHomeomorph.continuousOn_symm _)
· simp only [SlashInvariantForm.toFun_eq_coe, Set.top_eq_univ, tendstoLocallyUniformlyOn_univ]
apply eisensteinSeries_tendstoLocallyUniformly hk
· simp only [OpenEmbedding.toPartialHomeomorph_target, Set.top_eq_univ, mapsTo_range_iff,
Set.mem_univ, forall_const]

end summability
5 changes: 5 additions & 0 deletions Mathlib/Topology/UniformSpace/UniformConvergence.lean
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,11 @@ theorem tendstoLocallyUniformlyOn_iff_forall_isCompact [LocallyCompactSpace α]
(tendstoLocallyUniformlyOn_TFAE F f p hs).out 0 1
#align tendsto_locally_uniformly_on_iff_forall_is_compact tendstoLocallyUniformlyOn_iff_forall_isCompact

lemma tendstoLocallyUniformly_iff_forall_isCompact [LocallyCompactSpace α] :
TendstoLocallyUniformly F f p ↔ ∀ K : Set α, IsCompact K → TendstoUniformlyOn F f p K := by
simp only [← tendstoLocallyUniformlyOn_univ,
tendstoLocallyUniformlyOn_iff_forall_isCompact isOpen_univ, Set.subset_univ, forall_true_left]

theorem tendstoLocallyUniformlyOn_iff_filter :
TendstoLocallyUniformlyOn F f p s ↔ ∀ x ∈ s, TendstoUniformlyOnFilter F f p (𝓝[s] x) := by
simp only [TendstoUniformlyOnFilter, eventually_prod_iff]
Expand Down
Loading