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

Complex.Hadamard.summable_norm_inv_rpow_divisorZeroIndex₀_of_growth

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.HadamardFactorization.Summability · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/HadamardFactorization/Summability.lean:484 to 565

Mathematical statement

Exact Lean statement

theorem summable_norm_inv_rpow_divisorZeroIndex₀_of_growth {f : ℂ → ℂ} {ρ τ : ℝ}
    (hρ : 0 ≤ ρ) (hτ : ρ < τ) (hf : Differentiable ℂ f) (hnot : ∃ z : ℂ, f z ≠ 0)
    (hgrowth : ∃ C > 0, ∀ z : ℂ, Real.log (1 + ‖f z‖) ≤ C * (1 + ‖z‖) ^ ρ) :
    Summable (fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>
      ‖divisorZeroIndex₀_val p‖⁻¹ ^ τ)

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem summable_norm_inv_rpow_divisorZeroIndex₀_of_growth {f : ℂ  ℂ} {ρ τ : }    (hρ : 0  ρ) (hτ : ρ < τ) (hf : Differentiable ℂ f) (hnot :  z : ℂ, f z  0)    (hgrowth :  C > 0,  z : ℂ, Real.log (1 + ‖f z‖)  C * (1 + ‖z‖) ^ ρ) :    Summable (fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>      ‖divisorZeroIndex₀_val p‖⁻¹ ^ τ) := by  rcases hgrowth with Cgrow, hCgrow_pos, hCgrow  have hτpos : 0 < τ := lt_of_le_of_lt hρ hτ  rcases exists_r0_le_norm_divisorZeroIndex₀_val (f := f) hf hnot with r0, hr0pos, hr0  have hr0ne : (r0 : )  0 := ne_of_gt hr0pos  let kfun : divisorZeroIndex₀ f (Set.univ : Set ℂ)   :=    fun p =>Real.logb 2 (‖divisorZeroIndex₀_val p‖ / r0)⌋₊  let S :   Set (divisorZeroIndex₀ f (Set.univ : Set ℂ)) :=    fun k => {p | kfun p = k}  have hS :  p : divisorZeroIndex₀ f (Set.univ : Set ℂ), ! k : , p  S k := by    intro p    refine kfun p, ?_, ?_    · simp [S]    · intro k hk      simpa [S] using hk.symm  have hnonneg : 0  fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>      ‖divisorZeroIndex₀_val p‖⁻¹ ^ τ := by    intro p    exact Real.rpow_nonneg (inv_nonneg.2 (norm_nonneg _)) _  have hSk_summable :  k : , Summable fun p : S k => ‖divisorZeroIndex₀_val p.1‖⁻¹ ^ τ := by    intro k    haveI : Finite (S k) := by      simpa [S, kfun] using (finite_divisorZeroIndex₀_dyadicShell        (f := f) hr0pos hr0 k).to_subtype    exact Summable.of_finite  have hshell_summable :      Summable fun k :  => ∑' p : S k, ‖divisorZeroIndex₀_val p.1‖⁻¹ ^ τ := by    let q :  := (2 : ) ^- τ)    let qσ :  := (2 : ) ^ (-τ)    have hq_nonneg : 0  q := le_of_lt (Real.rpow_pos_of_pos (by norm_num : (0 : ) < 2) _)    have hq_lt_one : q < 1 :=      Real.rpow_lt_one_of_one_lt_of_neg (x := (2 : )) (by norm_num : (1 : ) < 2)        (sub_neg.2 hτ)    have hqσ_nonneg : 0 := le_of_lt (Real.rpow_pos_of_pos (by norm_num : (0 : ) < 2) _)    have hqσ_lt_one : qσ < 1 :=      Real.rpow_lt_one_of_one_lt_of_neg (x := (2 : )) (by norm_num : (1 : ) < 2)        (by simpa using (neg_neg_of_pos hτpos))    have hgeom_q : Summable (fun k :  => q ^ k) :=      summable_geometric_of_lt_one hq_nonneg hq_lt_one    have hgeom_qσ : Summable (fun k :  =>^ k) :=      summable_geometric_of_lt_one hqσ_nonneg hqσ_lt_one    let Ctrail :  := |Real.log ‖meromorphicTrailingCoeffAt f 0‖|    let A :  := ((Cgrow / Real.log 2) * (1 + 4 * r0) ^ ρ) * (r0⁻¹) ^ τ    let B :  := ((Ctrail / Real.log 2) + 1) * (r0⁻¹) ^ τ    rcases Real.exists_nat_le_two_pow (1 / r0) with k0, hk0    let A0 :  := A * q ^ k0    let B0 :  := B *^ k0    have hmajor : Summable (fun k :  => A0 * q ^ k + B0 *^ k) :=      (hgeom_q.mul_left A0).add (hgeom_qσ.mul_left B0)    have hshell_summable_shift :        Summable fun k :  => ∑' p : S (k + k0), ‖divisorZeroIndex₀_val p.1‖⁻¹ ^ τ := by      refine hmajor.of_nonneg_of_le        (fun k => by          have :  p : S (k + k0), 0  ‖divisorZeroIndex₀_val p.1‖⁻¹ ^ τ := by            intro p; exact Real.rpow_nonneg (inv_nonneg.2 (norm_nonneg _)) _          exact tsum_nonneg this)        (fun k => by          let kk :  := k + k0          let Rk :  := r0 * (2 : ) ^ ((kk : ) + 1)          have hRk_ge_one : (1 : )  Rk := by            have hkk : k0  kk + 1 := by              simp [kk, Nat.add_assoc, Nat.add_comm]            simpa [Rk] using              Real.one_le_dyadicRadius_succ_of_inv_le_two_pow hr0pos hk0 hkk          have hmain :              (∑' p : S kk, ‖divisorZeroIndex₀_val p.1‖⁻¹ ^ τ)  A * q ^ kk + B *^ kk := by            simpa [S, kfun, Ctrail, A, B, q, qσ] using              tsum_divisorZeroIndex₀_dyadicShell_inv_rpow_le_geometric_of_growth                (f := f) (ρ := ρ) (τ := τ) hρ hτpos hf hCgrow_pos hCgrow hr0pos hr0 kk hRk_ge_one          have : A * q ^ kk + B *^ kk = A0 * q ^ k + B0 *^ k := by            simpa [A0, B0, kk] using Real.two_geometric_shift_add A B q qσ k k0          simpa [kk] using (hmain.trans_eq this)        )    exact (summable_nat_add_iff k0).1 hshell_summable_shift  have hpart :=    (summable_partition (f := fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>        ‖divisorZeroIndex₀_val p‖⁻¹ ^ τ) hnonneg (s := S) hS)  exact (hpart.2 hSk_summable, hshell_summable)