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

Complex.Gamma.norm_bound_re_ge_one

PrimeNumberTheoremAnd.Mathlib.Analysis.SpecialFunctions.Gamma.StripBounds · PrimeNumberTheoremAnd/Mathlib/Analysis/SpecialFunctions/Gamma/StripBounds.lean:252 to 342

Source documentation

For re s ≥ 1, ‖Γ(s)‖ is bounded by a polynomial in ‖s‖.

Exact Lean statement

theorem norm_bound_re_ge_one :
    ∃ C : ℝ, 0 < C ∧
      ∀ s : ℂ, 1 ≤ s.re →
        ‖Gamma s‖ ≤ C * (1 + ‖s‖) ^ (‖s‖ + 1)

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem norm_bound_re_ge_one :     C : , 0 < C        s : ℂ, 1  s.re Gamma s‖  C * (1 + ‖s‖) ^ (‖s‖ + 1) := by  refine 1, by norm_num, ?_  intro s hs_re  classical  by_cases hs_small : s.re < 2  · -- On the strip `1 ≤ re s ≤ 2`, we have the sharp bound `‖Γ(s)‖ ≤ 1`.    have hΓ : ‖Gamma s‖  1 := Complex.Gamma.norm_le_one hs_re      (le_of_lt hs_small)    have hpow : (1 : )  (1 + ‖s‖) ^ (‖s‖ + 1) := by      have hbase : (1 : )  1 + ‖s‖ := by linarith [norm_nonneg s]      have hexp : (0 : )  ‖s‖ + 1 := by linarith [norm_nonneg s]      have h := Real.rpow_le_rpow (by norm_num : (0 : )  1) hbase hexp      simpa [Real.one_rpow] using h    simpa [one_mul] using le_trans hΓ hpow  · -- For `2 ≤ re s`, shift into `[1,2)` using the functional equation.    have hs_ge_two : 2  s.re := le_of_not_gt hs_small    let m :  :=s.re⌋₊ - 1    have h_floor_ge2 : 2 s.re⌋₊ := Nat.le_floor (by exact_mod_cast hs_ge_two)    have h_floor_le : (⌊s.re⌋₊ : )  s.re := Nat.floor_le (by linarith : (0 : )  s.re)    have h_floor_gt : s.re < (⌊s.re⌋₊ : ) + 1 := by      simpa using (Nat.lt_floor_add_one s.re)    have hm_eq : (m : ) = (⌊s.re⌋₊ : ) - 1 := by      have : (1 : ) s.re⌋₊ := by omega      simp [m, Nat.cast_sub this, Nat.cast_one]    have hm_pos : 0 < m := by simp [m]; omega    have h_re_lo : 1  (s - (m : ℂ)).re := by      simp [sub_re, hm_eq]      linarith [h_floor_le]    have h_re_hi : (s - (m : ℂ)).re < 2 := by      simp [sub_re, hm_eq]      linarith [h_floor_gt]    have h_k_bound :  k < m, (k : ) + 1 < s.re := by      intro k hk      calc (k : ) + 1  (m : ) := by exact_mod_cast (Nat.lt_iff_add_one_le.mp hk)        _ = (⌊s.re⌋₊ : ) - 1 := hm_eq        _ < (⌊s.re⌋₊ : ) := by linarith        _  s.re := h_floor_le    have prod_norm_le_pow :        ‖∏ k  Finset.range m, (s - 1 - (k : ℂ))‖  ‖s‖ ^ m := by      simpa using Stirling.GammaAux.prod_norm_le_pow (s := s) (m := m) h_k_bound    have Gamma_iterate :        Gamma s = Gamma (s - (m : ℂ)) * ∏ k  Finset.range m, (s - 1 - (k : ℂ)) := by      have hs_nonzero :  k < m, s - 1 - (k : ℂ)  0 := by        intro k hk hk0        have : (s - 1 - (k : ℂ)).re = 0 := by simp [hk0]        have hk' : (k : ) + 1 < s.re := h_k_bound k hk        simp [Complex.sub_re] at this        linarith      simpa using Stirling.GammaAux.Gamma_iterate (s := s) (n := m) hs_nonzero    have h_gamma_base : ‖Gamma (s - (m : ℂ))‖  1 :=      Complex.Gamma.norm_le_one h_re_lo (le_of_lt h_re_hi)    have hΓ_le_pow : ‖Gamma s‖  ‖s‖ ^ m := by      calcGamma s‖ =Gamma (s - (m : ℂ)) * ∏ k  Finset.range m, (s - 1 - (k : ℂ))‖ := by              simp [Gamma_iterate]        _ =Gamma (s - (m : ℂ))‖ *              ‖∏ k  Finset.range m, (s - 1 - (k : ℂ))‖ := by              simp        _  1 * ‖s‖ ^ m :=            mul_le_mul h_gamma_base prod_norm_le_pow (norm_nonneg _) (by norm_num)        _ = ‖s‖ ^ m := by ring    have hm_le_norm : (m : )  ‖s‖ := by      have hm_le_floor : m s.re⌋₊ := Nat.sub_le _ _      have hm_le_re : (m : )  s.re := by        have h_floor_le' : (⌊s.re⌋₊ : )  s.re :=          Nat.floor_le (by linarith : (0 : )  s.re)        exact le_trans (by exact_mod_cast hm_le_floor) h_floor_le'      exact le_trans hm_le_re (Complex.re_le_norm s)    have hpow_le : ‖s‖ ^ m  (1 + ‖s‖) ^ (‖s‖ + 1) := by      have hx0 : (0 : )  ‖s‖ := norm_nonneg _      have hm0 : (0 : )  (m : ) := by exact_mod_cast (Nat.cast_nonneg m)      have hbase_le : ‖s‖  1 + ‖s‖ := by linarith [norm_nonneg s]      have h1 : (‖s‖ : ) ^ m = (‖s‖ : ) ^ (m : ) := by        simp [Real.rpow_natCast]      have h2 : (‖s‖ : ) ^ (m : )  (1 + ‖s‖) ^ (m : ) :=        Real.rpow_le_rpow hx0 hbase_le hm0      have hbase1 : (1 : )  1 + ‖s‖ := by linarith [norm_nonneg s]      have hm_le : (m : )  ‖s‖ + 1 := by linarith [hm_le_norm]      have h3 : (1 + ‖s‖) ^ (m : )  (1 + ‖s‖) ^ (‖s‖ + 1) :=        Real.rpow_le_rpow_of_exponent_le hbase1 hm_le      calc        ‖s‖ ^ m = (‖s‖ : ) ^ (m : ) := h1        _  (1 + ‖s‖) ^ (m : ) := h2        _  (1 + ‖s‖) ^ (‖s‖ + 1) := h3    have : ‖Gamma s‖  (1 + ‖s‖) ^ (‖s‖ + 1) := le_trans hΓ_le_pow hpow_le    simpa [one_mul] using this