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

Erdos392.Params.initial.bound_score_3

PrimeNumberTheoremAnd.IEANTN.Erdos392 · PrimeNumberTheoremAnd/IEANTN/Erdos392.lean:2494 to 2578

Mathematical statement

Exact Lean statement

@[blueprint "bound-score-3"
  (statement := /-- If $n$ sufficiently large depending on $M, \varepsilon$, then
  $\sum_{p \leq \sqrt{n}} M \log^2 n / \log 2 \leq \varepsilon n$. -/)
  (proof := /-- Crude estimation. -/)
  (discussion := 516)
  (latexEnv := "sublemma")]
theorem Params.initial.bound_score_3 (ε : ℝ) (hε : ε > 0) (M : ℕ) :
    ∀ᶠ n in .atTop, ∀ P : Params,
      P.M = M → P.n = n → ∑ _p ∈ filter (·.Prime) (Finset.Iic ⌊(Real.sqrt P.n)⌋₊),
          P.M * Real.log P.n * Real.log P.n / Real.log 2 ≤ ε * P.n

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
@[blueprint "bound-score-3"  (statement := /-- If $n$ sufficiently large depending on $M, \varepsilon$, then  $\sum_{p \leq \sqrt{n}} M \log^2 n / \log 2 \leq \varepsilon n$. -/)  (proof := /-- Crude estimation. -/)  (discussion := 516)  (latexEnv := "sublemma")]theorem Params.initial.bound_score_3 (ε : ) (hε : ε > 0) (M : ) :    ᶠ n in .atTop,  P : Params,      P.M = M  P.n = n  ∑ _p  filter (·.Prime) (Finset.Iic ⌊(Real.sqrt P.n)⌋₊),          P.M * Real.log P.n * Real.log P.n / Real.log 2  ε * P.n := by  have h_littleO : (fun x :   Real.sqrt x * Real.log x) =o[Filter.atTop] (fun x  x) :=    (isLittleO_mul_iff_isLittleO_div (hf := by      filter_upwards [Filter.eventually_gt_atTop 0] with x hx; exact sqrt_ne_zero'.mpr hx)).mpr      (by simp_rw [div_sqrt, sqrt_eq_rpow]; exact isLittleO_log_rpow_atTop one_half_pos)  obtain N₀, hN₀ := Metric.tendsto_atTop.mp    (h_littleO.tendsto_div_nhds_zero.comp tendsto_natCast_atTop_atTop)* Real.log 2 / (8 * (M + 1))) (by positivity)  obtain N₁, hN₁ := Filter.eventually_atTop.mp <| isLittleO_iff.mp pi_alt' one_half_pos  filter_upwards [Filter.eventually_ge_atTop    (max 16 (max N₀ ((⌈N₁⌉₊ + 1) ^ 2)))] with n hn P hPM hPn  simp only [hPM, hPn]; have hn16 : n  16 := le_of_max_le_left hn  have hnpos : (n : ) > 0 := by positivity  have hlogn_pos : Real.log n > 0 := log_pos (by exact_mod_cast lt_of_add_left_lt hn16)  have hsqrt_pos : Real.sqrt n > 0 := sqrt_pos.mpr hnpos  have hn16' : (16 : )  n := by exact_mod_cast hn16  have hsqrt_ge_4 : Real.sqrt n  4 := by    nlinarith [Real.sq_sqrt hnpos.le, sq_nonneg (Real.sqrt n - 4)]  have hfloor_gt_1 : (1 : ) <Real.sqrt n⌋₊ := by    exact_mod_cast lt_of_add_left_lt (le_floor (by linarith : (3 : )  Real.sqrt n))  conv_lhs => rw [sum_const, nsmul_eq_mul]  rw [show (filter Nat.Prime (Finset.IicReal.sqrt n⌋₊)).card =    primeCounting ⌊Real.sqrt n⌋₊ by    simp only [primeCounting, primeCounting', card_filter, count_eq_card_filter_range]    congr 1; ext p; simp only [Finset.mem_Iic, Finset.mem_range, Nat.lt_succ_iff]]  rcases eq_or_ne M 0 with rfl | hMne; · simp [mul_nonneg hε.le (cast_nonneg _)]  have hsqrt_N₁ : (⌊Real.sqrt n⌋₊ : ) > N₁ := by    have hnsq : n  (⌈N₁⌉₊ + 1) ^ 2 := (le_max_right _ _).trans (le_of_max_le_right hn)    have : Real.sqrt n  ⌈N₁⌉₊ + 1 := by      calc (⌈N₁⌉₊ : ) + 1 = Real.sqrt (((⌈N₁⌉₊ + 1 : ) : ) ^ 2) := by            rw [Real.sqrt_sq (cast_nonneg' (⌈N₁⌉₊ + 1))]; simp        _  Real.sqrt n := sqrt_le_sqrt (by exact_mod_cast hnsq)    linarith [le_ceil N₁, sub_one_lt_floor (Real.sqrt n)]  have hlog_floor_pos : Real.logReal.sqrt n⌋₊ > 0 := log_pos hfloor_gt_1  have hπ : (primeCounting ⌊Real.sqrt n⌋₊ : )       3 / 2 * (⌊Real.sqrt n⌋₊ / Real.logReal.sqrt n⌋₊) := by    have := hN₁ ⌊Real.sqrt n⌋₊ hsqrt_N₁.le    simp only [Pi.sub_apply, floor_natCast, norm_eq_abs, abs_of_pos (by positivity :      (0 : ) <Real.sqrt n⌋₊ / Real.logReal.sqrt n⌋₊)] at this    linarith [(abs_le.mp this).2]  have hlog_floor_ge : Real.logReal.sqrt n⌋₊  Real.log n / 4 := by    have hfloor_ge : (⌊Real.sqrt n⌋₊ : )  Real.sqrt n / 2 := by      linarith [sub_one_lt_floor (Real.sqrt n)]    calc Real.logReal.sqrt n⌋₊         log (Real.sqrt n / 2) := log_le_log (by positivity) hfloor_ge      _ = Real.log n / 2 - Real.log 2 := by          rw [log_div hsqrt_pos.ne' two_ne_zero, log_sqrt hnpos.le]      _  Real.log n / 4 := by          have : Real.log n  4 * Real.log 2 := by            calc Real.log n  Real.log 16 := log_le_log ofNat_pos' <| ofNat_le_cast.mpr hn16              _ = 4 * Real.log 2 := by rw [show (16 : ) = 2 ^ 4 by norm_num, Real.log_pow]; ring          linarith  have hbound := hN₀ n ((le_max_left ..).trans (le_of_max_le_right hn))  simp only [Function.comp_apply, Real.dist_eq, sub_zero] at hbound  have h_sqrt_log : Real.sqrt n * Real.log n < ε * Real.log 2 * n / (8 * (M + 1)) := by    have : Real.sqrt n * Real.log n / n < ε * Real.log 2 / (8 * (M + 1)) := by      linarith [(abs_lt.mp hbound).2, (by positivity : Real.sqrt n * Real.log n / n  0)]    calc Real.sqrt n * Real.log n = Real.sqrt n * Real.log n / n * n := by field_simp      _ < ε * Real.log 2 / (8 * (M + 1)) * n := by gcongr      _ = _ := by ring  calc (primeCounting ⌊Real.sqrt n⌋₊ : ) * (M * Real.log n * Real.log n / Real.log 2)       3 / 2 * (⌊Real.sqrt n⌋₊ / Real.logReal.sqrt n⌋₊) *          (M * Real.log n * Real.log n / Real.log 2) := by gcongr    _  3 / 2 * (Real.sqrt n / (Real.log n / 4)) *          (M * Real.log n * Real.log n / Real.log 2) := by gcongr; exact floor_le hsqrt_pos.le    _ = 6 * M * Real.sqrt n * Real.log n / Real.log 2 := by field_simp; ring    _  8 * (M + 1) * Real.sqrt n * Real.log n / Real.log 2 := by        have h6le8 : (6 : ) * M  8 * (M + 1) := by          exact_mod_cast (by omega : 6 * M  8 * (M + 1))        have := hlogn_pos; gcongr    _  ε * n := by        rw [div_le_iff₀ (log_pos one_lt_two)]        calc 8 * (M + 1) * Real.sqrt n * Real.log n           8 * (M + 1) ** Real.log 2 * n / (8 * (M + 1))) :=            le_of_lt (by nlinarith [h_sqrt_log])        _ = ε * n * Real.log 2 := by field_simp