Skip to content

Commit 177caf0

Browse files
committed
feat(NumberTheory/ModularForms): dimension formula for level one modular forms (#37979)
Proves the classical dimension formula for the space of modular forms of level 1 (`SL(2, ℤ)`) and even weight `k`: $$\dim M_k(\mathrm{SL}(2,\mathbb{Z})) = \lfloor k/12 \rfloor \text{ if } k \equiv 2 \pmod{12}, \qquad\lfloor k/12 \rfloor + 1 \text{ otherwise.}$$ The work was done as part of the Sphere packing project.
1 parent 1a4917a commit 177caf0

10 files changed

Lines changed: 429 additions & 46 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5655,6 +5655,7 @@ public import Mathlib.NumberTheory.ModularForms.Cusps
56555655
public import Mathlib.NumberTheory.ModularForms.DedekindEta
56565656
public import Mathlib.NumberTheory.ModularForms.Delta
56575657
public import Mathlib.NumberTheory.ModularForms.Derivative
5658+
public import Mathlib.NumberTheory.ModularForms.DimensionFormulas.LevelOne
56585659
public import Mathlib.NumberTheory.ModularForms.Discriminant
56595660
public import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Basic
56605661
public import Mathlib.NumberTheory.ModularForms.EisensteinSeries.Defs

Mathlib/NumberTheory/ModularForms/Basic.lean

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,15 @@ theorem zero_apply (z : ℍ) : (0 : ModularForm Γ k) z = 0 :=
227227
(f : ℍ → ℂ) = 0 ↔ f = 0 := by
228228
rw [← coe_zero, DFunLike.coe_fn_eq]
229229

230+
/-- If `-1 ∈ Γ` and `k` is odd, then every modular form of weight `k` for `Γ` is zero. -/
231+
lemma eq_zero_of_neg_one_mem [Γ.HasDetOne] (h_neg_one : -1 ∈ Γ) (hk : Odd k)
232+
(f : ModularForm Γ k) : f = 0 := by
233+
ext z
234+
have hf := slash_action_eqn'' f h_neg_one z
235+
rw [neg_smul, one_smul, denom_neg, denom_one, hk.neg_one_zpow] at hf
236+
have h2 : (2 : ℂ) * f z = 0 := by linear_combination hf
237+
exact (mul_eq_zero.mp h2).resolve_left (by norm_num)
238+
230239
section
231240
-- scalar multiplication by real types (no assumption on `Γ`)
232241

@@ -520,19 +529,40 @@ instance (priority := 99) [FunLike F ℍ ℂ] [CuspFormClass F Γ k] : ModularFo
520529
holo := CuspFormClass.holo
521530
bdd_at_cusps f _ hc g hg := (CuspFormClass.zero_at_cusps f hc g hg).boundedAtFilter
522531

532+
/-- Multiplying a `CuspForm` by a `ModularForm` gives a `CuspForm` (the cusp condition is
533+
preserved since a function tending to zero times a bounded function tends to zero). -/
534+
@[simps! -fullyApplied coe]
535+
def mulModularForm [Γ.HasDetPlusMinusOne] {k₁ k₂ : ℤ} (f : CuspForm Γ k₁) (g : ModularForm Γ k₂) :
536+
CuspForm Γ (k₁ + k₂) where
537+
toSlashInvariantForm := f.1.mul g.1
538+
holo' := f.holo'.mul g.holo'
539+
zero_at_cusps' hc γ hγ := by
540+
simpa [mul_slash] using
541+
((f.zero_at_cusps' hc γ hγ).mul_boundedAtFilter (g.bdd_at_cusps' hc γ hγ)).smul _
542+
543+
/-- Cast for cusp forms, which is useful for avoiding `Heq`s. Optionally transports along
544+
an equality of subgroups. -/
545+
def mcast {a b : ℤ} {Γ Γ' : Subgroup (GL (Fin 2) ℝ)} (h : a = b) (f : CuspForm Γ a)
546+
(hΓ : Γ' = Γ := by rfl) : CuspForm Γ' b where
547+
toFun := (f : ℍ → ℂ)
548+
slash_action_eq' A hA := h ▸ f.slash_action_eq' A (hΓ ▸ hA)
549+
holo' := f.holo'
550+
zero_at_cusps' hc := h ▸ f.zero_at_cusps' (hΓ ▸ hc)
551+
523552
end CuspForm
524553

525554
namespace ModularForm
526555

527556
section GradedRing
528557

529-
/-- Cast for modular forms, which is useful for avoiding `Heq`s. -/
530-
def mcast {a b : ℤ} {Γ : Subgroup (GL (Fin 2) ℝ)} (h : a = b) (f : ModularForm Γ a) :
531-
ModularForm Γ b where
558+
/-- Cast for modular forms, which is useful for avoiding `Heq`s. Optionally transports along
559+
an equality of subgroups. -/
560+
def mcast {a b : ℤ} {Γ Γ' : Subgroup (GL (Fin 2) ℝ)} (h : a = b) (f : ModularForm Γ a)
561+
(hΓ : Γ' = Γ := by rfl) : ModularForm Γ' b where
532562
toFun := (f : ℍ → ℂ)
533-
slash_action_eq' A := h ▸ f.slash_action_eq' A
563+
slash_action_eq' A hA := h ▸ f.slash_action_eq' A (hΓ ▸ hA)
534564
holo' := f.holo'
535-
bdd_at_cusps' A := h ▸ f.bdd_at_cusps' A
565+
bdd_at_cusps' hc := h ▸ f.bdd_at_cusps' (hΓ ▸ hc)
536566

537567
@[ext (iff := false)]
538568
theorem gradedMonoid_eq_of_cast {Γ : Subgroup (GL (Fin 2) ℝ)} {a b : GradedMonoid (ModularForm Γ)}

Mathlib/NumberTheory/ModularForms/DedekindEta.lean

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,51 @@ noncomputable def eta (z : ℂ) := 𝕢 24 z * ∏' n, (1 - eta_q n z)
6262
/-- Notation for the Dedekind eta function. -/
6363
scoped[ModularForm] notation "η" => eta
6464

65+
/-- For `‖q‖ < 1`, the infinite product `∏ (1 - q^(n+1))` is multipliable. -/
66+
lemma multipliable_one_sub_pow {q : ℂ} (hq : ‖q‖ < 1) :
67+
Multipliable fun n : ℕ ↦ 1 - q ^ (n + 1) := by
68+
apply multipliable_one_add_of_summable (f := fun n ↦ -q ^ (n + 1))
69+
simpa using (summable_nat_add_iff 1).mpr (summable_geometric_of_lt_one (norm_nonneg _) hq)
70+
71+
/-- The infinite product `∏ (1 - q^(n+1))` converges locally uniformly on the open unit disc,
72+
with limit `q ↦ ∏' n, (1 - q^(n+1))`. -/
73+
lemma multipliableLocallyUniformlyOn_one_sub_pow :
74+
MultipliableLocallyUniformlyOn (fun n q ↦ 1 - q ^ (n + 1)) (Metric.ball (0 : ℂ) 1) := by
75+
use fun q ↦ ∏' n, (1 - q ^ (n + 1))
76+
simp_rw [sub_eq_add_neg]
77+
apply hasProdLocallyUniformlyOn_of_forall_compact Metric.isOpen_ball
78+
intro K hK hcK
79+
rcases K.eq_empty_or_nonempty with hN | hN
80+
· simpa [hasProdUniformlyOn_iff_tendstoUniformlyOn, hN] using tendstoUniformlyOn_empty
81+
· obtain ⟨q₀, hq₀, _, HB⟩ := hcK.exists_sSup_image_eq_and_ge hN
82+
(show ContinuousOn (fun q : ℂ ↦ ‖q‖) K by fun_prop)
83+
refine ((summable_nat_add_iff 1).mpr (summable_geometric_of_lt_one (norm_nonneg _)
84+
(by simpa [Metric.mem_ball, dist_zero_right] using hK hq₀))).hasProdUniformlyOn_nat_one_add
85+
hcK (.of_forall fun n x hx ↦ ?_) (fun _ ↦ by fun_prop)
86+
simpa using pow_le_pow_left₀ (norm_nonneg _) (HB x hx) (n + 1)
87+
88+
/-- The infinite product `q ↦ ∏' n, (1 - q^(n+1))` is differentiable on the open unit disc. -/
89+
lemma differentiableOn_tprod_one_sub_pow :
90+
DifferentiableOn ℂ (fun q ↦ ∏' n, (1 - q ^ (n + 1))) (Metric.ball (0 : ℂ) 1) :=
91+
multipliableLocallyUniformlyOn_one_sub_pow.hasProdLocallyUniformlyOn.differentiableOn
92+
(.of_forall fun _ ↦ by simpa [Finset.prod_fn] using
93+
DifferentiableOn.finsetProd (fun _ _ ↦ by fun_prop)) Metric.isOpen_ball
94+
95+
/-- For any `k`, the function `q ↦ ∏' n, (1 - q^(n+1))^k` is differentiable on the
96+
open unit disc. -/
97+
lemma differentiableOn_tprod_one_sub_pow_pow (k : ℕ) :
98+
DifferentiableOn ℂ (fun q ↦ ∏' n, (1 - q ^ (n + 1)) ^ k) (Metric.ball (0 : ℂ) 1) :=
99+
(differentiableOn_tprod_one_sub_pow.fun_pow k).congr fun _ hq ↦
100+
(multipliable_one_sub_pow (by simpa using hq)).tprod_pow k
101+
65102
theorem summable_eta_q (z : ℍ) : Summable fun n ↦ ‖-eta_q n z‖ := by
66-
simp [eta_q, eta_q_eq_pow, summable_nat_add_iff 1, norm_exp_two_pi_I_lt_one z]
103+
simpa [summable_nat_add_iff] using
104+
summable_geometric_of_lt_one (norm_nonneg _) (mod_cast norm_qParam_lt_one 1 z)
67105

68106
lemma multipliableLocallyUniformlyOn_eta :
69-
MultipliableLocallyUniformlyOn (fun n a ↦ 1 - eta_q n a) ℍₒ := by
70-
use fun z ↦ ∏' n, (1 - eta_q n z)
71-
simp_rw [sub_eq_add_neg]
72-
apply hasProdLocallyUniformlyOn_of_forall_compact isOpen_upperHalfPlaneSet
73-
intro K hK hcK
74-
by_cases hN : K.Nonempty
75-
· have hc : ContinuousOn (fun x ↦ ‖cexp (2 * π * I * x)‖) K := by fun_prop
76-
obtain ⟨z, hz, hB, HB⟩ := hcK.exists_sSup_image_eq_and_ge hN hc
77-
apply (summable_eta_q ⟨z, hK hz⟩).hasProdUniformlyOn_nat_one_add hcK
78-
· filter_upwards with n x hx
79-
simpa [eta_q, eta_q_eq_pow] using pow_le_pow_left₀ (by simp [norm_nonneg]) (HB x hx) _
80-
· simp_rw [eta_q, Periodic.qParam]
81-
fun_prop
82-
· rw [hasProdUniformlyOn_iff_tendstoUniformlyOn]
83-
simpa [not_nonempty_iff_eq_empty.mp hN] using tendstoUniformlyOn_empty
107+
MultipliableLocallyUniformlyOn (fun n a ↦ 1 - eta_q n a) ℍₒ :=
108+
multipliableLocallyUniformlyOn_one_sub_pow.comp (𝕢 1)
109+
(fun z hz ↦ by simpa using norm_qParam_lt_one 1 ⟨z, hz⟩) (by fun_prop)
84110

85111
lemma eta_tprod_ne_zero {z : ℂ} (hz : z ∈ ℍₒ) : ∏' n, (1 - eta_q n z) ≠ 0 := by
86112
refine tprod_one_add_ne_zero_of_summable (f := fun n ↦ -eta_q n z) ?_ ?_
@@ -118,10 +144,9 @@ lemma tsum_logDeriv_eta_q (z : ℂ) : ∑' n, logDeriv (fun x ↦ 1 - eta_q n x)
118144

119145
lemma differentiableAt_eta_tprod {z : ℂ} (hz : z ∈ ℍₒ) :
120146
DifferentiableAt ℂ (fun x ↦ ∏' n, (1 - eta_q n x)) z := by
121-
apply (multipliableLocallyUniformlyOn_eta.hasProdLocallyUniformlyOn.differentiableOn ?_
122-
isOpen_upperHalfPlaneSet z hz).differentiableAt (isOpen_upperHalfPlaneSet.mem_nhds hz)
123-
filter_upwards with b
124-
simpa [Finset.prod_fn] using DifferentiableOn.finsetProd (by fun_prop)
147+
have hq : 𝕢 1 z ∈ Metric.ball 0 1 := by simpa using norm_qParam_lt_one 1 ⟨z, hz⟩
148+
exact (differentiableOn_tprod_one_sub_pow.differentiableAt
149+
(Metric.isOpen_ball.mem_nhds hq)).comp z (by fun_prop)
125150

126151
theorem differentiableAt_eta_of_mem_upperHalfPlaneSet {z : ℂ} (hz : z ∈ ℍₒ) :
127152
DifferentiableAt ℂ eta z :=

0 commit comments

Comments
 (0)