Zulip Chat Archive

Stream: maths

Topic: Roots of meromorphic function on a connected set


Daniel Weber (Jul 07 2024 at 06:35):

I want this result:

import Mathlib

variable {π•œ : Type*} [NontriviallyNormedField π•œ] {E : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E]

example (f : π•œ β†’ E) (U : Set π•œ) (hf : MeromorphicOn f U) (hu : IsConnected U) :
    IsTotallyDisconnected (U ∩ (f ⁻¹' {0})) ∨ IsTotallyDisconnected (U \ (f ⁻¹' {0})) := by
  sorry

which I can't find in Mathlib. Is docs#IsTotallyDisconnected the correct thing to use here? Are there assumptions I'm missing?

David Loeffler (Jul 07 2024 at 07:32):

We almost certainly don't have this. There is very little API for meromorphic functions at present (we have a definition but not much more). Would the version for holomorphic functions be enough for you, or do you really need meromorphic?

Daniel Weber (Jul 07 2024 at 07:35):

I want to define the field of meromorphic functions (up to equality AE) on a connected set, so I think I need this to show that division works

Daniel Weber (Jul 07 2024 at 11:22):

I managed to get

import Mathlib

variable {π•œ : Type*} [NontriviallyNormedField π•œ] {E : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E]

open MeasureTheory Filter

@[simp]
lemma not_and_and_not_self {a b : Prop} : ¬(a ∧ b ∧ ¬ a) := by
  simp only [not_and, not_not]
  exact fun a _ ↦ a

example (f : π•œ β†’ E) (U : Set π•œ) (hf : MeromorphicOn f U) (hu : IsConnected U) :
    IsTotallyDisconnected (U ∩ (f ⁻¹' {0})) ∨ IsTotallyDisconnected (U \ (f ⁻¹' {0})) := by
  by_contra! nh
  suffices βˆƒ x ∈ U, AccPt x (π“Ÿ (U ∩ (f ⁻¹' {0}))) ∧ AccPt x (π“Ÿ (U \ (f ⁻¹' {0}))) by
    obtain ⟨x, hxu, h1, h2⟩ := this
    obtain ⟨n, hn⟩ := hf x hxu
    rw [accPt_iff_nhds] at h1 h2
    rcases AnalyticAt.eventually_eq_zero_or_eventually_ne_zero hn with h | h
    Β· rw [eventually_iff] at h
      obtain ⟨y, hy1, hy2⟩ := h2 _ h
      simp_all [sub_eq_zero]
    Β· rw [eventually_iff, mem_nhdsWithin_iff_exists_mem_nhds_inter] at h
      obtain ⟨h, hn⟩ := h
      obtain ⟨y, hy1, hy2⟩ := h1 _ hn.1
      simp_all only [ne_eq, smul_eq_zero, pow_eq_zero_iff', not_or, not_and, Decidable.not_not,
        Set.mem_diff, Set.mem_inter_iff, Set.mem_preimage, Set.mem_singleton_iff]
      have : y ∈ h ∩ {x}ᢜ := by simp [*]
      apply hn.2 at this
      simp_all
  sorry

but I'm not sure how to do the topology for the last part (or if it's even true--it feels correct, but I don't know topology well).

Daniel Weber (Jul 07 2024 at 11:34):

I just realized that docs#IsTotallyDisconnected isn't what I want, how do I state that a set is discrete?

Kevin Buzzard (Jul 07 2024 at 11:35):

Right, {1/n : n in N+} union {0} is totally disconnected but not discrete.

Yakov Pechersky (Jul 07 2024 at 13:16):

Does docs#IsTotallySeparated work for you?

Daniel Weber (Jul 07 2024 at 13:18):

What I actually need is that it has measure zero, I'm not sure exactly what implies that

Kevin Buzzard (Jul 07 2024 at 13:21):

I should think that a cantor set can have positive measure and be totally separated?

Daniel Weber (Jul 07 2024 at 13:42):

Currently I'm trying to prove

import Mathlib

variable {π•œ : Type*}  [TopologicalSpace π•œ]

open Filter

example (U : Set π•œ) (hs : IsPreconnected U) (a b : Set π•œ) (h : a βˆͺ b = U)
    (ha : βˆƒ x ∈ U, AccPt x (π“Ÿ a)) (hb : βˆƒ x ∈ U, AccPt x (π“Ÿ b)) :
    βˆƒ x ∈ U, AccPt x (π“Ÿ a) ∧ AccPt x (π“Ÿ b) := by sorry

but I'm not sure if it's even true. Using docs#isPreconnected_closed_iff on the closures of a and b I can show that there's a docs#ClusterPt common to a and b, but that's not enough

EDIT: It also required T1Space π•œ, but I managed to prove this

David Loeffler (Jul 09 2024 at 11:21):

Somehow, AE-equality feels like the wrong notion here; I think it should be enough to work with equality away from a discrete closed subset (i.e. eventual equality for the filter docs#Filter.codiscrete). This has the advantage that if f and g are eventually equal along this filter, then f is meromorphic iff g is (which isn't true for ae-equality, or equality away from a totally-disconnected set).

Daniel Weber (Jul 09 2024 at 11:31):

hmm. This also lets me not talk about measures at all, right?

Daniel Weber (Jul 09 2024 at 11:42):

Do you think it makes more sense to first define a ring for all functions and have the field of meromorphic functions as a subtype of that, or should this field just be defined directly?

Kevin Buzzard (Jul 09 2024 at 12:32):

I thought that the decision was that a meromorphic function isn't a function (it's an equivalence class) but maybe I'm behind the times

Daniel Weber (Jul 09 2024 at 12:33):

Yeah, I'm taking a quotient

Kevin Buzzard (Jul 09 2024 at 13:17):

Oh I see -- you're proposing taking the quotient to make the "ring for all functions" and then making a subtype of that.

Daniel Weber (Jul 09 2024 at 13:17):

Yes, compared to directly taking a quotient on the subtype of meromorphic functions

Vincent Beffara (Jul 09 2024 at 15:26):

How about defining the field of fractions of the ring of holomorphic functions?

Daniel Weber (Jul 09 2024 at 15:43):

The benefit being that there's no need for a quotient? Showing that the ring of analytic functions form a domain would require a similar theorem, but I have already proved most prerequisites for it, so that's fine. It might be difficult to show it agrees with docs#MeromorphicOn, though

Daniel Weber (Jul 09 2024 at 16:19):

What even are the conditions on the domain and range for this to be true?

Daniel Weber (Jul 09 2024 at 16:22):

Could someone please move this to #maths , by the way?

Vincent Beffara (Jul 09 2024 at 22:12):

Daniel Weber said:

What even are the conditions on the domain and range for this to be true?

Every meromorphic functions on a open set U of the complex plane (with values in \C \cup \{\infty\}) is a quotient of two holomorphic functions on U, see e.g. Theorem 15.12 in Rudin. (It is nontrivial and uses Weierstrass factorization, which AFAIK is not in Mathlib but would be worth adding.)

Kevin Buzzard (Jul 09 2024 at 22:46):

This statement is more subtle than it might seem at first glance because when both f and g vanish at z, f/g still has a well-defined value at z, it just depends on more than f and g at z.

Daniel Weber (Jul 10 2024 at 02:19):

Vincent Beffara said:

Daniel Weber said:

What even are the conditions on the domain and range for this to be true?

Every meromorphic functions on a open set U of the complex plane (with values in \C \cup \{\infty\}) is a quotient of two holomorphic functions on U, see e.g. Theorem 15.12 in Rudin. (It is nontrivial and uses Weierstrass factorization, which AFAIK is not in Mathlib but would be worth adding.)

I know this, but is this also true for analytic functions on an open subset of R\mathbb{R}? A general normed field? I think this should be stated as generally as possible.

Daniel Weber (Jul 10 2024 at 02:21):

Kevin Buzzard said:

This statement is more subtle than it might seem at first glance because when both f and g vanish at z, f/g still has a well-defined value at z, it just depends on more than f and g at z.

In Mathlib's definition of docs#MeromorphicOn simply f/g is a meromorphic function, see docs#MeromorphicOn.div nvm, I think I misunderstood what you're saying. The statement would be that for any meromorphic h there are analytic f, g such that f/g is eventually equal to h on docs#Filter.codiscrete, I think

Kevin Buzzard (Jul 10 2024 at 06:05):

I guess what I'm saying is just covered by the assertion that in every equivalence class there is a unique holomorphic representative taking values in C union infinity.

Vincent Beffara (Jul 10 2024 at 08:22):

Daniel Weber said:

Vincent Beffara said:

Daniel Weber said:

What even are the conditions on the domain and range for this to be true?

Every meromorphic functions on a open set U of the complex plane (with values in \C \cup \{\infty\}) is a quotient of two holomorphic functions on U, see e.g. Theorem 15.12 in Rudin. (It is nontrivial and uses Weierstrass factorization, which AFAIK is not in Mathlib but would be worth adding.)

I know this, but is this also true for analytic functions on an open subset of R\mathbb{R}? A general normed field? I think this should be stated as generally as possible.

At least for an open subset of R it should extend painlessly (theorem 15.11 in Rudin asserts that given an open set U in the complex plane and a locally finite set of A with prescribed orders on it, there is a holomorphic function on U having exactly these as zeroes; if instead U is an open set of R, take V to be U union (C - R) and apply that theorem in V, I don't see anything going wrong).

The general Weierstrass product construction might work on any complete field?

Kevin Buzzard (Jul 10 2024 at 08:56):

There's a Weierstrass factorization theorem in nonarchimedean analysis; a random google gives this for example. IIRC Bosch-Guentzer-Remmert has a version which doesn't assume alg closed (there is also a Weierstrass preparation theorem etc).

Daniel Weber (Jul 15 2024 at 09:17):

I've thought about this a bit more, and I think that for the result I want to prove (e^x^2 doesn't have an elementary antiderivative) it makes more sense to define it using quotient types and later an IsFractionRing instance could be proved for it

Daniel Weber (Jul 16 2024 at 04:37):

Currently I'm doing this. Is there a nicer way to construct the Field instance?

import Mathlib.Analysis.Analytic.Meromorphic

variable {π•œ : Type*} [NontriviallyNormedField π•œ] (U : Set π•œ)

open Filter Topology

structure PreMF where
  toFun : π•œ β†’ π•œ
  meromorphicOn : MeromorphicOn toFun U

instance PreMF.setoid : Setoid (PreMF U) where
  r := fun f g ↦ f.toFun ∘ Subtype.val =αΆ [codiscrete U] g.toFun ∘ Subtype.val
  iseqv := {
    trans := EventuallyEq.trans
    refl := fun _ ↦ EventuallyEq.rfl
    symm := EventuallyEq.symm
  }

def MF := Quotient (PreMF.setoid U)

variable [Fact (IsPreconnected U)]

instance : Field (MF U) where
  zero := ⟦⟨0, MeromorphicOn.const 0⟩⟧
  one := ⟦⟨1, MeromorphicOn.const 1⟩⟧
  add := Quotient.liftβ‚‚ (fun x y ↦ ⟦⟨x.1 + y.1, x.2.add y.2⟩⟧) (fun _ _ _ _ h₁ hβ‚‚ ↦
    Quotient.sound <| Filter.EventuallyEq.add h₁ hβ‚‚)
  neg := Quotient.lift (fun x ↦ ⟦⟨-x.1, x.2.neg⟩⟧) (fun _ _ h ↦
    Quotient.sound <| Filter.EventuallyEq.neg h)
  mul := Quotient.liftβ‚‚ (fun x y ↦ ⟦⟨x.1 * y.1, x.2.mul y.2⟩⟧) (fun _ _ _ _ h₁ hβ‚‚ ↦
    Quotient.sound <| Filter.EventuallyEq.mul h₁ hβ‚‚)
  inv := Quotient.lift (fun x ↦ ⟦⟨x.1⁻¹, x.2.inv⟩⟧) (fun _ _ h ↦
    Quotient.sound <| Filter.EventuallyEq.inv h)
  add_assoc a b c := by
    induction' a using Quotient.ind with a
    induction' b using Quotient.ind with b
    induction' c using Quotient.ind with c
    change ⟦⟨a.1 + b.1 + c.1, _⟩⟧ = (⟦⟨a.1 + (b.1 + c.1), _⟩⟧ : MF U)
    congr 2
    apply add_assoc
  add_comm a b := by
    induction' a using Quotient.ind with a
    induction' b using Quotient.ind with b
    change ⟦⟨a.1 + b.1, _⟩⟧ = (⟦⟨b.1 + a.1, _⟩⟧ : MF U)
    congr 2
    apply add_comm
  zero_add a := by
    induction' a using Quotient.ind with a
    change ⟦⟨0 + a.1, _⟩⟧ = ⟦a⟧
    congr
    apply zero_add
  add_zero a := by
    induction' a using Quotient.ind with a
    change ⟦⟨a.1 + 0, _⟩⟧ = ⟦a⟧
    congr
    apply add_zero
  left_distrib a b c := by
    induction' a using Quotient.ind with a
    induction' b using Quotient.ind with b
    induction' c using Quotient.ind with c
    change ⟦⟨a.1 * (b.1 + c.1), _⟩⟧ = (⟦⟨a.1 * b.1 + a.1 * c.1, _⟩⟧ : MF U)
    congr
    apply left_distrib

Daniel Weber (Jul 17 2024 at 05:17):

Perhaps I don't need to actually work with meromorphic functions, as I can move to a region where the function is analytic. Do I need to assume that the space is locally connected to be able to do that?

Vincent Beffara (Jul 18 2024 at 12:37):

I would tend to start like this from analytic functions, likely something similar can be done in your case:

import Mathlib

variable {π•œ : Type*} [NontriviallyNormedField π•œ]
variable (U : Set π•œ) [Fact (IsOpen U)] [Fact (IsConnected U)]

def An : Subring (π•œ β†’ π•œ) where
  carrier := { f : π•œ β†’ π•œ | AnalyticOn π•œ f U }
  zero_mem' := analyticOn_const (v := 0)
  one_mem' := analyticOn_const (v := 1)
  mul_mem' := AnalyticOn.mul
  add_mem' := AnalyticOn.add
  neg_mem' := AnalyticOn.neg

def Zer : Ideal (An U) where
  carrier := { f | βˆ€ x ∈ U, f.1 x = 0 }
  zero_mem' _ _ := rfl
  add_mem' hf hg x hx := by simp [hf x hx, hg x hx]
  smul_mem' f g hg x hx := by simp [hg x hx]

instance : (Zer U).IsPrime where
  ne_top' := by
    rename_i inst ; obtain ⟨x, hx⟩ := inst.out.nonempty
    rw [Ideal.ne_top_iff_one]
    intro h1
    simpa using h1 x hx
  mem_or_mem' {f g} hfg := sorry -- this is from isolated zeros

abbrev Mero := FractionRing (An U β§Έ Zer U)

#synth Field (Mero U)

Daniel Weber (Jul 18 2024 at 13:08):

Oh, a quotient by an ideal is much nicer than constructing a relation and proving everything about a quotient of it

Antoine Chambert-Loir (Jul 18 2024 at 21:03):

Kevin Buzzard said:

)

Analytic functions of nonarchimedean analysis are not mathlib's analytic functions. For mathlib, a locally constant function on a (complete) nonarchimedean field KK is analytic, but not for Bosch-GΓΌntzer-Remmert unless it is constant.

Antoine Chambert-Loir (Jul 18 2024 at 21:05):

In the nonarchimedean setting, all β€œconnected”-like hypothesis will be almost never applicable.

Daniel Weber (Sep 21 2024 at 03:11):

Vincent Beffara said:

I would tend to start like this from analytic functions, likely something similar can be done in your case:

import Mathlib

variable {π•œ : Type*} [NontriviallyNormedField π•œ]
variable (U : Set π•œ) [Fact (IsOpen U)] [Fact (IsConnected U)]

def An : Subring (π•œ β†’ π•œ) where
  carrier := { f : π•œ β†’ π•œ | AnalyticOn π•œ f U }
  zero_mem' := analyticOn_const (v := 0)
  one_mem' := analyticOn_const (v := 1)
  mul_mem' := AnalyticOn.mul
  add_mem' := AnalyticOn.add
  neg_mem' := AnalyticOn.neg

def Zer : Ideal (An U) where
  carrier := { f | βˆ€ x ∈ U, f.1 x = 0 }
  zero_mem' _ _ := rfl
  add_mem' hf hg x hx := by simp [hf x hx, hg x hx]
  smul_mem' f g hg x hx := by simp [hg x hx]

instance : (Zer U).IsPrime where
  ne_top' := by
    rename_i inst ; obtain ⟨x, hx⟩ := inst.out.nonempty
    rw [Ideal.ne_top_iff_one]
    intro h1
    simpa using h1 x hx
  mem_or_mem' {f g} hfg := sorry -- this is from isolated zeros

abbrev Mero := FractionRing (An U β§Έ Zer U)

#synth Field (Mero U)

May I PR this to Mathlib?

Vincent Beffara (Sep 21 2024 at 07:19):

Sure, just with better naming :wink: although it might be better to first show the equivalence with the definition that is already there (I don’t remember if you have that proof already)

Daniel Weber (Sep 21 2024 at 07:25):

Definition of what? Meromorphic functions?

Vincent Beffara (Sep 21 2024 at 07:27):

Yes, docs#MeromorphicOn

Daniel Weber (Sep 21 2024 at 07:29):

That's a fairly complex proof, and since I don't need it for my project (proving that $$\erf$$ isn't elementary) I think I'm going to leave it as a TODO


Last updated: May 02 2025 at 03:31 UTC