Skip to main content
AlexKontorovich/PrimeNumberTheoremAnd
Source indexedlemma · leanprover/lean4:v4.32.0

Complex.Hadamard.exists_r0_le_norm_divisorZeroIndex₀_val

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.HadamardFactorization.Summability · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/HadamardFactorization/Summability.lean:109 to 227

Mathematical statement

Exact Lean statement

lemma exists_r0_le_norm_divisorZeroIndex₀_val {f : ℂ → ℂ}
    (hf : Differentiable ℂ f) (hnot : ∃ z : ℂ, f z ≠ 0) :
    ∃ r0 : ℝ, 0 < r0 ∧
      ∀ p : divisorZeroIndex₀ f (Set.univ : Set ℂ), r0 ≤ ‖divisorZeroIndex₀_val p‖

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
lemma exists_r0_le_norm_divisorZeroIndex₀_val {f : ℂ  ℂ}    (hf : Differentiable ℂ f) (hnot :  z : ℂ, f z  0) :     r0 : , 0 < r0        p : divisorZeroIndex₀ f (Set.univ : Set ℂ), r0  ‖divisorZeroIndex₀_val p‖ := by  classical  set U : Set:= (Set.univ : Set ℂ)  set D : Function.locallyFinsuppWithin U  := MeromorphicOn.divisor f U  have hDnonneg : 0  D := by    simpa [D, U] using (Differentiable.divisor_nonneg (f := f) hf)  have hzero :  p : divisorZeroIndex₀ f U, f (divisorZeroIndex₀_val p) = 0 := by    intro p    set z : ℂ := divisorZeroIndex₀_val p    have hneTop : meromorphicOrderAt f z := by      have hzAnal : AnalyticAt ℂ f z := hf.analyticAt z      have hzA : analyticOrderAt f z :=        analyticOrderAt_ne_top_of_exists_ne_zero (f := f) (hf := hf) hnot (z := z)      intro htop      have hm : meromorphicOrderAt f z = (analyticOrderAt f z).map (↑) :=        hzAnal.meromorphicOrderAt_eq (𝕜 := ℂ)      cases h : analyticOrderAt f z with      | top =>          exact hzA (by simp [h])      | coe n =>          have : (analyticOrderAt f z).map (↑)  (⊤ : WithTop ) := by            simp [h]          exact this (by simpa [hm] using htop)    have hmon : MeromorphicOn f U := by      intro w hw; exact (hf.analyticAt w).meromorphicAt    have hdiv : MeromorphicOn.divisor f U z = (meromorphicOrderAt f z).untop₀ := by      simpa [U] using (MeromorphicOn.divisor_apply (f := f) (U := U) (z := z) hmon (by aesop))    have hDz : MeromorphicOn.divisor f U z  0 := by      have hzsup : z  (MeromorphicOn.divisor f U).support := by        simp [z]      simpa [Function.mem_support] using hzsup    have hposZ : (0 : ) < (meromorphicOrderAt f z).untop₀ := by      have hge0 : 0  (meromorphicOrderAt f z).untop₀ := by        have : 0  MeromorphicOn.divisor f U z := by          simpa [D, U, z] using hDnonneg z        simpa [hdiv] using this      have hne0 : (meromorphicOrderAt f z).untop₀  0 := by        simpa [hdiv] using hDz      exact lt_of_le_of_ne hge0 (by simpa [eq_comm] using hne0)    have hpos : (0 : WithTop ) < meromorphicOrderAt f z := by      have : (0 : WithTop ) < ((meromorphicOrderAt f z).untop₀ : WithTop ) :=        WithTop.coe_lt_coe.2 hposZ      simpa [WithTop.coe_untop₀_of_ne_top hneTop] using this    have htend0 : Tendsto f (𝓝[] z) (𝓝 (0 : ℂ)) :=      tendsto_zero_of_meromorphicOrderAt_pos (f := f) (x := z) hpos    have hcontz : ContinuousAt f z := (hf z).continuousAt    have htendz : Tendsto f (𝓝[] z) (𝓝 (f z)) :=      (hcontz.tendsto.mono_left (nhdsWithin_le_nhds : 𝓝[] z  𝓝 z))    exact tendsto_nhds_unique htendz htend0  by_cases h0 : f 0 = 0  · have hD0 : D 0  0 := by      have hmero0 : MeromorphicAt f (0 : ℂ) := (hf.analyticAt 0).meromorphicAt      have hneTop0 : meromorphicOrderAt f (0 : ℂ) := by        have hA0 : analyticOrderAt f (0 : ℂ) :=          analyticOrderAt_ne_top_of_exists_ne_zero (f := f) (hf := hf) hnot (z := 0)        intro htop        have hm : meromorphicOrderAt f (0 : ℂ) = (analyticOrderAt f (0 : ℂ)).map (↑) :=          (hf.analyticAt 0).meromorphicOrderAt_eq (𝕜 := ℂ)        cases h : analyticOrderAt f (0 : ℂ) with        | top => exact Ne.elim hA0 h        | coe n =>            have : (analyticOrderAt f (0 : ℂ)).map (↑)  (⊤ : WithTop ) := by              simp [h]            exact this (by simpa [hm] using htop)      have htend0 : Tendsto f (𝓝[] (0 : ℂ)) (𝓝 (0 : ℂ)) := by        have hcont0 : ContinuousAt f (0 : ℂ) := (hf 0).continuousAt        have : Tendsto f (𝓝 (0 : ℂ)) (𝓝 (0 : ℂ)) := by simpa [h0] using hcont0.tendsto        exact this.mono_left (nhdsWithin_le_nhds : 𝓝[] (0 : ℂ)  𝓝 (0 : ℂ))      have hpos0 : (0 : WithTop ) < meromorphicOrderAt f (0 : ℂ) :=        (tendsto_zero_iff_meromorphicOrderAt_pos hmero0).1 htend0      have hpos0' : (0 : ) < (meromorphicOrderAt f (0 : ℂ)).untop₀ := by        have : (0 : WithTop ) < ((meromorphicOrderAt f (0 : ℂ)).untop₀ : WithTop ) := by          simpa [WithTop.coe_untop₀_of_ne_top hneTop0] using hpos0        simpa using (WithTop.coe_lt_coe.1 this)      have hdiv0 : D 0 = (meromorphicOrderAt f (0 : ℂ)).untop₀ := by        have hmon : MeromorphicOn f U := by          intro w hw; exact (hf.analyticAt w).meromorphicAt        simpa [D, U] using          (MeromorphicOn.divisor_apply (f := f) (U := U) (z := (0 : ℂ))            hmon (by aesop))      exact by        have : (meromorphicOrderAt f (0 : ℂ)).untop₀  0 := ne_of_gt hpos0'        simpa [hdiv0] using this    have hmem0 : (0 : ℂ)  D.support := by      simp [Function.mem_support, hD0]    have hdisc : IsDiscrete D.support := by      simpa [D] using (D.discreteSupport)    rcases Metric.exists_ball_inter_eq_singleton_of_mem_discrete hdisc hmem0 with r0, hr0pos, hr0    refine r0, hr0pos, ?_    intro p    have hp : divisorZeroIndex₀_val p  D.support := by      simp [D, divisorZeroIndex₀_val_mem_divisor_support (f := f) (U := U) p]    have hnotBall : divisorZeroIndex₀_val p  Metric.ball (0 : ℂ) r0 := by      intro hball      have : divisorZeroIndex₀_val p  Metric.ball (0 : ℂ) r0 ∩ D.support := hball, hp      have : divisorZeroIndex₀_val p  ({(0 : ℂ)} : Set ℂ) := by simp [hr0] at this      have : divisorZeroIndex₀_val p = 0 := by simp [Set.mem_singleton_iff] at this      exact (divisorZeroIndex₀_val_ne_zero p) this    have : r0  ‖divisorZeroIndex₀_val p‖ := by      have : ¬ ‖divisorZeroIndex₀_val p‖ < r0 := by        intro hlt        exact hnotBall (by simpa [Metric.mem_ball, dist_zero_right] using hlt)      exact le_of_not_gt this    exact this  · have hcont0 : ContinuousAt f (0 : ℂ) := (hf 0).continuousAt    have hne : ᶠ z in 𝓝 (0 : ℂ), f z  0 := hcont0.eventually_ne h0    rcases Metric.mem_nhds_iff.1 hne with r0, hr0pos, hr0    refine r0, hr0pos, ?_    intro p    have : ¬ ‖divisorZeroIndex₀_val p‖ < r0 := by      intro hlt      have hzball : divisorZeroIndex₀_val p  Metric.ball (0 : ℂ) r0 := by        simpa [Metric.mem_ball, dist_zero_right] using hlt      have : f (divisorZeroIndex₀_val p)  0 := hr0 hzball      exact this (hzero p)    exact le_of_not_gt this