@@ -10,13 +10,11 @@ import Mathlib.Analysis.Complex.UpperHalfPlane.Manifold
1010import Mathlib.Algebra.Group.Action.Sum
1111import Mathlib.Analysis.Meromorphic.Order
1212import Mathlib.Analysis.Complex.CauchyIntegral
13-
14- import ModularFormDimensions.MathlibPRs.MeromorphicOrder
15-
13+ import Mathlib.Analysis.Meromorphic.NormalForm
1614
1715open UpperHalfPlane Filter Topology
1816
19- open scoped ModularForm
17+ open scoped ModularForm Manifold
2018
2119private lemma UpperHalfPlane.analyticAt_smul {g : GL (Fin 2 ) ℝ} (hg : 0 < g.val.det) (τ : ℍ) :
2220 AnalyticAt ℂ (fun z ↦ ↑(g • ofComplex z) : ℂ → ℂ) τ := by
@@ -92,8 +90,8 @@ local notation "Y(" 𝒢 ")" => OpenModularCurve 𝒢
9290
9391TODO: Is this the morally right definition? Do we want to `weight` it by
9492the order of the stabilizer (at a cost of being `ℚ∞`-valued)? -/
95- noncomputable def meromorphicOrderQuotient {k : ℤ} (f : SlashInvariantForm 𝒢 k)
96- [𝒢.HasDetOne] : Y(𝒢) → WithTop ℤ :=
93+ noncomputable def meromorphicOrderQuotient {k : ℤ} (f : SlashInvariantForm 𝒢 k) [𝒢.HasDetOne] :
94+ Y(𝒢) → WithTop ℤ :=
9795 Quotient.lift (meromorphicOrderAt (f ∘ ofComplex) ·) (by
9896 rintro _ b ⟨⟨g, hg⟩, rfl⟩
9997 dsimp only [Subgroup.smul_def, Function.comp_def]
@@ -106,6 +104,44 @@ lemma meromorphicOrderQuotient_mk [𝒢.HasDetOne] {k : ℤ} (f : SlashInvariant
106104 meromorphicOrderQuotient 𝒢 f ⟦τ⟧ = meromorphicOrderAt (fun z ↦ f (ofComplex z)) ↑τ := by
107105 rfl
108106
107+ /-- Quotient of two meromorphic functions, in normal form. This is analytic wherever
108+ it can be. -/
109+ noncomputable def meroNFQuotient (f g : ℍ → ℂ) (τ : ℍ) :=
110+ toMeromorphicNFOn ((f ∘ ofComplex) / (g ∘ ofComplex)) upperHalfPlaneSet τ
111+
112+ lemma mdifferentiableAt_meroNFQuotient {f g : ℍ → ℂ} {τ : ℍ}
113+ (hf : MeromorphicOn (f ∘ ofComplex) upperHalfPlaneSet)
114+ (hg : MeromorphicOn (g ∘ ofComplex) upperHalfPlaneSet)
115+ (hle : ∀ (ξ : ℍ), meromorphicOrderAt (g ∘ ofComplex) ξ
116+ ≤ meromorphicOrderAt (f ∘ ofComplex) ξ) :
117+ MDifferentiableAt 𝓘(ℂ) 𝓘(ℂ) (meroNFQuotient f g) τ := by
118+ rw [mdifferentiableAt_iff]
119+ have : (meroNFQuotient f g ∘ ofComplex) =ᶠ[𝓝 ↑τ]
120+ toMeromorphicNFOn ((f ∘ ofComplex) / (g ∘ ofComplex)) upperHalfPlaneSet := by
121+ filter_upwards [isOpen_upperHalfPlaneSet.mem_nhds τ.im_pos] with a ha
122+ simp [meroNFQuotient, ofComplex_apply_of_im_pos, ha]
123+ rw [this.differentiableAt_iff]
124+ suffices AnalyticOnNhd ℂ _ upperHalfPlaneSet from (this ↑τ τ.im_pos).differentiableAt
125+ rw [← MeromorphicNFOn.divisor_nonneg_iff_analyticOnNhd]
126+ · intro a
127+ by_cases ha : 0 < a.im
128+ · rw [(meromorphicNFOn_toMeromorphicNFOn _ _).meromorphicOn.divisor_apply (by exact ha)]
129+ simp only [Function.locallyFinsuppWithin.coe_zero,
130+ Pi.zero_apply, WithTop.untop₀_nonneg]
131+ simp only [div_eq_mul_inv]
132+ rw [meromorphicOrderAt_toMeromorphicNFOn (hf.mul hg.inv) ha,
133+ meromorphicOrderAt_mul (hf a ha) (hg a ha).inv,
134+ meromorphicOrderAt_inv, ← sub_eq_add_neg]
135+ specialize hle (.mk a ha)
136+ generalize hr : meromorphicOrderAt (f ∘ ↑ofComplex) a = r
137+ generalize hs : meromorphicOrderAt (g ∘ ↑ofComplex) a = s
138+ cases r with | top => simp | coe r =>
139+ cases s with | top => simp | coe s =>
140+ norm_cast
141+ aesop
142+ · simp [ha]
143+ · exact meromorphicNFOn_toMeromorphicNFOn _ _
144+
109145/-- The quotient `𝒢 \ ℍ⋆`, where `𝒢` is a subgroup of `GL(2, ℝ)` and `ℍ⋆` denotes the union of
110146`ℍ` and the cusps of `𝒢`. -/
111147def CompletedModularCurve : Type := (OpenModularCurve 𝒢) ⊕ CuspOrbits 𝒢
0 commit comments