Skip to content

Commit 32308cd

Browse files
committed
feat: congruence lemmas for divisors of meromorphic functions (#23363)
Deliver on open TODO and state elementary congruence lemmas for divisors of meromorphic functions. This material is 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 ce77935 commit 32308cd

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

Mathlib/Analysis/Meromorphic/Basic.lean

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,39 @@ variable {s t : 𝕜 → 𝕜} {f g : 𝕜 → E} {U : Set 𝕜}
275275
(hs : MeromorphicOn s U) (ht : MeromorphicOn t U)
276276
(hf : MeromorphicOn f U) (hg : MeromorphicOn g U)
277277

278+
/--
279+
If `f` is meromorphic on `U`, if `g` agrees with `f` on a codiscrete subset of `U` and outside of
280+
`U`, then `g` is also meromorphic on `U`.
281+
-/
282+
theorem congr_codiscreteWithin_of_eqOn_compl (hf : MeromorphicOn f U)
283+
(h₁ : f =ᶠ[codiscreteWithin U] g) (h₂ : Set.EqOn f g Uᶜ) :
284+
MeromorphicOn g U := by
285+
intro x hx
286+
apply (hf x hx).congr
287+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
288+
disjoint_principal_right] at h₁
289+
filter_upwards [h₁ x hx] with a ha
290+
simp at ha
291+
tauto
292+
293+
/--
294+
If `f` is meromorphic on an open set `U`, if `g` agrees with `f` on a codiscrete subset of `U`, then
295+
`g` is also meromorphic on `U`.
296+
-/
297+
theorem congr_codiscreteWithin (hf : MeromorphicOn f U) (h₁ : f =ᶠ[codiscreteWithin U] g)
298+
(h₂ : IsOpen U) :
299+
MeromorphicOn g U := by
300+
intro x hx
301+
apply (hf x hx).congr
302+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
303+
disjoint_principal_right] at h₁
304+
have : U ∈ 𝓝[≠] x := by
305+
apply mem_nhdsWithin.mpr
306+
use U, h₂, hx, Set.inter_subset_left
307+
filter_upwards [this, h₁ x hx] with a h₁a h₂a
308+
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and, Decidable.not_not] at h₂a
309+
tauto
310+
278311
lemma id {U : Set 𝕜} : MeromorphicOn id U := fun x _ ↦ .id x
279312

280313
lemma const (e : E) {U : Set 𝕜} : MeromorphicOn (fun _ ↦ e) U :=

Mathlib/Analysis/Meromorphic/Divisor.lean

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ divisors.
1515
1616
## TODO
1717
18-
- Congruence lemmas for `codiscreteWithin`
18+
- Compatibility with restriction of divisors/functions
1919
-/
2020

2121
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {U : Set 𝕜} {z : 𝕜}
2222
{E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
2323

24+
open Filter Topology
25+
2426
namespace MeromorphicOn
2527

2628
/-!
@@ -66,6 +68,51 @@ Simplifier lemma: on `U`, the divisor of a function `f` that is meromorphic on `
6668
lemma divisor_apply {f : 𝕜 → E} (hf : MeromorphicOn f U) (hz : z ∈ U) :
6769
divisor f U z = (hf z hz).order.untop₀ := by simp_all [MeromorphicOn.divisor_def, hz]
6870

71+
/-!
72+
## Congruence Lemmas
73+
-/
74+
75+
/--
76+
If `f₁` is meromorphic on `U`, if `f₂` agrees with `f₁` on a codiscrete subset of `U` and outside of
77+
`U`, then `f₁` and `f₂` induce the same divisors on `U`.
78+
-/
79+
theorem divisor_congr_codiscreteWithin_of_eqOn_compl {f₁ f₂ : 𝕜 → E} (hf₁ : MeromorphicOn f₁ U)
80+
(h₁ : f₁ =ᶠ[Filter.codiscreteWithin U] f₂) (h₂ : Set.EqOn f₁ f₂ Uᶜ) :
81+
divisor f₁ U = divisor f₂ U := by
82+
ext x
83+
by_cases hx : x ∈ U
84+
· simp only [hf₁, hx, divisor_apply, hf₁.congr_codiscreteWithin_of_eqOn_compl h₁ h₂]
85+
congr 1
86+
apply (hf₁ x hx).order_congr
87+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
88+
disjoint_principal_right] at h₁
89+
filter_upwards [h₁ x hx] with a ha
90+
simp at ha
91+
tauto
92+
· simp [hx]
93+
94+
/--
95+
If `f₁` is meromorphic on an open set `U`, if `f₂` agrees with `f₁` on a codiscrete subset of `U`,
96+
then `f₁` and `f₂` induce the same divisors on`U`.
97+
-/
98+
theorem divisor_congr_codiscreteWithin {f₁ f₂ : 𝕜 → E} (hf₁ : MeromorphicOn f₁ U)
99+
(h₁ : f₁ =ᶠ[Filter.codiscreteWithin U] f₂) (h₂ : IsOpen U) :
100+
divisor f₁ U = divisor f₂ U := by
101+
ext x
102+
by_cases hx : x ∈ U
103+
· simp only [hf₁, hx, divisor_apply, hf₁.congr_codiscreteWithin h₁ h₂]
104+
congr 1
105+
apply (hf₁ x hx).order_congr
106+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
107+
disjoint_principal_right] at h₁
108+
have : U ∈ 𝓝[≠] x := by
109+
apply mem_nhdsWithin.mpr
110+
use U, h₂, hx, Set.inter_subset_left
111+
filter_upwards [this, h₁ x hx] with a h₁a h₂a
112+
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and, Decidable.not_not] at h₂a
113+
tauto
114+
· simp [hx]
115+
69116
/-!
70117
## Divisors of Analytic Functions
71118
-/

0 commit comments

Comments
 (0)