Skip to content

Commit 65ada59

Browse files
committed
feat: add simple congruence lemmata for meromorphicity and value distribution theory (#34302)
Add simple congruence lemmas for meromorphicity and the main functions of Value Distribution Theory. Remove unnecessary assumption from `divisor_congr_codiscreteWithin`. Minor golfing.
1 parent be6dc76 commit 65ada59

File tree

5 files changed

+102
-28
lines changed

5 files changed

+102
-28
lines changed

Mathlib/Analysis/Complex/ValueDistribution/CharacteristicFunction.lean

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ Approximation*][MR3156076] for a detailed discussion.
3333

3434
@[expose] public section
3535

36-
open Metric Real Set
36+
open Filter Metric Real Set
3737

3838
namespace ValueDistribution
3939

4040
variable
4141
{E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E]
42-
{f : ℂ → E} {a : WithTop E}
42+
{f g : ℂ → E} {a : WithTop E}
4343

4444
variable (f a) in
4545
/--
@@ -56,6 +56,14 @@ noncomputable def characteristic : ℝ → ℝ := proximity f a + logCounting f
5656
## Elementary Properties
5757
-/
5858

59+
/--
60+
If two functions differ only on a discrete set, then their characteristic functions agree, except
61+
perhaps at radius 0.
62+
-/
63+
theorem characteristic_congr_codiscrete {r : ℝ} (hfg : f =ᶠ[codiscrete ℂ] g) (hr : r ≠ 0) :
64+
characteristic f a r = characteristic g a r := by
65+
simp [characteristic, proximity_congr_codiscrete hfg hr, logCounting_congr_codiscrete hfg]
66+
5967
/--
6068
The difference between the characteristic functions for the poles of `f` and `f - const` simplifies
6169
to the difference between the proximity functions.
@@ -68,20 +76,20 @@ lemma characteristic_sub_characteristic_eq_proximity_sub_proximity (h : Meromorp
6876
/--
6977
The characteristic function is even.
7078
-/
71-
theorem characteristic_even {a : WithTop E} :
79+
theorem characteristic_even :
7280
(characteristic f a).Even := proximity_even.add logCounting_even
7381

7482
/--
7583
For `1 ≤ r`, the characteristic function is non-negative.
7684
-/
77-
theorem characteristic_nonneg {r : ℝ} {a : WithTop E} (hr : 1 ≤ r) :
85+
theorem characteristic_nonneg {r : ℝ} (hr : 1 ≤ r) :
7886
0 ≤ characteristic f a r :=
7987
add_nonneg (proximity_nonneg r) (logCounting_nonneg hr)
8088

8189
/--
8290
The characteristic function is asymptotically non-negative.
8391
-/
84-
theorem characteristic_eventually_nonneg {f : ℂ → ℂ} {a : WithTop ℂ} :
92+
theorem characteristic_eventually_nonneg :
8593
0 ≤ᶠ[Filter.atTop] characteristic f a := by
8694
filter_upwards [Filter.eventually_ge_atTop 1] using fun _ hr ↦ by simp [characteristic_nonneg hr]
8795

Mathlib/Analysis/Complex/ValueDistribution/LogCounting/Basic.lean

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Approximation*][MR3156076] for a detailed discussion.
4040

4141
@[expose] public section
4242

43-
open Function MeromorphicOn Metric Real Set
43+
open Filter Function MeromorphicOn Metric Real Set
4444

4545
/-!
4646
## Supporting Notation
@@ -337,6 +337,22 @@ theorem logCounting_eventually_nonneg {f : 𝕜 → E} {e : WithTop E} :
337337
## Elementary Properties of the Logarithmic Counting Function
338338
-/
339339

340+
/--
341+
If two functions differ only on a discrete set, then their logarithmic counting
342+
functions agree.
343+
-/
344+
theorem logCounting_congr_codiscrete [NormedSpace ℂ E] {f g : ℂ → E} (hfg : f =ᶠ[codiscrete ℂ] g) :
345+
logCounting f = logCounting g := by
346+
ext a : 1
347+
by_cases h : a = ⊤
348+
· simp only [logCounting, h, ↓reduceDIte]
349+
congr 2
350+
exact divisor_congr_codiscreteWithin hfg isOpen_univ
351+
· simp only [logCounting, h, ↓reduceDIte]
352+
congr 2
353+
apply divisor_congr_codiscreteWithin _ isOpen_univ
354+
filter_upwards [hfg] using by simp
355+
340356
/--
341357
Relation between the logarithmic counting functions of `f` and of `f⁻¹`.
342358
-/

Mathlib/Analysis/Complex/ValueDistribution/Proximity/Basic.lean

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Approximation*][MR3156076] for a detailed discussion.
2828

2929
@[expose] public section
3030

31-
open Metric Real Set
31+
open Filter Metric Real Set
3232

3333
namespace ValueDistribution
3434

@@ -81,6 +81,28 @@ lemma proximity_top : proximity f ⊤ = circleAverage (log⁺ ‖f ·‖) 0 := b
8181
## Elementary Properties of the Proximity Function
8282
-/
8383

84+
/--
85+
If two functions differ only on a discrete set, then their proximity functions
86+
agree, except perhaps at radius 0.
87+
-/
88+
lemma proximity_congr_codiscreteWithin {f g : ℂ → E} {a : WithTop E} {r : ℝ}
89+
(hfg : f =ᶠ[codiscreteWithin (sphere 0 |r|)] g) (hr : r ≠ 0) :
90+
proximity f a r = proximity g a r := by
91+
by_cases h : a = ⊤
92+
all_goals
93+
simp only [proximity, h, ↓reduceDIte]
94+
apply circleAverage_congr_codiscreteWithin _ hr
95+
filter_upwards [hfg] using by aesop
96+
97+
/--
98+
If two functions differ only on a discrete set, then their proximity functions
99+
agree, except perhaps at radius 0.
100+
-/
101+
lemma proximity_congr_codiscrete {f g : ℂ → E} {a : WithTop E} {r : ℝ}
102+
(hfg : f =ᶠ[codiscrete ℂ] g) (hr : r ≠ 0) :
103+
proximity f a r = proximity g a r :=
104+
proximity_congr_codiscreteWithin (hfg.filter_mono (codiscreteWithin.mono (by tauto))) hr
105+
84106
/--
85107
For finite values `a₀`, the proximity function `proximity f a₀` equals the proximity function for
86108
the value zero of the shifted function `f - a₀`.
@@ -126,6 +148,10 @@ theorem proximity_nonneg {a : WithTop E} :
126148
· intro r
127149
simpa [proximity, h] using circleAverage_nonneg_of_nonneg (fun x _ ↦ posLog_nonneg)
128150

151+
@[simp] lemma proximity_const {c : E} {r : ℝ} :
152+
proximity (fun _ ↦ c) ⊤ r = log⁺ ‖c‖ := by
153+
simp [proximity, circleAverage_const]
154+
129155
/-!
130156
## Behaviour under Arithmetic Operations
131157
-/

Mathlib/Analysis/Meromorphic/Basic.lean

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,15 @@ theorem congr_codiscreteWithin (hf : MeromorphicOn f U) (h₁ : f =ᶠ[codiscret
466466
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and] at h₂a
467467
tauto
468468

469+
/--
470+
If two functions differ only on a discrete set of an open, then one is meromorphic iff so is the
471+
other.
472+
-/
473+
theorem _root_.meromorphicOn_congr_codiscreteWithin {f g : 𝕜 → E} (h₁ : f =ᶠ[codiscreteWithin U] g)
474+
(h₂ : IsOpen U) :
475+
MeromorphicOn f U ↔ MeromorphicOn g U :=
476+
⟨(·.congr_codiscreteWithin h₁ h₂), (·.congr_codiscreteWithin h₁.symm h₂)⟩
477+
469478
lemma id {U : Set 𝕜} : MeromorphicOn id U := fun x _ ↦ .id x
470479

471480
lemma const (e : E) {U : Set 𝕜} : MeromorphicOn (fun _ ↦ e) U :=
@@ -651,6 +660,21 @@ protected lemma deriv [CompleteSpace E] (hf : Meromorphic f) : Meromorphic (deri
651660
lemma iterated_deriv [CompleteSpace E] {n : ℕ} (hf : Meromorphic f) :
652661
Meromorphic (deriv^[n] f) := fun x ↦ (hf x).iterated_deriv
653662

663+
/--
664+
If `f` is meromorphic, if `g` agrees with `f` on a codiscrete set, then `g` is also meromorphic.
665+
-/
666+
theorem congr_codiscrete (hf : Meromorphic f) (h₁ : f =ᶠ[codiscrete 𝕜] g) :
667+
Meromorphic g := by
668+
rw [← meromorphicOn_univ] at *
669+
exact hf.congr_codiscreteWithin (eventuallyEq_of_mem h₁ fun ⦃x⦄ a ↦ a) isOpen_univ
670+
671+
/--
672+
If two functions differ only on a discrete set, then one is meromorphic iff so is the other.
673+
-/
674+
theorem _root_.meromorphic_congr_codiscrete (h₁ : f =ᶠ[codiscrete 𝕜] g) :
675+
Meromorphic f ↔ Meromorphic g :=
676+
⟨(·.congr_codiscrete h₁), (·.congr_codiscrete h₁.symm)⟩
677+
654678
/--
655679
The singular set of a meromorphic function is countable.
656680
-/

Mathlib/Analysis/Meromorphic/Divisor.lean

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,41 +76,41 @@ If `f₁` is meromorphic on `U`, if `f₂` agrees with `f₁` on a codiscrete su
7676
`U`, then `f₁` and `f₂` induce the same divisors on `U`.
7777
-/
7878
theorem divisor_congr_codiscreteWithin_of_eqOn_compl {f₁ f₂ : 𝕜 → E} (hf₁ : MeromorphicOn f₁ U)
79-
(h₁ : f₁ =ᶠ[Filter.codiscreteWithin U] f₂) (h₂ : Set.EqOn f₁ f₂ Uᶜ) :
79+
(h₁ : f₁ =ᶠ[codiscreteWithin U] f₂) (h₂ : Set.EqOn f₁ f₂ Uᶜ) :
8080
divisor f₁ U = divisor f₂ U := by
8181
ext x
8282
by_cases hx : x ∈ U
8383
· simp only [hf₁, hx, divisor_apply, hf₁.congr_codiscreteWithin_of_eqOn_compl h₁ h₂]
8484
congr 1
8585
apply meromorphicOrderAt_congr
86-
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
87-
disjoint_principal_right] at h₁
86+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin, disjoint_principal_right] at h₁
8887
filter_upwards [h₁ x hx] with a ha
8988
simp at ha
9089
tauto
9190
· simp [hx]
9291

9392
/--
94-
If `f₁` is meromorphic on an open set `U`, if `f₂` agrees with `f₁` on a codiscrete subset of `U`,
95-
then `f₁` and `f₂` induce the same divisors on `U`.
93+
If two functions differ only on a discrete set of an open, then they induce the same divisors.
9694
-/
97-
theorem divisor_congr_codiscreteWithin {f₁ f₂ : 𝕜 → E} (hf₁ : MeromorphicOn f₁ U)
98-
(h₁ : f₁ =ᶠ[Filter.codiscreteWithin U] f₂) (h₂ : IsOpen U) :
95+
theorem divisor_congr_codiscreteWithin {f₁ f₂ : 𝕜 → E} (h₁ : f₁ =ᶠ[codiscreteWithin U] f₂)
96+
(h₂ : IsOpen U) :
9997
divisor f₁ U = divisor f₂ U := by
100-
ext x
101-
by_cases hx : x ∈ U
102-
· simp only [hf₁, hx, divisor_apply, hf₁.congr_codiscreteWithin h₁ h₂]
103-
congr 1
104-
apply meromorphicOrderAt_congr
105-
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
106-
disjoint_principal_right] at h₁
107-
have : U ∈ 𝓝[≠] x := by
108-
apply mem_nhdsWithin.mpr
109-
use U, h₂, hx, Set.inter_subset_left
110-
filter_upwards [this, h₁ x hx] with a h₁a h₂a
111-
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and] at h₂a
112-
tauto
113-
· simp [hx]
98+
by_cases hf₁ : MeromorphicOn f₁ U
99+
· ext x
100+
by_cases hx : x ∈ U
101+
· simp only [hf₁, hx, divisor_apply, hf₁.congr_codiscreteWithin h₁ h₂]
102+
congr 1
103+
apply meromorphicOrderAt_congr
104+
simp_rw [EventuallyEq, Filter.Eventually, mem_codiscreteWithin,
105+
disjoint_principal_right] at h₁
106+
have : U ∈ 𝓝[≠] x := by
107+
apply mem_nhdsWithin.mpr
108+
use U, h₂, hx, Set.inter_subset_left
109+
filter_upwards [this, h₁ x hx] with a h₁a h₂a
110+
simp only [Set.mem_compl_iff, Set.mem_diff, Set.mem_setOf_eq, not_and] at h₂a
111+
tauto
112+
· simp [hx]
113+
· simp [divisor, hf₁, (meromorphicOn_congr_codiscreteWithin h₁ h₂).not.1 hf₁]
114114

115115
/-!
116116
## Divisors of Analytic Functions

0 commit comments

Comments
 (0)