Skip to content

Commit 9a16aa5

Browse files
feat: asymptotics of the logCounting function of Value Distribution Theory (leanprover-community#35767)
If `f` is meromorphic over a field `𝕜`, show that the logarithmic counting function for the poles of `f` is asymptotically bounded if and only if `f` has only removable singularities. Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent c326498 commit 9a16aa5

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,6 +1782,7 @@ public import Mathlib.Analysis.Complex.UpperHalfPlane.MoebiusAction
17821782
public import Mathlib.Analysis.Complex.UpperHalfPlane.Topology
17831783
public import Mathlib.Analysis.Complex.ValueDistribution.CharacteristicFunction
17841784
public import Mathlib.Analysis.Complex.ValueDistribution.FirstMainTheorem
1785+
public import Mathlib.Analysis.Complex.ValueDistribution.LogCounting.Asymptotic
17851786
public import Mathlib.Analysis.Complex.ValueDistribution.LogCounting.Basic
17861787
public import Mathlib.Analysis.Complex.ValueDistribution.Proximity.Basic
17871788
public import Mathlib.Analysis.ConstantSpeed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/-
2+
Copyright (c) 2026 Stefan Kebekus. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Stefan Kebekus
5+
-/
6+
module
7+
8+
public import Mathlib.Analysis.Complex.ValueDistribution.LogCounting.Basic
9+
10+
/-!
11+
# Asymptotic Behavior of the Logarithmic Counting Function
12+
13+
If `f` is meromorphic over a field `𝕜`, we show that the logarithmic counting function for the
14+
poles of `f` is asymptotically bounded if and only if `f` has only removable singularities. See
15+
Page 170f of [Lang, *Introduction to Complex Hyperbolic Spaces*][MR886677] for a detailed
16+
discussion.
17+
18+
## Implementation Notes
19+
20+
We establish the result first for the logarithmic counting function for functions with locally
21+
finite support on `𝕜` and then specialize to the setting where the function with locally finite
22+
support is the pole or zero-divisor of a meromorphic function.
23+
24+
## TODO
25+
26+
Establish the analogous characterization of meromorphic functions with finite set of poles, as
27+
functions whose logarithmic counting function is big-O of `log`.
28+
-/
29+
30+
@[expose] public section
31+
32+
open Asymptotics Filter Function Real Set
33+
34+
namespace Function.locallyFinsuppWithin
35+
36+
variable
37+
{E : Type*} [NormedAddCommGroup E]
38+
39+
/-!
40+
## Logarithmic Counting Functions for Functions with Locally Finite Support
41+
-/
42+
43+
/--
44+
Qualitative consequence of `logCounting_single_eq_log_sub_const`. The constant function `1 : ℝ → ℝ`
45+
is little o of the logarithmic counting function attached to `single e`.
46+
-/
47+
lemma one_isLittleO_logCounting_single [DecidableEq E] [ProperSpace E] {e : E} :
48+
(1 : ℝ → ℝ) =o[atTop] logCounting (single e 1) := by
49+
rw [isLittleO_iff]
50+
intro c hc
51+
simp only [Pi.one_apply, norm_eq_abs, eventually_atTop, abs_one]
52+
use exp (|log ‖e‖| + c⁻¹)
53+
intro b hb
54+
have h₁b : 1 ≤ b := by
55+
calc 1
56+
_ ≤ exp (|log ‖e‖| + c⁻¹) := one_le_exp (by positivity)
57+
_ ≤ b := hb
58+
have h₁c : ‖e‖ ≤ exp (|log ‖e‖| + c⁻¹) := by
59+
calc ‖e‖
60+
_ ≤ exp (log ‖e‖) := le_exp_log ‖e‖
61+
_ ≤ exp (|log ‖e‖| + c⁻¹) :=
62+
exp_monotone (le_add_of_le_of_nonneg (le_abs_self _) (inv_pos.2 hc).le)
63+
rw [← inv_mul_le_iff₀ hc, mul_one, abs_of_nonneg (logCounting_nonneg
64+
(single_pos.2 Int.one_pos).le h₁b)]
65+
calc c⁻¹
66+
_ ≤ logCounting (single e 1) (exp (|log ‖e‖| + c⁻¹)) := by
67+
simp [logCounting_single_eq_log_sub_const h₁c, le_sub_iff_add_le', le_abs_self (log ‖e‖)]
68+
_ ≤ logCounting (single e 1) b := by
69+
apply logCounting_mono (single_pos.2 Int.one_pos).le (mem_Ioi.2 (exp_pos _)) _ hb
70+
simpa [mem_Ioi] using one_pos.trans_le h₁b
71+
72+
/--
73+
A non-negative function with locally finite support is zero if and only if its logarithmic counting
74+
functions is asymptotically bounded.
75+
-/
76+
lemma zero_iff_logCounting_bounded [ProperSpace E]
77+
{D : locallyFinsuppWithin (univ : Set E) ℤ} (h : 0 ≤ D) :
78+
D = 0 ↔ logCounting D =O[atTop] (1 : ℝ → ℝ) := by
79+
classical
80+
refine ⟨fun h₂ ↦ by simp [isBigO_of_le' (c := 0), h₂], ?_⟩
81+
contrapose
82+
intro h₁
83+
obtain ⟨e, he⟩ := exists_single_le_pos (lt_of_le_of_ne h (h₁ ·.symm))
84+
rw [isBigO_iff'']
85+
push_neg
86+
intro a ha
87+
simp only [Pi.one_apply, norm_eq_abs, frequently_atTop, abs_one]
88+
intro b
89+
obtain ⟨c, hc⟩ := eventually_atTop.1
90+
(isLittleO_iff.1 (one_isLittleO_logCounting_single (e := e)) ha)
91+
let ℓ := 1 + max ‖e‖ (max |b| |c|)
92+
have h₁ℓ : c ≤ ℓ := by grind
93+
have h₂ℓ : 1 ≤ ℓ := by simp [ℓ]
94+
use 1 + ℓ, (show b ≤ 1 + ℓ by grind)
95+
calc 1
96+
_ ≤ (a * |logCounting (single e 1) ℓ|) := by simpa [h₁ℓ] using hc ℓ
97+
_ ≤ (a * |logCounting D ℓ|) := by
98+
gcongr
99+
· apply logCounting_nonneg (single_pos.2 Int.one_pos).le h₂ℓ
100+
· apply logCounting_le he h₂ℓ
101+
_ < a * |logCounting D (1 + ℓ)| := by
102+
gcongr 2
103+
rw [abs_of_nonneg (logCounting_nonneg h h₂ℓ),
104+
abs_of_nonneg (logCounting_nonneg h (by grind))]
105+
apply logCounting_strictMono he <;> grind
106+
107+
end Function.locallyFinsuppWithin
108+
109+
namespace ValueDistribution
110+
111+
variable
112+
{𝕜 : Type*} [NontriviallyNormedField 𝕜] [ProperSpace 𝕜]
113+
{E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
114+
115+
/-!
116+
## Logarithmic Counting Functions for the Poles of a Meromorphic Function
117+
-/
118+
119+
/--
120+
A meromorphic function has only removable singularities if and only if the logarithmic counting
121+
function for its pole divisor is asymptotically bounded.
122+
-/
123+
theorem logCounting_isBigO_one_iff_analyticOnNhd {f : 𝕜 → E} (h : Meromorphic f) :
124+
logCounting f ⊤ =O[atTop] (1 : ℝ → ℝ) ↔ AnalyticOnNhd 𝕜 (toMeromorphicNFOn f univ) univ := by
125+
simp only [logCounting, reduceDIte]
126+
rw [← Function.locallyFinsuppWithin.zero_iff_logCounting_bounded (negPart_nonneg _)]
127+
constructor
128+
· intro h₁f z hz
129+
apply (meromorphicNFOn_toMeromorphicNFOn f univ
130+
trivial).meromorphicOrderAt_nonneg_iff_analyticAt.1
131+
rw [meromorphicOrderAt_toMeromorphicNFOn h.meromorphicOn (by trivial), ← WithTop.untop₀_nonneg,
132+
← h.meromorphicOn.divisor_apply (by trivial), ← negPart_eq_zero,
133+
← locallyFinsuppWithin.negPart_apply]
134+
aesop
135+
· intro h₁f
136+
rwa [negPart_eq_zero, ← h.meromorphicOn.divisor_of_toMeromorphicNFOn,
137+
(meromorphicNFOn_toMeromorphicNFOn _ _).divisor_nonneg_iff_analyticOnNhd]
138+
139+
end ValueDistribution

0 commit comments

Comments
 (0)