Skip to content

Commit e6775ea

Browse files
committed
feat: principle of isolated zeros for meromorphic functions (#21083)
Establish a principle of isolated zeros and show that the set where a meromorphic function has infinite order is clopen in the domain of meromorphy. These theorems are used in [Project VD](https://github.com/kebekus/ProjectVD), which aims to formalize Value Distribution Theory for meromorphic functions on the complex plane.
1 parent da0385c commit e6775ea

File tree

2 files changed

+137
-1
lines changed

2 files changed

+137
-1
lines changed

Mathlib/Analysis/Analytic/IsolatedZeros.lean

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,49 @@ theorem eq_of_frequently_eq [ConnectedSpace 𝕜] (hf : AnalyticOnNhd 𝕜 f uni
345345
@[deprecated (since := "2024-09-26")]
346346
alias _root_.AnalyticOn.eq_of_frequently_eq := eq_of_frequently_eq
347347

348+
/-- The set where an analytic function has infinite order is clopen in its domain of analyticity. -/
349+
theorem isClopen_setOf_order_eq_top (h₁f : AnalyticOnNhd 𝕜 f U) :
350+
IsClopen { u : U | (h₁f u.1 u.2).order = ⊤ } := by
351+
constructor
352+
· rw [← isOpen_compl_iff, isOpen_iff_forall_mem_open]
353+
intro z hz
354+
rcases (h₁f z.1 z.2).eventually_eq_zero_or_eventually_ne_zero with h | h
355+
· -- Case: f is locally zero in a punctured neighborhood of z
356+
rw [← (h₁f z.1 z.2).order_eq_top_iff] at h
357+
tauto
358+
· -- Case: f is locally nonzero in a punctured neighborhood of z
359+
obtain ⟨t', h₁t', h₂t', h₃t'⟩ := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 h)
360+
use Subtype.val ⁻¹' t'
361+
constructor
362+
· intro w hw
363+
simp only [mem_compl_iff, mem_setOf_eq]
364+
by_cases h₁w : w = z
365+
· rwa [h₁w]
366+
· rw [(h₁f _ w.2).order_eq_zero_iff.2 ((h₁t' w hw) (Subtype.coe_ne_coe.mpr h₁w))]
367+
exact ENat.zero_ne_top
368+
· exact ⟨isOpen_induced h₂t', h₃t'⟩
369+
· apply isOpen_iff_forall_mem_open.mpr
370+
intro z hz
371+
conv =>
372+
arg 1; intro; left; right; arg 1; intro
373+
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff]
374+
simp only [Set.mem_setOf_eq] at hz
375+
rw [AnalyticAt.order_eq_top_iff, eventually_nhds_iff] at hz
376+
obtain ⟨t', h₁t', h₂t', h₃t'⟩ := hz
377+
use Subtype.val ⁻¹' t'
378+
simp only [Set.mem_compl_iff, Set.mem_singleton_iff, isOpen_induced h₂t', Set.mem_preimage,
379+
h₃t', and_self, and_true]
380+
intro w hw
381+
simp only [mem_setOf_eq]
382+
-- Trivial case: w = z
383+
by_cases h₁w : w = z
384+
· rw [h₁w]
385+
tauto
386+
-- Nontrivial case: w ≠ z
387+
use t' \ {z.1}, fun y h₁y ↦ h₁t' y h₁y.1, h₂t'.sdiff isClosed_singleton
388+
apply (Set.mem_diff w).1
389+
exact ⟨hw, Set.mem_singleton_iff.not.1 (Subtype.coe_ne_coe.2 h₁w)⟩
390+
348391
section Mul
349392
/-!
350393
### Vanishing of products of analytic functions

Mathlib/Analysis/Analytic/Meromorphic.lean

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2024 David Loeffler. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: David Loeffler
4+
Authors: David Loeffler, Stefan Kebekus
55
-/
66
import Mathlib.Analysis.Analytic.IsolatedZeros
77
import Mathlib.Algebra.Order.AddGroupWithTop
@@ -35,6 +35,23 @@ lemma AnalyticAt.meromorphicAt {f : 𝕜 → E} {x : 𝕜} (hf : AnalyticAt 𝕜
3535
MeromorphicAt f x :=
3636
0, by simpa only [pow_zero, one_smul]⟩
3737

38+
/- Analogue of the principle of isolated zeros for an analytic function: if a function is
39+
meromorphic at `z₀`, then either it is identically zero in a punctured neighborhood of `z₀`, or it
40+
does not vanish there at all. -/
41+
theorem MeromorphicAt.eventually_eq_zero_or_eventually_ne_zero {f : 𝕜 → E} {z₀ : 𝕜}
42+
(hf : MeromorphicAt f z₀) :
43+
(∀ᶠ z in 𝓝[≠] z₀, f z = 0) ∨ (∀ᶠ z in 𝓝[≠] z₀, f z ≠ 0) := by
44+
obtain ⟨n, h⟩ := hf
45+
rcases h.eventually_eq_zero_or_eventually_ne_zero with h₁ | h₂
46+
· left
47+
filter_upwards [nhdsWithin_le_nhds h₁, self_mem_nhdsWithin] with y h₁y h₂y
48+
rcases (smul_eq_zero.1 h₁y) with h₃ | h₄
49+
· exact False.elim (h₂y (sub_eq_zero.1 (pow_eq_zero_iff'.1 h₃).1))
50+
· assumption
51+
· right
52+
filter_upwards [h₂, self_mem_nhdsWithin] with y h₁y h₂y
53+
exact (smul_ne_zero_iff.1 h₁y).2
54+
3855
namespace MeromorphicAt
3956

4057
lemma id (x : 𝕜) : MeromorphicAt id x := analyticAt_id.meromorphicAt
@@ -334,6 +351,82 @@ lemma id {U : Set 𝕜} : MeromorphicOn id U := fun x _ ↦ .id x
334351
lemma const (e : E) {U : Set 𝕜} : MeromorphicOn (fun _ ↦ e) U :=
335352
fun x _ ↦ .const e x
336353

354+
/-- The set where a meromorphic function has infinite order is clopen in its domain of meromorphy.
355+
-/
356+
theorem isClopen_setOf_order_eq_top {U : Set 𝕜} (hf : MeromorphicOn f U) :
357+
IsClopen { u : U | (hf u.1 u.2).order = ⊤ } := by
358+
constructor
359+
· rw [← isOpen_compl_iff, isOpen_iff_forall_mem_open]
360+
intro z hz
361+
rcases (hf z.1 z.2).eventually_eq_zero_or_eventually_ne_zero with h | h
362+
· -- Case: f is locally zero in a punctured neighborhood of z
363+
rw [← (hf z.1 z.2).order_eq_top_iff] at h
364+
tauto
365+
· -- Case: f is locally nonzero in a punctured neighborhood of z
366+
obtain ⟨t', h₁t', h₂t', h₃t'⟩ := eventually_nhds_iff.1 (eventually_nhdsWithin_iff.1 h)
367+
use Subtype.val ⁻¹' t'
368+
constructor
369+
· intro w hw
370+
simp only [Set.mem_compl_iff, Set.mem_setOf_eq]
371+
by_cases h₁w : w = z
372+
· rwa [h₁w]
373+
· rw [MeromorphicAt.order_eq_top_iff, not_eventually]
374+
apply Filter.Eventually.frequently
375+
rw [eventually_nhdsWithin_iff, eventually_nhds_iff]
376+
use t' \ {z.1}, fun y h₁y h₂y ↦ h₁t' y h₁y.1 h₁y.2, h₂t'.sdiff isClosed_singleton, hw,
377+
Set.mem_singleton_iff.not.2 (Subtype.coe_ne_coe.mpr h₁w)
378+
· exact ⟨isOpen_induced h₂t', h₃t'⟩
379+
· apply isOpen_iff_forall_mem_open.mpr
380+
intro z hz
381+
conv =>
382+
arg 1; intro; left; right; arg 1; intro
383+
rw [MeromorphicAt.order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff]
384+
simp only [Set.mem_setOf_eq] at hz
385+
rw [MeromorphicAt.order_eq_top_iff, eventually_nhdsWithin_iff, eventually_nhds_iff] at hz
386+
obtain ⟨t', h₁t', h₂t', h₃t'⟩ := hz
387+
use Subtype.val ⁻¹' t'
388+
simp only [Set.mem_compl_iff, Set.mem_singleton_iff, isOpen_induced h₂t', Set.mem_preimage,
389+
h₃t', and_self, and_true]
390+
intro w hw
391+
simp only [Set.mem_setOf_eq]
392+
-- Trivial case: w = z
393+
by_cases h₁w : w = z
394+
· rw [h₁w]
395+
tauto
396+
-- Nontrivial case: w ≠ z
397+
use t' \ {z.1}, fun y h₁y _ ↦ h₁t' y (Set.mem_of_mem_diff h₁y) (Set.mem_of_mem_inter_right h₁y)
398+
constructor
399+
· exact h₂t'.sdiff isClosed_singleton
400+
· apply (Set.mem_diff w).1
401+
exact ⟨hw, Set.mem_singleton_iff.not.1 (Subtype.coe_ne_coe.2 h₁w)⟩
402+
403+
/-- On a connected set, there exists a point where a meromorphic function `f` has finite order iff
404+
`f` has finite order at every point. -/
405+
theorem exists_order_ne_top_iff_forall {U : Set 𝕜} (hf : MeromorphicOn f U) (hU : IsConnected U) :
406+
(∃ u : U, (hf u u.2).order ≠ ⊤) ↔ (∀ u : U, (hf u u.2).order ≠ ⊤) := by
407+
constructor
408+
· intro h₂f
409+
have := isPreconnected_iff_preconnectedSpace.1 hU.isPreconnected
410+
rcases isClopen_iff.1 hf.isClopen_setOf_order_eq_top with h | h
411+
· intro u
412+
have : u ∉ (∅ : Set U) := by exact fun a => a
413+
rw [← h] at this
414+
tauto
415+
· obtain ⟨u, hU⟩ := h₂f
416+
have : u ∈ Set.univ := by trivial
417+
rw [← h] at this
418+
tauto
419+
· intro h₂f
420+
obtain ⟨v, hv⟩ := hU.nonempty
421+
use ⟨v, hv⟩, h₂f ⟨v, hv⟩
422+
423+
/-- On a preconnected set, a meromorphic function has finite order at one point if it has finite
424+
order at another point. -/
425+
theorem order_ne_top_of_isPreconnected {U : Set 𝕜} {x y : 𝕜} (hf : MeromorphicOn f U)
426+
(hU : IsPreconnected U) (h₁x : x ∈ U) (hy : y ∈ U) (h₂x : (hf x h₁x).order ≠ ⊤) :
427+
(hf y hy).order ≠ ⊤ :=
428+
(hf.exists_order_ne_top_iff_forall ⟨Set.nonempty_of_mem h₁x, hU⟩).1 (by use ⟨x, h₁x⟩) ⟨y, hy⟩
429+
337430
section arithmetic
338431

339432
include hf in

0 commit comments

Comments
 (0)