|
1 | 1 | /-
|
2 | 2 | Copyright (c) 2024 David Loeffler. All rights reserved.
|
3 | 3 | Released under Apache 2.0 license as described in the file LICENSE.
|
4 |
| -Authors: David Loeffler |
| 4 | +Authors: David Loeffler, Stefan Kebekus |
5 | 5 | -/
|
6 | 6 | import Mathlib.Analysis.Analytic.IsolatedZeros
|
7 | 7 | import Mathlib.Algebra.Order.AddGroupWithTop
|
@@ -35,6 +35,23 @@ lemma AnalyticAt.meromorphicAt {f : 𝕜 → E} {x : 𝕜} (hf : AnalyticAt 𝕜
|
35 | 35 | MeromorphicAt f x :=
|
36 | 36 | ⟨0, by simpa only [pow_zero, one_smul]⟩
|
37 | 37 |
|
| 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 | + |
38 | 55 | namespace MeromorphicAt
|
39 | 56 |
|
40 | 57 | lemma id (x : 𝕜) : MeromorphicAt id x := analyticAt_id.meromorphicAt
|
@@ -334,6 +351,82 @@ lemma id {U : Set 𝕜} : MeromorphicOn id U := fun x _ ↦ .id x
|
334 | 351 | lemma const (e : E) {U : Set 𝕜} : MeromorphicOn (fun _ ↦ e) U :=
|
335 | 352 | fun x _ ↦ .const e x
|
336 | 353 |
|
| 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 | + |
337 | 430 | section arithmetic
|
338 | 431 |
|
339 | 432 | include hf in
|
|
0 commit comments