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

Complex.Hadamard.natDegree_le_floor_of_growth_exp_eval

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.ExpPoly.Growth · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/ExpPoly/Growth.lean:268 to 368

Source documentation

If exp (P.eval z) satisfies a polynomial-type growth bound of exponent ρ, then P.natDegree ≤ ⌊ρ⌋.

Exact Lean statement

theorem natDegree_le_floor_of_growth_exp_eval
    {ρ : ℝ} (hρ : 0 ≤ ρ) (P : Polynomial ℂ)
    (hgrowth :
      ∃ C > 0, ∀ z : ℂ,
        Real.log (1 + ‖Complex.exp (Polynomial.eval z P)‖) ≤ C * (1 + ‖z‖) ^ ρ) :
    P.natDegree ≤ Nat.floor ρ

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem natDegree_le_floor_of_growth_exp_eval    {ρ : } (hρ : 0  ρ) (P : Polynomial ℂ)    (hgrowth :       C > 0,  z : ℂ,        Real.log (1 +Complex.exp (Polynomial.eval z P)‖)  C * (1 + ‖z‖) ^ ρ) :    P.natDegree  Nat.floor ρ := by  classical  by_cases hdeg : P.natDegree = 0  · simp [hdeg]  · have hnpos : 0 < P.natDegree := Nat.pos_of_ne_zero hdeg    rcases exists_z_norm_eq_re_eval_ge (P := P) hnpos with R0, hR0pos, hray    rcases hgrowth with C, hCpos, hC    have hLCpos : 0 <P.leadingCoeff:= by      have hP0 : P  0 := by        intro h0        simp [h0] at hdeg      have : P.leadingCoeff  0 := (Polynomial.leadingCoeff_ne_zero).2 hP0      exact norm_pos_iff.2 this    let c :  :=P.leadingCoeff/ 2    have hcpos : 0 < c := by      have : (0 : ) < (2 : ) := by norm_num      exact (div_pos hLCpos this)    have hn_le_real : (P.natDegree : )  ρ := by      by_contra hnlt      have hnlt' : ρ < (P.natDegree : ) := lt_of_not_ge hnlt      let δ :  := (P.natDegree : ) - ρ      have hδ : 0 < δ := sub_pos.2 hnlt'      let K0 :  := (C * (2 : ) ^ ρ) / c      have hK0 :  R1,  R  R1, K0 + 1  R ^ δ := by        have h : ᶠ R in (atTop : Filter ), K0 + 1  R ^ δ :=          (tendsto_atTop.mp (tendsto_rpow_atTop hδ)) (K0 + 1)        rcases (eventually_atTop.1 h) with R1, hR1        exact R1, hR1      rcases hK0 with R1, hR1      set R :  := max (max R0 1) R1      have hR_ge_R0 : R0  R := le_trans (le_max_left _ _) (le_max_left _ _)      have hR_ge1 : (1 : )  R := le_trans (le_max_right _ _) (le_max_left _ _)      have hR_ge_R1 : R1  R := le_max_right _ _      have hR_pos : 0 < R := lt_of_lt_of_le (by norm_num : (0 : ) < 1) hR_ge1      have hRδ : K0 + 1  R ^ δ := hR1 R hR_ge_R1      rcases hray R hR_ge_R0 with z, hz_norm, hz_re      have hlog_lower :          (P.eval z).re  Real.log (1 +Complex.exp (Polynomial.eval z P)‖) := by        have hpos : 0 <Complex.exp (Polynomial.eval z P)‖ := by          simp        have hle :Complex.exp (Polynomial.eval z P)‖               1 +Complex.exp (Polynomial.eval z P)‖ := by          linarith [norm_nonneg (Complex.exp (Polynomial.eval z P))]        have hlog_le : Real.logComplex.exp (Polynomial.eval z P)‖             Real.log (1 +Complex.exp (Polynomial.eval z P)‖) :=          Real.log_le_log hpos hle        have hlog_eq : Real.logComplex.exp (Polynomial.eval z P)‖ = (P.eval z).re := by          simp [Complex.norm_exp]        simpa [hlog_eq] using hlog_le      have hlog_upper :          Real.log (1 +Complex.exp (Polynomial.eval z P)‖)  C * (1 + ‖z‖) ^ ρ :=        hC z      have hmain : c * R ^ (P.natDegree : )  C * (1 + R) ^ ρ := by        have hz_re' : c * R ^ P.natDegree  (P.eval z).re := by          simpa [c] using hz_re        have hz_re'' : c * R ^ (P.natDegree : )  (P.eval z).re := by          simpa [Real.rpow_natCast, c] using hz_re'        have : c * R ^ (P.natDegree : )  Real.log (1 +Complex.exp (Polynomial.eval z P)‖) :=          hz_re''.trans hlog_lower        have : c * R ^ (P.natDegree : )  C * (1 + ‖z‖) ^ ρ :=          this.trans hlog_upper        simpa [hz_norm] using this      have h1R_le : (1 + R : )  R * 2 := by linarith      have hpow1 : (1 + R : ) ^ ρ  (R * 2) ^ ρ :=        Real.rpow_le_rpow (by linarith [hR_pos.le]) h1R_le hρ      have hR2 : (R * 2) ^ ρ = R ^ ρ * (2 : ) ^ ρ := by        have hRnonneg : 0  R := le_of_lt hR_pos        have h2nonneg : 0  (2 : ) := by norm_num        simpa [mul_assoc] using (Real.mul_rpow hRnonneg h2nonneg (z := ρ))      have hmain' : c * R ^ (P.natDegree : )  C * (R ^ ρ * (2 : ) ^ ρ) := by        have := le_trans hmain (mul_le_mul_of_nonneg_left hpow1 (le_of_lt hCpos))        simpa [hR2, mul_assoc, mul_left_comm, mul_comm] using this      have hRρ_pos : 0 < R ^ ρ := Real.rpow_pos_of_pos hR_pos _      have hRρ_ne : (R ^ ρ : )  0 := ne_of_gt hRρ_pos      have hdiv :          (c * R ^ (P.natDegree : )) / (R ^ ρ)  C * (2 : ) ^ ρ := by        have h :=            div_le_div_of_nonneg_right hmain' (le_of_lt hRρ_pos)        have hRhs : (C * (R ^ ρ * (2 : ) ^ ρ)) / (R ^ ρ) = C * (2 : ) ^ ρ := by          field_simp [hRρ_ne]        simpa [hRhs, mul_assoc, mul_left_comm, mul_comm] using h      have hRsub : R ^ δ = R ^ (P.natDegree : ) / R ^ ρ := by        simpa [δ] using (Real.rpow_sub hR_pos (P.natDegree : ) ρ)      have hRδ_le : c * (R ^ δ)  C * (2 : ) ^ ρ := by        have hLhs : c * (R ^ δ) = (c * R ^ (P.natDegree : )) / (R ^ ρ) := by          simp [hRsub, div_eq_mul_inv, mul_left_comm, mul_comm]        simpa [hLhs] using hdiv      have hRδ_le' : R ^ δ  K0 := by        have : R ^ δ  (C * (2 : ) ^ ρ) / c := by          refine (le_div_iff₀ hcpos).2 ?_          simpa [mul_assoc, mul_left_comm, mul_comm] using hRδ_le        simpa [K0] using this      have : K0 + 1  K0 := le_trans hRδ (le_trans hRδ_le' (le_rfl))      exact (not_lt_of_ge this) (lt_add_of_pos_right _ (by norm_num : (0 : ) < 1))    exact (Nat.le_floor_iff hρ).2 hn_le_real