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

Complex.Hadamard.divisorComplementCanonicalProduct_ne_zero_at

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.DivisorQuotientConvergence · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/DivisorQuotientConvergence.lean:312 to 431

Mathematical statement

Exact Lean statement

theorem divisorComplementCanonicalProduct_ne_zero_at
    (m : ℕ) (f : ℂ → ℂ) (z₀ : ℂ)
    (h_sum : Summable (fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>
      ‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1))) :
    divisorComplementCanonicalProduct m f z₀ z₀ ≠ 0

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem divisorComplementCanonicalProduct_ne_zero_at    (m : ) (f : ℂ  ℂ) (z₀ : ℂ)    (h_sum : Summable (fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>      ‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1))) :    divisorComplementCanonicalProduct m f z₀ z₀  0 := by  let Φ : divisorZeroIndex₀ f (Set.univ : Set ℂ) :=    fun p => if divisorZeroIndex₀_val p = z₀ then (1 : ℂ)      else weierstrassFactor m (z₀ / divisorZeroIndex₀_val p)  let a : divisorZeroIndex₀ f (Set.univ : Set ℂ) := fun p => Φ p - 1  have hΦ_ne :  p, Φ p  0 := by    intro p    by_cases hp : divisorZeroIndex₀_val p = z₀    · simp [Φ, hp]    · have hval : divisorZeroIndex₀_val p  z₀ := hp      have hz : z₀ / divisorZeroIndex₀_val p  (1 : ℂ) := by        intro h        by_cases hp0 : divisorZeroIndex₀_val p = 0        · have : z₀ / divisorZeroIndex₀_val p = (0 : ℂ) := by simp [hp0]          have h01 := h          rw [this] at h01          exact (show False from (by simpa using (show (0 : ℂ)  (1 : ℂ) from by simp) h01))        · have : z₀ = divisorZeroIndex₀_val p := (div_eq_one_iff_eq hp0).1 h          exact hval this.symm      have hE : weierstrassFactor m (z₀ / divisorZeroIndex₀_val p)  0 := by        intro h0        have : z₀ / divisorZeroIndex₀_val p = (1 : ℂ) :=          (weierstrassFactor_eq_zero_iff (m := m) (z := z₀ / divisorZeroIndex₀_val p)).1 h0        exact hz this      simp [Φ, hp, hE]  have hz0_le : ‖z₀‖  max ‖z₀‖ 1 := le_max_left _ _  set R :  := max ‖z₀‖ 1  have hRpos : 0 < R := lt_of_lt_of_le (by norm_num : (0 : ) < 1) (le_max_right _ _)  let u : divisorZeroIndex₀ f (Set.univ : Set ℂ)   :=    fun p => (4 * R ^ (m + 1)) * (‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1))  have hu : Summable u := h_sum.mul_left (4 * R ^ (m + 1))  have h_big :      ᶠ p : divisorZeroIndex₀ f (Set.univ : Set ℂ) in Filter.cofinite,        (2 * R : ) < ‖divisorZeroIndex₀_val p‖ := by    have hfin : ({p : divisorZeroIndex₀ f (Set.univ : Set ℂ) | ‖divisorZeroIndex₀_val p‖         2 * R} : Set _).Finite := by      have : Metric.closedBall (0 : ℂ) (2 * R)  (Set.univ : Set ℂ) := by simp      exact divisorZeroIndex₀_norm_le_finite (f := f) (U := (Set.univ : Set ℂ)) (B := 2 * R) this    have := hfin.eventually_cofinite_notMem    filter_upwards [this] with p hp    have : ¬ ‖divisorZeroIndex₀_val p‖  2 * R := by simpa using hp    exact lt_of_not_ge this  have hBound :      ᶠ p in Filter.cofinite, ‖a p‖  u p := by    filter_upwards [h_big] with p hp    have ha_pos : 0 < ‖divisorZeroIndex₀_val p‖ := lt_trans (by nlinarith [hRpos]) hp    have hz_div : ‖z₀ / divisorZeroIndex₀_val p‖  (1 / 2 : ) := by      have h2R_pos : 0 < (2 * R : ) := by nlinarith [hRpos]      have hinv : ‖divisorZeroIndex₀_val p‖⁻¹ < (2 * R)⁻¹ := by        simpa [one_div] using (one_div_lt_one_div_of_lt h2R_pos hp)      have hmul_le : ‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹  R * ‖divisorZeroIndex₀_val p‖⁻¹ := by        refine mul_le_mul_of_nonneg_right ?_ (inv_nonneg.2 (norm_nonneg _))        exact hz0_le      have hmul_lt : R * ‖divisorZeroIndex₀_val p‖⁻¹ < R * (2 * R)⁻¹ :=        mul_lt_mul_of_pos_left hinv hRpos      have hlt : ‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹ < R * (2 * R)⁻¹ :=        lt_of_le_of_lt hmul_le hmul_lt      have hRhalf : R * (2 * R)⁻¹ = (1 / 2 : ) := by        have hRne : (R : )  0 := hRpos.ne'        have : R * (2 * R)⁻¹ = R / (2 * R) := by simp [div_eq_mul_inv]        rw [this]        field_simp [hRne]      have hnorm : ‖z₀ / divisorZeroIndex₀_val p‖ = ‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹ := by        simp [div_eq_mul_inv]      have hzlt : ‖z₀ / divisorZeroIndex₀_val p‖ < (1 / 2 : ) := by        calc          ‖z₀ / divisorZeroIndex₀_val p‖ = ‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹ := hnorm          _ < R * (2 * R)⁻¹ := hlt          _ = (1 / 2 : ) := hRhalf      exact le_of_lt hzlt    have hE :        ‖weierstrassFactor m (z₀ / divisorZeroIndex₀_val p) - 1          4 * ‖z₀ / divisorZeroIndex₀_val p‖ ^ (m + 1) :=      weierstrassFactor_sub_one_pow_bound (m := m) (z := z₀ / divisorZeroIndex₀_val p) hz_div    have hz_pow :        ‖z₀ / divisorZeroIndex₀_val p‖ ^ (m + 1)           (R ^ (m + 1)) * (‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1)) := by      have : ‖z₀ / divisorZeroIndex₀_val p‖ = ‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹ := by        simp [div_eq_mul_inv]      rw [this]      have : (‖z₀‖ * ‖divisorZeroIndex₀_val p‖⁻¹) ^ (m + 1) =          ‖z₀‖ ^ (m + 1) * (‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1)) := by        simp [mul_pow]      rw [this]      have hzle_pow : ‖z₀‖ ^ (m + 1)  R ^ (m + 1) :=        pow_le_pow_left₀ (norm_nonneg z₀) hz0_le (m + 1)      gcongr    have hp_ne : divisorZeroIndex₀_val p  z₀ := by      intro h      have : ‖divisorZeroIndex₀_val p‖  R := by        simp [h, R]  -- `‖z₀‖ ≤ max ‖z₀‖ 1`      exact (not_lt_of_ge this) (lt_trans (by nlinarith [hRpos]) hp)    have ha : ‖a p‖ = ‖weierstrassFactor m (z₀ / divisorZeroIndex₀_val p) - 1:= by      simp [a, Φ, hp_ne, sub_eq_add_neg]    calc      ‖a p‖ = ‖weierstrassFactor m (z₀ / divisorZeroIndex₀_val p) - 1:= ha      _  4 * ‖z₀ / divisorZeroIndex₀_val p‖ ^ (m + 1) := by            simpa [sub_eq_add_neg, add_comm] using hE      _  4 * (R ^ (m + 1) * (‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1))) := by            gcongr      _ = u p := by            simp [u, mul_assoc, mul_comm]  have hsum_norm : Summable (fun p => ‖a p‖) := by    refine (Summable.of_norm_bounded_eventually (E := ) (f := fun p => ‖a p‖) (g := u) hu ?_)    filter_upwards [hBound] with p hp    simpa [Real.norm_eq_abs, abs_of_nonneg (norm_nonneg (a p))] using hp  have htprod_ne :      (∏' p : divisorZeroIndex₀ f (Set.univ : Set ℂ), (1 + a p))  0 :=    tprod_one_add_ne_zero_of_summable (R := ℂ) (f := a) (hf := fun p => by      simpa [a, Φ, add_sub_cancel] using hΦ_ne p) hsum_norm  have : (∏' p : divisorZeroIndex₀ f (Set.univ : Set ℂ), (1 + a p)) =      divisorComplementCanonicalProduct m f z₀ z₀ := by    simp [a, Φ, divisorComplementCanonicalProduct, divisorComplementFactor_def]  exact by    intro h0    exact htprod_ne (by simpa [this] using h0)