Skip to content

Commit c3ce181

Browse files
committed
feat(NumberTheory/ModularForms): the Dedekind Eta function (#28400)
We define the Dedekind eta function in preparation for later relating it to Eisenstein series and the modular form Delta.
1 parent 407c5f7 commit c3ce181

File tree

9 files changed

+174
-8
lines changed

9 files changed

+174
-8
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4743,6 +4743,7 @@ import Mathlib.NumberTheory.MaricaSchoenheim
47434743
import Mathlib.NumberTheory.Modular
47444744
import Mathlib.NumberTheory.ModularForms.Basic
47454745
import Mathlib.NumberTheory.ModularForms.CongruenceSubgroups
4746+
import Mathlib.NumberTheory.ModularForms.DedekindEta
47464747
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
47474748
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Defs
47484749
import Mathlib.NumberTheory.ModularForms.EisensteinSeries.IsBoundedAtImInfty

Mathlib/Analysis/Complex/Periodic.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ theorem norm_qParam_lt_iff (hh : 0 < h) (A : ℝ) (z : ℂ) :
7272
rw [norm_qParam, Real.exp_lt_exp, div_lt_div_iff_of_pos_right hh, mul_lt_mul_left_of_neg]
7373
simpa using Real.pi_pos
7474

75+
lemma qParam_ne_zero (z : ℂ) : 𝕢 h z ≠ 0 := by
76+
simp [qParam, exp_ne_zero]
77+
78+
@[fun_prop]
79+
lemma differentiable_qParam : Differentiable ℂ (𝕢 h) := by
80+
unfold qParam
81+
fun_prop
82+
83+
@[fun_prop]
84+
lemma contDiff_qParam (m : WithTop ℕ∞) : ContDiff ℂ m (𝕢 h) := by
85+
unfold qParam
86+
fun_prop
87+
7588
@[deprecated (since := "2025-02-17")] alias abs_qParam_lt_iff := norm_qParam_lt_iff
7689

7790
theorem qParam_tendsto (hh : 0 < h) : Tendsto (qParam h) I∞ (𝓝[≠] 0) := by

Mathlib/Analysis/Complex/UpperHalfPlane/Basic.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,16 @@ theorem vadd_im : (x +ᵥ z).im = z.im :=
204204

205205
end RealAddAction
206206

207+
section upperHalfPlaneSet
208+
209+
/-- The upper half plane as a subset of `ℂ`. This is convenient for taking derivatives of functions
210+
on the upper half plane. -/
211+
abbrev upperHalfPlaneSet := {z : ℂ | 0 < z.im}
212+
213+
local notation "ℍₒ" => upperHalfPlaneSet
214+
215+
lemma isOpen_upperHalfPlaneSet : IsOpen ℍₒ := isOpen_lt continuous_const Complex.continuous_im
216+
217+
end upperHalfPlaneSet
218+
207219
end UpperHalfPlane

Mathlib/Analysis/Complex/UpperHalfPlane/Manifold.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ lemma mdifferentiable_iff {f : ℍ → ℂ} :
7070
MDifferentiable 𝓘(ℂ) 𝓘(ℂ) f ↔ DifferentiableOn ℂ (f ∘ ofComplex) {z | 0 < z.im} :=
7171
fun h z hz ↦ (mdifferentiableAt_iff.mp (h ⟨z, hz⟩)).differentiableWithinAt,
7272
fun h ⟨z, hz⟩ ↦ mdifferentiableAt_iff.mpr <| (h z hz).differentiableAt
73-
<| (Complex.continuous_im.isOpen_preimage _ isOpen_Ioi).mem_nhds hz⟩
73+
<| isOpen_upperHalfPlaneSet.mem_nhds hz⟩
7474

7575
lemma contMDiff_num (g : GL (Fin 2) ℝ) : ContMDiff 𝓘(ℂ) 𝓘(ℂ) n (fun τ : ℍ ↦ num g τ) :=
7676
(contMDiff_const.smul contMDiff_coe).add contMDiff_const

Mathlib/Analysis/Complex/UpperHalfPlane/Topology.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ instance : TopologicalSpace ℍ :=
2828
instTopologicalSpaceSubtype
2929

3030
theorem isOpenEmbedding_coe : IsOpenEmbedding ((↑) : ℍ → ℂ) :=
31-
IsOpen.isOpenEmbedding_subtypeVal <| isOpen_lt continuous_const Complex.continuous_im
31+
IsOpen.isOpenEmbedding_subtypeVal <| isOpen_upperHalfPlaneSet
3232

3333
theorem isEmbedding_coe : IsEmbedding ((↑) : ℍ → ℂ) :=
3434
IsEmbedding.subtypeVal
@@ -168,7 +168,7 @@ lemma comp_ofComplex_of_im_le_zero (f : ℍ → ℂ) (z z' : ℂ) (hz : z.im ≤
168168

169169
lemma eventuallyEq_coe_comp_ofComplex {z : ℂ} (hz : 0 < z.im) :
170170
UpperHalfPlane.coe ∘ ofComplex =ᶠ[𝓝 z] id := by
171-
filter_upwards [(Complex.continuous_im.isOpen_preimage _ isOpen_Ioi).mem_nhds hz] with x hx
171+
filter_upwards [isOpen_upperHalfPlaneSet.mem_nhds hz] with x hx
172172
simp only [Function.comp_apply, ofComplex_apply_of_im_pos hx, id_eq, coe_mk_subtype]
173173

174174
end ofComplex

Mathlib/Analysis/SpecialFunctions/Log/Summable.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,22 @@ lemma multipliable_one_add_of_summable [CompleteSpace R]
173173
· intro x hx y hy
174174
exact (dist_triangle_right _ _ (∏ i ∈ s, (1 + f i))).trans_lt (add_halves ε ▸ add_lt_add hx hy)
175175

176+
lemma Summable.summable_log_norm_one_add (hu : Summable fun n ↦ ‖f n‖) :
177+
Summable fun i ↦ Real.log ‖1 + f i‖ := by
178+
suffices Summable (‖1 + f ·‖ - 1) from
179+
(Real.summable_log_one_add_of_summable this).congr (by simp)
180+
refine .of_norm (hu.of_nonneg_of_le (fun i ↦ by positivity) fun i ↦ ?_)
181+
simp only [Real.norm_eq_abs, abs_le]
182+
constructor
183+
· simpa using norm_add_le (1 + f i) (-f i)
184+
· simpa [add_comm] using norm_add_le (f i) 1
185+
186+
lemma tprod_one_add_ne_zero_of_summable [CompleteSpace R] [NormMulClass R]
187+
(hf : ∀ i, 1 + f i ≠ 0)
188+
(hu : Summable (‖f ·‖)) : ∏' i : ι, (1 + f i) ≠ 0 := by
189+
rw [← norm_ne_zero_iff, Multipliable.norm_tprod]
190+
· rw [← Real.rexp_tsum_eq_tprod (fun i ↦ norm_pos_iff.mpr <| hf i) hu.summable_log_norm_one_add]
191+
apply Real.exp_ne_zero
192+
· exact multipliable_one_add_of_summable hu
193+
176194
end NormedRing

Mathlib/NumberTheory/ModularForms/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private lemma MDifferentiable.slashJ {f : ℍ → ℂ} (hf : MDifferentiable
8080
simp [ofComplex_apply_of_im_pos hz]
8181
refine .congr (fun z hz ↦ DifferentiableAt.differentiableWithinAt ?_) this
8282
have : 0 < (-conj z).im := by simpa using hz
83-
have := hf.differentiableAt ((Complex.continuous_im.isOpen_preimage _ isOpen_Ioi).mem_nhds this)
83+
have := hf.differentiableAt (isOpen_upperHalfPlaneSet.mem_nhds this)
8484
simpa using (this.comp _ differentiable_neg.differentiableAt).star_star.neg
8585

8686
/-- The weight `k` slash action of `GL(2, ℝ)` preserves holomorphic functions. -/
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/-
2+
Copyright (c) 2024 Chris Birkbeck. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Chris Birkbeck, David Loeffler
5+
-/
6+
7+
import Mathlib.Analysis.Complex.LocallyUniformLimit
8+
import Mathlib.Analysis.Complex.UpperHalfPlane.Exp
9+
import Mathlib.Analysis.NormedSpace.MultipliableUniformlyOn
10+
11+
/-!
12+
# Dedekind eta function
13+
14+
## Main definitions
15+
16+
* We define the Dedekind eta function as the infinite product
17+
`η(z) = q ^ 1/24 * ∏' (1 - q ^ (n + 1))` where `q = e ^ (2πiz)` and `z` is in the upper half-plane.
18+
The product is taken over all non-negative integers `n`. We then show it is non-vanishing and
19+
differentiable on the upper half-plane.
20+
21+
## References
22+
* [F. Diamond and J. Shurman, *A First Course in Modular Forms*][diamondshurman2005], section 1.2
23+
-/
24+
25+
open TopologicalSpace Set MeasureTheory intervalIntegral
26+
Metric Filter Function Complex
27+
28+
open UpperHalfPlane hiding I
29+
30+
open scoped Interval Real NNReal ENNReal Topology BigOperators Nat
31+
32+
local notation "𝕢" => Periodic.qParam
33+
34+
local notation "ℍₒ" => upperHalfPlaneSet
35+
36+
namespace ModularForm
37+
38+
/-- The q term inside the product defining the eta function. It is defined as
39+
`eta_q n z = e ^ (2 π i (n + 1) z)`. -/
40+
noncomputable abbrev eta_q (n : ℕ) (z : ℂ) := (𝕢 1 z) ^ (n + 1)
41+
42+
lemma eta_q_eq_cexp (n : ℕ) (z : ℂ) : eta_q n z = cexp (2 * π * I * (n + 1) * z) := by
43+
simp [eta_q, Periodic.qParam, ← Complex.exp_nsmul]
44+
ring_nf
45+
46+
lemma eta_q_eq_pow (n : ℕ) (z : ℂ) : eta_q n z = cexp (2 * π * I * z) ^ (n + 1) := by
47+
simp [eta_q, Periodic.qParam]
48+
49+
lemma one_sub_eta_q_ne_zero (n : ℕ) {z : ℂ} (hz : z ∈ ℍₒ) : 1 - eta_q n z ≠ 0 := by
50+
rw [eta_q_eq_cexp, sub_ne_zero]
51+
intro h
52+
simpa [← mul_assoc, ← h] using norm_exp_two_pi_I_lt_one ⟨(n + 1) • z, by
53+
simpa [(show 0 < (n + 1 : ℝ) by positivity)] using hz⟩
54+
55+
/-- The eta function, whose value at z is `q^ 1 / 24 * ∏' 1 - q ^ (n + 1)` for `q = e ^ 2 π i z`. -/
56+
noncomputable def eta (z : ℂ) := 𝕢 24 z * ∏' n, (1 - eta_q n z)
57+
58+
local notation "η" => eta
59+
60+
theorem summable_eta_q (z : ℍ) : Summable fun n ↦ ‖-eta_q n z‖ := by
61+
simp [eta_q, eta_q_eq_pow, summable_nat_add_iff 1, norm_exp_two_pi_I_lt_one z]
62+
63+
lemma multipliableLocallyUniformlyOn_eta :
64+
MultipliableLocallyUniformlyOn (fun n a ↦ 1 - eta_q n a) ℍₒ:= by
65+
use fun z ↦ ∏' n, (1 - eta_q n z)
66+
simp_rw [sub_eq_add_neg]
67+
apply hasProdLocallyUniformlyOn_of_forall_compact isOpen_upperHalfPlaneSet
68+
intro K hK hcK
69+
by_cases hN : K.Nonempty
70+
· have hc : ContinuousOn (fun x ↦ ‖cexp (2 * π * I * x)‖) K := by fun_prop
71+
obtain ⟨z, hz, hB, HB⟩ := hcK.exists_sSup_image_eq_and_ge hN hc
72+
apply (summable_eta_q ⟨z, hK hz⟩).hasProdUniformlyOn_nat_one_add hcK
73+
· filter_upwards with n x hx
74+
simpa [eta_q, eta_q_eq_pow] using pow_le_pow_left₀ (by simp [norm_nonneg]) (HB x hx) _
75+
· simp_rw [eta_q, Periodic.qParam]
76+
fun_prop
77+
· rw [hasProdUniformlyOn_iff_tendstoUniformlyOn]
78+
simpa [not_nonempty_iff_eq_empty.mp hN] using tendstoUniformlyOn_empty
79+
80+
/-- Eta is non-vanishing on the upper half plane. -/
81+
lemma eta_ne_zero {z : ℂ} (hz : z ∈ ℍₒ) : η z ≠ 0 := by
82+
apply mul_ne_zero (Periodic.qParam_ne_zero z)
83+
refine tprod_one_add_ne_zero_of_summable (f := fun n ↦ -eta_q n z) ?_ ?_
84+
· exact fun i ↦ by simpa using one_sub_eta_q_ne_zero i hz
85+
· simpa [eta_q, ← summable_norm_iff] using summable_eta_q ⟨z, hz⟩
86+
87+
lemma logDeriv_one_sub_cexp (r : ℂ) : logDeriv (fun z ↦ 1 - r * cexp z) =
88+
fun z ↦ -r * cexp z / (1 - r * cexp z) := by
89+
ext z
90+
simp [logDeriv]
91+
92+
lemma logDeriv_one_sub_mul_cexp_comp (r : ℂ) {g : ℂ → ℂ} (hg : Differentiable ℂ g) :
93+
logDeriv ((fun z ↦ 1 - r * cexp z) ∘ g) =
94+
fun z ↦ -r * (deriv g z) * cexp (g z) / (1 - r * cexp (g z)) := by
95+
ext y
96+
rw [logDeriv_comp (by fun_prop) (hg y), logDeriv_one_sub_cexp]
97+
ring
98+
99+
private theorem one_sub_eta_logDeriv_eq (z : ℂ) (n : ℕ) :
100+
logDeriv (1 - eta_q n ·) z = 2 * π * I * (n + 1) * -eta_q n z / (1 - eta_q n z) := by
101+
have h2 : (fun x ↦ 1 - cexp (2 * ↑π * I * (n + 1) * x)) =
102+
((fun z ↦ 1 - 1 * cexp z) ∘ fun x ↦ 2 * ↑π * I * (n + 1) * x) := by aesop
103+
have h3 : deriv (fun x : ℂ ↦ (2 * π * I * (n + 1) * x)) =
104+
fun _ ↦ 2 * π * I * (n + 1) := by
105+
ext y
106+
simpa using deriv_const_mul (2 * π * I * (n + 1)) (d := fun (x : ℂ) ↦ x) (x := y)
107+
simp_rw [eta_q_eq_cexp, h2, logDeriv_one_sub_mul_cexp_comp 1
108+
(g := fun x ↦ (2 * π * I * (n + 1) * x)) (by fun_prop), h3]
109+
simp
110+
111+
lemma tsum_logDeriv_eta_q (z : ℂ) : ∑' n, logDeriv (fun x ↦ 1 - eta_q n x) z =
112+
(2 * π * I) * ∑' n, (n + 1) * (-eta_q n z) / (1 - eta_q n z) := by
113+
rw [tsum_congr (one_sub_eta_logDeriv_eq z), ← tsum_mul_left]
114+
grind
115+
116+
theorem differentiableAt_eta_of_mem_upperHalfPlaneSet {z : ℂ} (hz : z ∈ ℍₒ) :
117+
DifferentiableAt ℂ eta z := by
118+
apply DifferentiableAt.mul (by fun_prop)
119+
refine (multipliableLocallyUniformlyOn_eta.hasProdLocallyUniformlyOn.differentiableOn ?_
120+
isOpen_upperHalfPlaneSet z hz).differentiableAt (isOpen_upperHalfPlaneSet.mem_nhds hz)
121+
filter_upwards with b
122+
simpa [Finset.prod_fn] using DifferentiableOn.finset_prod (by fun_prop)
123+
124+
end ModularForm

Mathlib/NumberTheory/ModularForms/EisensteinSeries/MDifferentiable.lean

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ theorem eisensteinSeries_SIF_MDifferentiable {k : ℤ} {N : ℕ} (hk : 3 ≤ k)
5252
suffices DifferentiableAt ℂ (↑ₕeisensteinSeries_SIF a k) τ.1 by
5353
convert MDifferentiableAt.comp τ (DifferentiableAt.mdifferentiableAt this) τ.mdifferentiable_coe
5454
exact funext fun z ↦ (comp_ofComplex (eisensteinSeries_SIF a k) z).symm
55-
refine DifferentiableOn.differentiableAt ?_
56-
((isOpen_lt continuous_const Complex.continuous_im).mem_nhds τ.2)
55+
refine DifferentiableOn.differentiableAt ?_ (isOpen_upperHalfPlaneSet.mem_nhds τ.2)
5756
exact (eisensteinSeries_tendstoLocallyUniformlyOn hk a).differentiableOn
5857
(Eventually.of_forall fun s ↦ DifferentiableOn.fun_sum
59-
fun _ _ ↦ eisSummand_extension_differentiableOn _ _)
60-
(isOpen_lt continuous_const continuous_im)
58+
fun _ _ ↦ eisSummand_extension_differentiableOn _ _) isOpen_upperHalfPlaneSet
6159

6260
end EisensteinSeries

0 commit comments

Comments
 (0)