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

ZetaNoZerosInBox

PrimeNumberTheoremAnd.ZetaBounds · PrimeNumberTheoremAnd/ZetaBounds.lean:3096 to 3219

Source documentation

Then, since ζ\zeta doesn't vanish on the 1-line, there is a σ<1\sigma<1 (depending on TT), so that the box [σ,1]×C[T,T][\sigma,1] \times_{ℂ} [-T,T] is free of zeros of ζ\zeta.

Exact Lean statement

@[blueprint
  (title := "ZetaNoZerosInBox")
  (statement := /--
  For any $T>0$, there is a constant $\sigma<1$ so that
  $$
  \zeta(\sigma'+it) \ne 0
  $$
  for all $|t| \leq T$ and $\sigma' \ge \sigma$.
  -/)
  (proof := /--
  Assume not. Then there is a sequence $|t_n| \le T$ and $\sigma_n \to 1$ so that
  $\zeta(\sigma_n + it_n) = 0$.
  By compactness, there is a subsequence $t_{n_k} \to t_0$ along which
  $\zeta(\sigma_{n_k} + it_{n_k}) = 0$.
  If $t_0\ne0$, use the continuity of $\zeta$ to get that $\zeta(1 + it_0) = 0$;
  this is a contradiction.
  If $t_0=0$, $\zeta$ blows up near $1$, so can't be zero nearby.
  -/)
  (latexEnv := "lemma")]
lemma ZetaNoZerosInBox (T : ℝ) :
    ∃ (σ : ℝ) (_ : σ < 1), ∀ (t : ℝ) (_ : |t| ≤ T)
    (σ' : ℝ) (_ : σ' ≥ σ), ζ (σ' + t * I) ≠ 0

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
@[blueprint  (title := "ZetaNoZerosInBox")  (statement := /--  For any $T>0$, there is a constant $\sigma<1$ so that  $$  \zeta(\sigma'+it) \ne 0  $$  for all $|t| \leq T$ and $\sigma' \ge \sigma$.  -/)  (proof := /--  Assume not. Then there is a sequence $|t_n| \le T$ and $\sigma_n \to 1$ so that  $\zeta(\sigma_n + it_n) = 0$.  By compactness, there is a subsequence $t_{n_k} \to t_0$ along which  $\zeta(\sigma_{n_k} + it_{n_k}) = 0$.  If $t_0\ne0$, use the continuity of $\zeta$ to get that $\zeta(1 + it_0) = 0$;  this is a contradiction.  If $t_0=0$, $\zeta$ blows up near $1$, so can't be zero nearby.  -/)  (latexEnv := "lemma")]lemma ZetaNoZerosInBox (T : ) :     (σ : ) (_ : σ < 1),  (t : ) (_ : |t|  T)    (σ' : ) (_ : σ'  σ), ζ (σ' + t * I)  0 := by  by_contra! h  have hn (n : ) := h (1 - 1 / (n + 1)) (sub_lt_self _ (by positivity))   have :  (tn :   ) (σn :   ), ( n, σn n  1)     ( n, (1 : ) - 1 / (n + 1)  σn n)  ( n, |tn n|  T)     ( n, ζ (σn n + tn n * I) = 0) := by    choose t ht σ' hσ' hζ using hn    refine t, σ', ?_, hσ', ht, hζ    intro n    by_contra! hσn    have := riemannZeta_ne_zero_of_one_lt_re (s := σ' n + t n * I)    simp only [add_re, ofReal_re, mul_re, I_re, mul_zero, ofReal_im, I_im, mul_one, sub_self,      add_zero, ne_eq] at this    exact this hσn (hζ n)   choose t σ' hσ'_le hσ'_ge ht hζ using this   have σTo1 : Filter.Tendsto σ' Filter.atTop (𝓝 1) := by    use sub_zero (1: )▸tendsto_order.2 fun A B=>? _,fun A B=>?_    · apply (((tendsto_inv_atTop_nhds_zero_nat.comp        (Filter.tendsto_add_atTop_nat (1))).congr (by norm_num)).const_sub 1).eventually_const_lt          B|>.mono (hσ'_ge ·|>.trans_lt')    · norm_num[(hσ'_le _).trans_lt, B.trans_le']   have :  (t₀ : ) (subseq :   ),      Filter.Tendsto (t ∘ subseq) Filter.atTop (𝓝 t₀)       Filter.Tendsto subseq Filter.atTop Filter.atTop := by    refine (isCompact_Icc.isSeqCompact fun and => abs_le.1 (ht and)).imp fun and x, A, B, _ => ?_    use A, by omega, B.tendsto_atTop   obtain t₀, subseq, tTendsto, subseqTendsto := this   have σTo1 : Filter.Tendsto (σ' ∘ subseq) Filter.atTop (𝓝 1) :=    σTo1.comp subseqTendsto   have (n : ) : ζ (σ' (subseq n) + I * (t (subseq n))) = 0 := by    convert hζ (subseq n) using 3    ring   have ToOneT0 : Filter.Tendsto (fun n  (σ' (subseq n) : ℂ) + Complex.I * (t (subseq n))) Filter.atTop      (𝓝[]((1 : ℂ) + I * t₀)) := by    simp_rw [tendsto_nhdsWithin_iff, Function.comp_def] at tTendsto     constructor    · exact (σTo1.ofReal.add (tTendsto.ofReal.const_mul _)).trans (by simp)    · filter_upwards with n      apply ne_of_apply_ne ζ      rw [this]      apply Ne.symm      apply riemannZeta_ne_zero_of_one_le_re      simp only [add_re, one_re, mul_re, I_re, ofReal_re, zero_mul, I_im, ofReal_im, mul_zero,        sub_self, add_zero, le_refl]   by_cases ht₀ : t₀ = 0  · have ZetaBlowsUp : ᶠ s in 𝓝[](1 : ℂ), ‖ζ s‖  1 := by      simp_all only [ge_iff_le, one_div, tsub_le_iff_right, Function.comp_def, ofReal_zero,        mul_zero, add_zero, norm_eq_sqrt_real_inner, Complex.inner, mul_re, conj_re, conj_im,        mul_neg, sub_neg_eq_add, Real.one_le_sqrt, eventually_nhdsWithin_iff, mem_compl_iff,        mem_singleton_iff]      contrapose! h      simp_all only [ne_eq]      delta abs at*      exfalso      simp_rw [Metric.nhds_basis_ball.frequently_iff]at*      choose! I A B using h      choose a s using exists_seq_strictAnti_tendsto (0: )      apply ((isCompact_closedBall _ _).isSeqCompact        fun and=>(A _ (s.2.1 and)).le.trans (s.2.2.bddAbove_range.some_mem and, rfl)).elim      simp only [Metric.mem_ball, dist_eq_norm_sub] at A      refine fun and a, H, S, M⟩=> ?_      refine absurd (tendsto_nhds_unique M (tendsto_sub_nhds_zero_iff.1        (( squeeze_zero_norm fun and=>le_of_lt (A _ (s.2.1 _) ) )          (s.2.2.comp S.tendsto_atTop)))) fun and=>?_      norm_num[*,Function.comp_def] at M      have:=@riemannZeta_residue_one      use one_ne_zero (tendsto_nhds_unique (this.comp (tendsto_nhdsWithin_iff.2         M,.of_forall (by norm_num[*]))) ( squeeze_zero_norm ?_          ((M.sub_const 1).norm.trans (by rw [sub_self,norm_zero]))))      use fun and =>.trans (norm_mul_le_of_le ↑(le_rfl) (Complex.norm_def _▸Real.sqrt_le_one.mpr        (B ↑_ (s.2.1 ↑_)).right.le)) (by rw [mul_one])     have ZetaNonZ : ᶠ s in 𝓝[](1 : ℂ), ζ s  0 := by      filter_upwards [ZetaBlowsUp]      intro s hs hfalse      rw [hfalse] at hs      simp only [norm_zero, ge_iff_le] at hs      linarith     rw [ht₀] at ToOneT0    simp only [ofReal_zero, mul_zero, add_zero] at ToOneT0    rcases (ToOneT0.eventually ZetaNonZ).exists with n, hn    exact hn (this n)   · have zetaIsZero : ζ (1 + Complex.I * t₀) = 0 := by      have cont := @ZetaCont      use isClosed_singleton.isSeqClosed        this        (.comp          (cont.continuousAt.comp (eventually_ne_nhds (by field_simp; simp [ht₀])).mono            fun and=>.intro ⟨⟩)          (ToOneT0.trans (inf_le_left)))     exact riemannZeta_ne_zero_of_one_le_re (s := 1 + I * t₀) (by simp) zetaIsZero