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

Complex.Hadamard.hadamard_factorization_of_growth

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.HadamardFactorization.Growth · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/HadamardFactorization/Growth.lean:434 to 490

Source documentation

Hadamard factorization from a global logarithmic growth bound.

The minimum-modulus step in this proof is supplied by the Cartan circle bounds above; this is an alternative to Tao's good-circle averaging step, with the same role in bounding the zero-free Hadamard quotient.

Exact Lean statement

theorem hadamard_factorization_of_growth {f : ℂ → ℂ} {ρ : ℝ} (hρ : 0 ≤ ρ)
    (hentire : Differentiable ℂ f)
    (hnot : ∃ z : ℂ, f z ≠ 0)
    (hgrowth : ∃ C > 0, ∀ z : ℂ, Real.log (1 + ‖f z‖) ≤ C * (1 + ‖z‖) ^ ρ) :
    ∃ (P : Polynomial ℂ),
      P.degree ≤ Nat.floor ρ ∧
      ∀ z : ℂ,
        f z =
          Complex.exp (Polynomial.eval z P) *
            z ^ (analyticOrderNatAt f 0) *
            divisorCanonicalProduct (Nat.floor ρ) f (Set.univ : Set ℂ) z

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem hadamard_factorization_of_growth {f : ℂ  ℂ} {ρ : } (hρ : 0  ρ)    (hentire : Differentiable ℂ f)    (hnot :  z : ℂ, f z  0)    (hgrowth :  C > 0,  z : ℂ, Real.log (1 + ‖f z‖)  C * (1 + ‖z‖) ^ ρ) :     (P : Polynomial ℂ),      P.degree  Nat.floor ρ        z : ℂ,        f z =          Complex.exp (Polynomial.eval z P) *            z ^ (analyticOrderNatAt f 0) *            divisorCanonicalProduct (Nat.floor ρ) f (Set.univ : Set ℂ) z := by  set m :  := Nat.floor ρ  have h_sum :      Summable (fun p : divisorZeroIndex₀ f (Set.univ : Set ℂ) =>        ‖divisorZeroIndex₀_val p‖⁻¹ ^ (m + 1)) := by    simpa [m] using      (summable_norm_inv_pow_divisorZeroIndex₀_of_growth (f := f) (ρ := ρ)        hρ hentire hnot hgrowth)  rcases exists_entire_nonzero_hadamardQuotient (m := m) (f := f) hentire hnot h_sum with    H, hH_entire, hH_ne, hfactor  rcases Real.exists_between_self_and_floor_add_one_same_floorwith    τ, hτ, hτ_lt, hτ_nonneg, hfloorτ'  have hfloorτ : Nat.floor τ = m := by    simpa [m] using hfloorτ'  have hτ_lt_m : τ < (m + 1 : ) := by    simpa [m] using hτ_lt  have hτ_lt_nat : τ < ((m + 1 : ) : ) := by    simpa [Nat.cast_add, Nat.cast_one] using hτ_lt_m  have hmρ : (m : )  ρ := by    have := Nat.floor_le    simpa [m] using this  have hH_bound_rpow :       C > 0,  z : ℂ, ‖H z‖  Real.exp (C * (1 + ‖z‖) ^ τ) :=    hadamardQuotient_norm_le_exp_rpow_of_growth (f := f) (H := H) (ρ := ρ) (τ := τ)      (m := m) hρ hmρ hτ hτ_lt hτ_nonneg hentire hH_entire hnot h_sum hgrowth hfactor  have hH_growth_nat :       C > 0,  z : ℂ, ‖H z‖  Real.exp (C * (1 + ‖z‖) ^ (m + 1)) := by    exact Real.exists_norm_le_exp_mul_pow_of_rpow_bound      (f := H) (r := fun z : ℂ => 1 + ‖z‖)      (fun z => by linarith [norm_nonneg z]) hτ_lt_nat hH_bound_rpow  rcases zero_free_polynomial_growth_is_exp_poly (H := H) (n := m + 1)      hH_entire hH_ne hH_growth_nat with    P, hPn, hHP  have hPnat : P.natDegree  m := by    have hbound :         C > 0,  z : ℂ,Complex.exp (Polynomial.eval z P)‖  Real.exp (C * (1 + ‖z‖) ^ τ) := by      rcases hH_bound_rpow with C, hCpos, hC      exact C, hCpos, fun z => by simpa [hHP z] using (hC z)    have := natDegree_le_floor_of_exp_eval_norm_bound hτ_nonneg P hbound    simpa [hfloorτ] using this  refine P, ?_, ?_  · have : P.degree  m := Polynomial.degree_le_of_natDegree_le hPnat    simpa [m] using this  · intro z    have hH' : H z = Complex.exp (Polynomial.eval z P) := by simpa using (hHP z)    simpa [hH', mul_assoc, mul_left_comm, mul_comm, m] using (hfactor z)