Skip to content

Commit 4a5bed5

Browse files
committed
feat: a continuous meromorphic function is analytic (#24370)
We also characterize the order of a meromorphic function being `< 0`, or `= 0`, or `> 0`, as the convergence of the function to infinity, resp. a nonzero constant, resp. zero. This is used to generalize `analyticAt_mem_codiscreteWithin`, and from there remove completeness assumptions throughout the meromorphic functions theory.
1 parent fafe840 commit 4a5bed5

File tree

5 files changed

+227
-37
lines changed

5 files changed

+227
-37
lines changed

Mathlib/Analysis/Analytic/Basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,14 @@ protected theorem AnalyticAt.continuousAt (hf : AnalyticAt 𝕜 f x) : Continuou
13221322
let ⟨_, hp⟩ := hf
13231323
hp.continuousAt
13241324

1325+
protected theorem AnalyticAt.eventually_continuousAt (hf : AnalyticAt 𝕜 f x) :
1326+
∀ᶠ y in 𝓝 x, ContinuousAt f y := by
1327+
rcases hf with ⟨g, r, hg⟩
1328+
have : EMetric.ball x r ∈ 𝓝 x := EMetric.ball_mem_nhds _ hg.r_pos
1329+
filter_upwards [this] with y hy
1330+
apply hg.continuousOn.continuousAt
1331+
exact EMetric.isOpen_ball.mem_nhds hy
1332+
13251333
protected theorem AnalyticOnNhd.continuousOn {s : Set E} (hf : AnalyticOnNhd 𝕜 f s) :
13261334
ContinuousOn f s :=
13271335
fun x hx => (hf x hx).continuousAt.continuousWithinAt

Mathlib/Analysis/Meromorphic/Basic.lean

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,25 @@ lemma zpow' {f : 𝕜 → 𝕜} {x : 𝕜} (hf : MeromorphicAt f x) (n : ℤ) :
218218
MeromorphicAt (fun z ↦ (f z) ^ n) x :=
219219
hf.zpow n
220220

221+
/-- If a function is meromorphic at a point, then it is continuous at nearby points. -/
222+
theorem eventually_continuousAt {f : 𝕜 → E} {x : 𝕜}
223+
(h : MeromorphicAt f x) : ∀ᶠ y in 𝓝[≠] x, ContinuousAt f y := by
224+
obtain ⟨n, h⟩ := h
225+
have : ∀ᶠ y in 𝓝[≠] x, ContinuousAt (fun z ↦ (z - x) ^ n • f z) y :=
226+
nhdsWithin_le_nhds h.eventually_continuousAt
227+
filter_upwards [this, self_mem_nhdsWithin] with y hy h'y
228+
simp only [Set.mem_compl_iff, Set.mem_singleton_iff] at h'y
229+
have : ContinuousAt (fun z ↦ ((z - x) ^ n)⁻¹) y :=
230+
ContinuousAt.inv₀ (by fun_prop) (by simp [sub_eq_zero, h'y])
231+
apply (this.smul hy).congr
232+
filter_upwards [eventually_ne_nhds h'y] with z hz
233+
simp [smul_smul, hz, sub_eq_zero]
234+
235+
/-- In a complete space, a function which is meromorphic at a point is analytic at all nearby
236+
points. The completeness assumption can be dispensed with if one assumes that `f` is meromorphic
237+
on a set around `x`, see `MeromorphicOn.eventually_analyticAt`. -/
221238
theorem eventually_analyticAt [CompleteSpace E] {f : 𝕜 → E} {x : 𝕜}
222239
(h : MeromorphicAt f x) : ∀ᶠ y in 𝓝[≠] x, AnalyticAt 𝕜 f y := by
223-
rw [MeromorphicAt] at h
224240
obtain ⟨n, h⟩ := h
225241
apply AnalyticAt.eventually_analyticAt at h
226242
refine (h.filter_mono ?_).mp ?_
@@ -266,17 +282,6 @@ lemma const (e : E) {U : Set 𝕜} : MeromorphicOn (fun _ ↦ e) U :=
266282

267283
section arithmetic
268284

269-
include hf in
270-
/-- Meromorphic functions on `U` are analytic on `U`, outside of a discrete subset. -/
271-
theorem analyticAt_mem_codiscreteWithin [CompleteSpace E] :
272-
{ x | AnalyticAt 𝕜 f x } ∈ Filter.codiscreteWithin U := by
273-
rw [mem_codiscreteWithin]
274-
intro x hx
275-
rw [Filter.disjoint_principal_right, ← Filter.eventually_mem_set]
276-
apply (hf x hx).eventually_analyticAt.mono
277-
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and, not_not]
278-
tauto
279-
280285
include hf in
281286
lemma mono_set {V : Set 𝕜} (hv : V ⊆ U) : MeromorphicOn f V := fun x hx ↦ hf x (hv hx)
282287

Mathlib/Analysis/Meromorphic/Divisor.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ divisors.
1919
-/
2020

2121
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {U : Set 𝕜} {z : 𝕜}
22-
{E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E]
22+
{E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
2323

2424
namespace MeromorphicOn
2525

@@ -90,7 +90,7 @@ See `MeromorphicOn.exists_order_ne_top_iff_forall` and
9090
`MeromorphicOn.order_ne_top_of_isPreconnected` for two convenient criteria to guarantee conditions
9191
`h₂f₁` and `h₂f₂`.
9292
-/
93-
theorem divisor_smul [CompleteSpace 𝕜] {f₁ : 𝕜 → 𝕜} {f₂ : 𝕜 → E} (h₁f₁ : MeromorphicOn f₁ U)
93+
theorem divisor_smul {f₁ : 𝕜 → 𝕜} {f₂ : 𝕜 → E} (h₁f₁ : MeromorphicOn f₁ U)
9494
(h₁f₂ : MeromorphicOn f₂ U) (h₂f₁ : ∀ z, (hz : z ∈ U) → (h₁f₁ z hz).order ≠ ⊤)
9595
(h₂f₂ : ∀ z, (hz : z ∈ U) → (h₁f₂ z hz).order ≠ ⊤) :
9696
divisor (f₁ • f₂) U = divisor f₁ U + divisor f₂ U := by
@@ -110,15 +110,15 @@ See `MeromorphicOn.exists_order_ne_top_iff_forall` and
110110
`MeromorphicOn.order_ne_top_of_isPreconnected` for two convenient criteria to guarantee conditions
111111
`h₂f₁` and `h₂f₂`.
112112
-/
113-
theorem divisor_mul [CompleteSpace 𝕜] {f₁ f₂ : 𝕜 → 𝕜} (h₁f₁ : MeromorphicOn f₁ U)
113+
theorem divisor_mul {f₁ f₂ : 𝕜 → 𝕜} (h₁f₁ : MeromorphicOn f₁ U)
114114
(h₁f₂ : MeromorphicOn f₂ U) (h₂f₁ : ∀ z, (hz : z ∈ U) → (h₁f₁ z hz).order ≠ ⊤)
115115
(h₂f₂ : ∀ z, (hz : z ∈ U) → (h₁f₂ z hz).order ≠ ⊤) :
116116
divisor (f₁ * f₂) U = divisor f₁ U + divisor f₂ U :=
117117
divisor_smul h₁f₁ h₁f₂ h₂f₁ h₂f₂
118118

119119
/-- The divisor of the inverse is the negative of the divisor. -/
120120
@[simp]
121-
theorem divisor_inv [CompleteSpace 𝕜] {f : 𝕜 → 𝕜} :
121+
theorem divisor_inv {f : 𝕜 → 𝕜} :
122122
divisor f⁻¹ U = -divisor f U := by
123123
ext z
124124
by_cases h : MeromorphicOn f U ∧ z ∈ U

Mathlib/Analysis/Meromorphic/NormalForm.lean

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ theorem AnalyticAt.meromorphicNFAt (hf : AnalyticAt 𝕜 f x) :
127127

128128
/-- Meromorphic functions have normal form outside of a discrete subset in the domain of
129129
meromorphicity. -/
130-
theorem MeromorphicOn.meromorphicNFAt_mem_codiscreteWithin [CompleteSpace E] {U : Set 𝕜}
130+
theorem MeromorphicOn.meromorphicNFAt_mem_codiscreteWithin {U : Set 𝕜}
131131
(hf : MeromorphicOn f U) :
132132
{ x | MeromorphicNFAt f x } ∈ Filter.codiscreteWithin U := by
133133
filter_upwards [hf.analyticAt_mem_codiscreteWithin] with _ ha
@@ -171,7 +171,7 @@ theorem MeromorphicNFAt.order_eq_zero_iff (hf : MeromorphicNFAt f x) :
171171
/-- **Local identity theorem**: two meromorphic functions in normal form agree in a
172172
neighborhood iff they agree in a pointed neighborhood.
173173
174-
See `ContinuousAt.eventuallyEq_nhdNE_iff_eventuallyEq_nhd` for the analogous
174+
See `ContinuousAt.eventuallyEq_nhd_iff_eventuallyEq_nhdNE` for the analogous
175175
statement for continuous functions.
176176
-/
177177
theorem MeromorphicNFAt.eventuallyEq_nhdNE_iff_eventuallyEq_nhd {g : 𝕜 → E}
@@ -427,7 +427,7 @@ theorem MeromorphicNFOn.meromorphicOn (hf : MeromorphicNFOn f U) :
427427
If a function is meromorphic in normal form on `U`, then its divisor is
428428
non-negative iff it is analytic.
429429
-/
430-
theorem MeromorphicNFOn.divisor_nonneg_iff_analyticOnNhd [CompleteSpace E]
430+
theorem MeromorphicNFOn.divisor_nonneg_iff_analyticOnNhd
431431
(h₁f : MeromorphicNFOn f U) :
432432
0 ≤ MeromorphicOn.divisor f U ↔ AnalyticOnNhd 𝕜 f U := by
433433
constructor <;> intro h x
@@ -455,7 +455,7 @@ theorem AnalyticOnNhd.meromorphicNFOn (h₁f : AnalyticOnNhd 𝕜 f U) :
455455
If `f` is meromorphic in normal form on `U` and nowhere locally constant zero,
456456
then its zero set equals the support of the associated divisor.
457457
-/
458-
theorem MeromorphicNFOn.zero_set_eq_divisor_support [CompleteSpace E] (h₁f : MeromorphicNFOn f U)
458+
theorem MeromorphicNFOn.zero_set_eq_divisor_support (h₁f : MeromorphicNFOn f U)
459459
(h₂f : ∀ u : U, (h₁f u.2).meromorphicAt.order ≠ ⊤) :
460460
U ∩ f⁻¹' {0} = Function.support (MeromorphicOn.divisor f U) := by
461461
ext u
@@ -559,7 +559,7 @@ Conversion to normal form on `U` does not change values outside of `U`.
559559
Conversion to normal form on `U` changes the value only along a discrete subset
560560
of `U`.
561561
-/
562-
theorem toMeromorphicNFOn_eqOn_codiscrete [CompleteSpace E] (hf : MeromorphicOn f U) :
562+
theorem toMeromorphicNFOn_eqOn_codiscrete (hf : MeromorphicOn f U) :
563563
f =ᶠ[Filter.codiscreteWithin U] toMeromorphicNFOn f U := by
564564
have : U ∈ Filter.codiscreteWithin U := by
565565
simp [mem_codiscreteWithin.2]
@@ -570,17 +570,20 @@ theorem toMeromorphicNFOn_eqOn_codiscrete [CompleteSpace E] (hf : MeromorphicOn
570570
If `f` is meromorphic on `U` and `x ∈ U`, then `f` and its conversion to normal
571571
form on `U` agree in a punctured neighborhood of `x`.
572572
-/
573-
theorem MeromorphicOn.toMeromorphicNFOn_eq_self_on_nhdNE [CompleteSpace E]
573+
theorem MeromorphicOn.toMeromorphicNFOn_eq_self_on_nhdNE
574574
(hf : MeromorphicOn f U) (hx : x ∈ U) :
575575
toMeromorphicNFOn f U =ᶠ[𝓝[≠] x] f := by
576-
filter_upwards [(hf x hx).eventually_analyticAt] with a ha
577-
simp [toMeromorphicNFOn, hf, ← (toMeromorphicNFAt_eq_self.2 ha.meromorphicNFAt).symm]
576+
filter_upwards [hf.eventually_analyticAt_or_mem_compl hx] with a ha
577+
rcases ha with ha | ha
578+
· simp [toMeromorphicNFOn, hf, ← (toMeromorphicNFAt_eq_self.2 ha.meromorphicNFAt).symm]
579+
· simp only [Set.mem_compl_iff] at ha
580+
simp [toMeromorphicNFOn, ha, hf]
578581

579582
/--
580583
If `f` is meromorphic on `U` and `x ∈ U`, then conversion to normal form at `x`
581584
and conversion to normal form on `U` agree in a neighborhood of `x`.
582585
-/
583-
theorem toMeromorphicNFOn_eq_toMeromorphicNFAt_on_nhd [CompleteSpace E] (hf : MeromorphicOn f U)
586+
theorem toMeromorphicNFOn_eq_toMeromorphicNFAt_on_nhd (hf : MeromorphicOn f U)
584587
(hx : x ∈ U) :
585588
toMeromorphicNFOn f U =ᶠ[𝓝 x] toMeromorphicNFAt f x := by
586589
apply eventuallyEq_nhds_of_eventuallyEq_nhdsNE
@@ -591,7 +594,7 @@ theorem toMeromorphicNFOn_eq_toMeromorphicNFAt_on_nhd [CompleteSpace E] (hf : Me
591594
If `f` is meromorphic on `U` and `x ∈ U`, then conversion to normal form at `x`
592595
and conversion to normal form on `U` agree at `x`.
593596
-/
594-
theorem toMeromorphicNFOn_eq_toMeromorphicNFAt [CompleteSpace E] (hf : MeromorphicOn f U)
597+
theorem toMeromorphicNFOn_eq_toMeromorphicNFAt (hf : MeromorphicOn f U)
595598
(hx : x ∈ U) :
596599
toMeromorphicNFOn f U x = toMeromorphicNFAt f x x := by
597600
apply Filter.EventuallyEq.eq_of_nhds (g := toMeromorphicNFAt f x)
@@ -601,7 +604,7 @@ variable (f U) in
601604
/--
602605
After conversion to normal form on `U`, the function has normal form.
603606
-/
604-
theorem meromorphicNFOn_toMeromorphicNFOn [CompleteSpace E] :
607+
theorem meromorphicNFOn_toMeromorphicNFOn :
605608
MeromorphicNFOn (toMeromorphicNFOn f U) U := by
606609
by_cases hf : MeromorphicOn f U
607610
· intro z hz
@@ -614,7 +617,7 @@ theorem meromorphicNFOn_toMeromorphicNFOn [CompleteSpace E] :
614617
/--
615618
If `f` has normal form on `U`, then `f` equals `toMeromorphicNFOn f U`.
616619
-/
617-
@[simp] theorem toMeromorphicNFOn_eq_self [CompleteSpace E] :
620+
@[simp] theorem toMeromorphicNFOn_eq_self :
618621
toMeromorphicNFOn f U = f ↔ MeromorphicNFOn f U := by
619622
constructor <;> intro h
620623
· rw [h.symm]
@@ -628,16 +631,15 @@ If `f` has normal form on `U`, then `f` equals `toMeromorphicNFOn f U`.
628631
/--
629632
Conversion of normal form does not affect orders.
630633
-/
631-
@[simp] theorem order_toMeromorphicNFOn [CompleteSpace E] (hf : MeromorphicOn f U) (hx : x ∈ U) :
634+
@[simp] theorem order_toMeromorphicNFOn (hf : MeromorphicOn f U) (hx : x ∈ U) :
632635
((meromorphicNFOn_toMeromorphicNFOn f U) hx).meromorphicAt.order = (hf x hx).order := by
633636
apply MeromorphicAt.order_congr
634637
exact hf.toMeromorphicNFOn_eq_self_on_nhdNE hx
635638

636639
/--
637640
Conversion of normal form does not affect divisors.
638641
-/
639-
@[simp] theorem MeromorphicOn.divisor_of_toMeromorphicNFOn [CompleteSpace E]
640-
(hf : MeromorphicOn f U) :
642+
@[simp] theorem MeromorphicOn.divisor_of_toMeromorphicNFOn (hf : MeromorphicOn f U) :
641643
divisor (toMeromorphicNFOn f U) U = divisor f U := by
642644
ext z
643645
by_cases hz : z ∈ U <;> simp [hf, (meromorphicNFOn_toMeromorphicNFOn f U).meromorphicOn, hz]

0 commit comments

Comments
 (0)