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

sum_mu_div_sq_isLittleO

PrimeNumberTheoremAnd.Consequences · PrimeNumberTheoremAnd/Consequences.lean:2133 to 2198

Mathematical statement

Exact Lean statement

lemma sum_mu_div_sq_isLittleO : (fun N : ℕ ↦ ∑ d ∈ Finset.Icc 1 (Nat.sqrt N), ∑ k ∈ Finset.Icc 1 (N / d^2), (μ k : ℝ)) =o[atTop] (fun N ↦ (N : ℝ))

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
lemma sum_mu_div_sq_isLittleO : (fun N :   ∑ d  Finset.Icc 1 (Nat.sqrt N), ∑ k  Finset.Icc 1 (N / d^2), (μ k : )) =o[atTop] (fun N  (N : )) := by  have h_sum_rewrite :  N : , (∑ d  Finset.Icc 1 (Nat.sqrt N), (∑ k  Finset.Icc 1 (N / d^2), (μ k : ))) = (∑ d  Finset.Icc 1 (Nat.sqrt N), (M (N / d^2) : )) := by    intro N    simp only [M]    refine Finset.sum_congr rfl ?_    intro x hx    erw [ Finset.sum_Ico_eq_sub _ ] <;> norm_num [ Finset.sum_range_succ' ];    rw [ show ⌊ ( N :  ) / x ^ 2⌋₊ = N / x ^ 2 from Nat.floor_eq_iff ( by positivity ) |>.2  by rw [ le_div_iff₀ ( by norm_cast; nlinarith [ Finset.mem_Icc.mp hx ] ) ] ; norm_cast; linarith [ Nat.div_mul_le_self N ( x ^ 2 ) ], by rw [ div_lt_iff₀ ( by norm_cast; nlinarith [ Finset.mem_Icc.mp hx ] ) ] ; norm_cast; linarith [ Nat.div_add_mod N ( x ^ 2 ), Nat.mod_lt N ( show x ^ 2 > 0 by nlinarith [ Finset.mem_Icc.mp hx ] ) ]  ] ; erw [ Finset.sum_Ico_eq_sub _ ] <;> norm_num [ Finset.sum_range_succ' ] ;  have h_bound :  ε > 0,  N₀ : ,  N  N₀,  d  Finset.Icc 1 (Nat.sqrt N), |M (N / d^2)|  ε * (N / d^2) + N₀ := by    have h_bound :  ε > 0,  C : ,  x : , 1  x  |M x|  ε * x + C := by      have h_bound :  ε > 0,  C : ,  x : , 1  x  |M x|  ε * x + C := by        intro ε hε        have := M_isLittleO'        rw [ Asymptotics.isLittleO_iff ] at this;        norm_num +zetaDelta at *;        obtain  a, ha  := this hε;        obtain C, hC :  C : ,  x  Set.Icc 1 a, |M x|  C := by          have h_bounded : BddAbove (Set.image (fun x => |M x|) (Set.Icc 1 a)) := by            have h_bounded : BddAbove (Set.image (fun x => |∑ n  Finset.Iic ⌊x⌋₊, (μ n : )|) (Set.Icc 1 a)) := by              have h_finite : Set.Finite (Set.image (fun x => ⌊x⌋₊) (Set.Icc 1 a)) := by                exact Set.finite_iff_bddAbove.mpr  ⌊a⌋₊, Set.forall_mem_image.mpr fun x hx => Nat.floor_mono hx.2               have h_bounded : BddAbove (Set.image (fun n :  => |∑ k  Finset.Iic n, (μ k : )|) (Set.image (fun x => ⌊x⌋₊) (Set.Icc 1 a))) := by                exact Set.Finite.bddAbove <| h_finite.image _;              exact  h_bounded.choose, Set.forall_mem_image.2 fun x hx => h_bounded.choose_spec <| Set.mem_image_of_mem _ <| Set.mem_image_of_mem _ hx ;            convert! h_bounded using 1;          exact  h_bounded.choose, fun x hx => h_bounded.choose_spec  x, hx, rfl  ;        exact  Max.max C 0, fun x hx => if hx' : x  a then le_trans ( hC x  hx, hx'  ) ( le_max_left _ _ ) |> le_trans <| le_add_of_nonneg_left <| by positivity else le_trans ( ha x <| le_of_not_ge hx' ) <| by rw [ abs_of_nonneg <| by linarith ] ; exact le_add_of_nonneg_right <| by positivity ;      assumption;    intro ε hε    obtain C, hC := h_bound ε hε    refine ⌈C⌉₊ + 1, ?_    intro N hN d hd    specialize hC (N / d ^ 2)    rcases eq_or_ne d 0 with rfl | hd0    · simp_all +decide only [gt_iff_lt, ge_iff_le, mem_Icc, _root_.zero_le, and_true]    · simp_all +decide only [gt_iff_lt, ge_iff_le, mem_Icc, ne_eq, cast_add, cast_one]      exact        le_trans            (hC <|              by                rw [le_div_iff₀ <| by positivity]                nlinarith [show (d : ) ^ 2  N by norm_cast; nlinarith [Nat.sqrt_le N]])          (by linarith [Nat.le_ceil C])  have h_sum_bound :  ε > 0,  N₀ : ,  N  N₀, |∑ d  Finset.Icc 1 (Nat.sqrt N), M (N / d^2)|  ε * N * (∑' k : , (1 : ) / (k^2)) + N₀ * Nat.sqrt N := by    intros ε hε_pos    obtain N₀, hN₀ := h_bound ε hε_pos    use N₀    intro N hN    have h_sum_bound : |∑ d  Finset.Icc 1 (Nat.sqrt N), M (N / d^2)|  ∑ d  Finset.Icc 1 (Nat.sqrt N), (ε * (N / d^2) + N₀) := by      exact le_trans ( Finset.abs_sum_le_sum_abs _ _ ) ( Finset.sum_le_sum fun x hx => hN₀ N hN x hx );    refine le_trans h_sum_bound ?_;    norm_num [ Finset.sum_add_distrib, Finset.mul_sum _ _ _, mul_assoc, mul_comm, mul_left_comm, div_eq_mul_inv ];    rw [  Finset.mul_sum _ _ _,  Finset.mul_sum _ _ _ ];    exact mul_le_mul_of_nonneg_left ( mul_le_mul_of_nonneg_left ( Summable.sum_le_tsum ( Finset.Icc 1 N.sqrt ) ( fun _ _ => by positivity ) ( by simp ) ) ( Nat.cast_nonneg _ ) ) hε_pos.le;  rw [ Asymptotics.isLittleO_iff ];  intro c hc  obtain ε, hε_pos, hε :  ε > 0, ε * (∑' k : , (1 : ) / (k^2)) < c / 2 := by    exact  ( c / 2 ) / ( ∑' k : , 1 / ( k :  ) ^ 2 + 1 ), div_pos ( half_pos hc ) ( add_pos_of_nonneg_of_pos ( tsum_nonneg fun _ => by positivity ) zero_lt_one ), by rw [ div_mul_eq_mul_div, div_lt_iff₀ ] <;> nlinarith [ show 0  ∑' k : , 1 / ( k :  ) ^ 2 from tsum_nonneg fun _ => by positivity ] ;  obtain  N₀, hN₀  := h_sum_bound ε hε_pos;  obtain N₁, hN₁ :  N₁ : ,  N  N₁, N₀ * Nat.sqrt N  (c / 2) * N := by    have h_sqrt_growth :  N₁ : ,  N  N₁, (N₀ : ) * Real.sqrt N  (c / 2) * N := by      have h_sqrt_bound : Filter.Tendsto (fun N :  => (N₀ : ) * Real.sqrt N / N) Filter.atTop (nhds 0) := by        simpa [ mul_div_assoc, Real.sqrt_div_self ] using tendsto_const_nhds.mul ( tendsto_inv_atTop_nhds_zero_nat.sqrt )      exact Filter.eventually_atTop.mp ( h_sqrt_bound.eventually ( gt_mem_nhds <| show 0 < c / 2 by positivity ) ) |> fun  N₁, hN₁    N₁ + 1, fun N hN  by have := hN₁ N ( by linarith ) ; rw [ div_lt_iff₀ ] at this <;> nlinarith [ show ( N :  )  N₁ + 1 by exact_mod_cast hN ] ;    exact  h_sqrt_growth.choose, fun N hN => le_trans ( mul_le_mul_of_nonneg_left ( Real.le_sqrt_of_sq_le <| mod_cast Nat.sqrt_le' _ ) <| Nat.cast_nonneg _ ) <| h_sqrt_growth.choose_spec N hN ;  filter_upwards [ Filter.eventually_ge_atTop N₀, Filter.eventually_ge_atTop N₁ ] with N hN₀' hN₁' using by rw [ Real.norm_of_nonneg ( Nat.cast_nonneg _ ) ] ; rw [ h_sum_rewrite ] ; exact le_trans ( hN₀ _ hN₀' ) ( by nlinarith [ hN₁ _ hN₁', show ( N :  )  0 by positivity ] ) ;