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

mu_pnt_alt

PrimeNumberTheoremAnd.Consequences · PrimeNumberTheoremAnd/Consequences.lean:2371 to 2429

Mathematical statement

Exact Lean statement

@[blueprint
  "mu-pnt-alt"
  (title := "Alternate M\\\"obius form of prime number theorem")
  (statement := /-- We have $\sum_{n \leq x} \mu(n)/n = o(1)$. -/)
  (proof := /--
  As in the proof of Theorem \ref{mun}, we have
    $$ 1 = \sum_{d \leq x} \mu(d) \lfloor \frac{x}{d} \rfloor$$
    $$ = x \sum_{d \leq x} \frac{\mu(d)}{d} - \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \}$$
  so it will suffice to show that
  $$ \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \} = o(x).$$
  Let $N$  be a natural number.  It suffices to show that
  $$ \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \} = O(x/N).$$
  if $x$ is large enough depending on $N$.
  We can split the left-hand side as the sum of
  $$ \sum_{d \leq x/N} \mu(d) \{ \frac{x}{d} \} $$
  and
  $$ \sum_{j=1}^{N-1} \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j).$$
  The first term is clearly $O(x/N)$.  For the second term, we can use Theorem \ref{mu-pnt}
  and summation by parts (using the fact that $x/d-j$ is monotone and bounded) to find that
  $$ \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j) = o(x)$$
  for any given $j$, so in particular
  $$ \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j) = O(x/N^2)$$
  for all $j=1,\dots,N-1$ if $x$ is large enough depending on $N$.
  Summing all the bounds, we obtain the claim.
  -/)
  (proofUses := ["mu-pnt"])
  (latexEnv := "proposition")]
theorem mu_pnt_alt : (fun x : ℝ ↦ ∑ n ∈ range ⌊x⌋₊, (μ n : ℝ) / n) =o[atTop] fun _ ↦ (1 : ℝ)

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
@[blueprint  "mu-pnt-alt"  (title := "Alternate M\\\"obius form of prime number theorem")  (statement := /-- We have $\sum_{n \leq x} \mu(n)/n = o(1)$. -/)  (proof := /--  As in the proof of Theorem \ref{mun}, we have    $$ 1 = \sum_{d \leq x} \mu(d) \lfloor \frac{x}{d} \rfloor$$    $$ = x \sum_{d \leq x} \frac{\mu(d)}{d} - \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \}$$  so it will suffice to show that  $$ \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \} = o(x).$$  Let $N$  be a natural number.  It suffices to show that  $$ \sum_{d \leq x} \mu(d) \{ \frac{x}{d} \} = O(x/N).$$  if $x$ is large enough depending on $N$.  We can split the left-hand side as the sum of  $$ \sum_{d \leq x/N} \mu(d) \{ \frac{x}{d} \} $$  and  $$ \sum_{j=1}^{N-1} \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j).$$  The first term is clearly $O(x/N)$.  For the second term, we can use Theorem \ref{mu-pnt}  and summation by parts (using the fact that $x/d-j$ is monotone and bounded) to find that  $$ \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j) = o(x)$$  for any given $j$, so in particular  $$ \sum_{x/(j+1) < d \leq x/j} \mu(d) (x/d - j) = O(x/N^2)$$  for all $j=1,\dots,N-1$ if $x$ is large enough depending on $N$.  Summing all the bounds, we obtain the claim.  -/)  (proofUses := ["mu-pnt"])  (latexEnv := "proposition")]theorem mu_pnt_alt : (fun x :   ∑ n  range ⌊x⌋₊, (μ n : ) / n) =o[atTop] fun _  (1 : ) := by  rw [Asymptotics.isLittleO_iff_tendsto'] <;> norm_num  have h_sum_zero : Filter.Tendsto (fun x :  => ∑ n  Finset.Icc 1 ⌊x⌋₊, (μ n : ) / n) Filter.atTop (nhds 0) := by    set S :    := fun y => ∑ n  Finset.Icc 1 ⌊y⌋₊, (μ n : ) / n    have h_bound :  K : , 0 < K   x : , 1  x  |S (x / K)|  1 / K + 1 / x + |∑ n  Finset.Ioc ⌊x / K⌋₊ ⌊x⌋₊, (μ n : ) * (⌊x / (n : )⌋ : )| / x := by      intros K hK x hx      have h_approx : |x * S (x / K) - 1|  x / K + |∑ n  Finset.Ioc ⌊x / K⌋₊ ⌊x⌋₊, (μ n : ) * (⌊x / (n : )⌋ : )| := by        convert sum_mobius_div_approx x K hK hx using 1      rw [abs_le] at *      ring_nf at *      constructor <;> nlinarith [inv_pos.2 (by positivity : 0 < x), mul_inv_cancel₀ (by positivity : x  0), abs_nonneg (∑ n  Finset.Ioc ⌊ (K : ) ⁻¹ * x⌋₊ ⌊x⌋₊, (μ n : ) * ⌊x * (n : ) ⁻¹⌋)]    have h_tail_zero :  K : , 0 < K  Filter.Tendsto (fun x :  => |∑ n  Finset.Ioc ⌊x / K⌋₊ ⌊x⌋₊, (μ n : ) * (⌊x / (n : )⌋ : )| / x) Filter.atTop (nhds 0) := by      intro K hK      have h_tail_zero : Filter.Tendsto (fun x :  => |∑ n  Finset.Ioc ⌊x / K⌋₊ ⌊x⌋₊, (μ n : ) * (⌊x / (n : )⌋ : )| / x) Filter.atTop (nhds 0) := by        have := sum_mobius_floor_tail_isLittleO K hK        rw [Asymptotics.isLittleO_iff_tendsto'] at this        · simpa [abs_div] using this.abs.congr' (by filter_upwards [Filter.eventually_gt_atTop 0] with x hx using by rw [abs_div, abs_of_nonneg hx.le])        · filter_upwards [Filter.eventually_gt_atTop 0] with x hx hx' using absurd hx' hx.ne'      convert h_tail_zero using 1    have h_eps :  ϵ > 0,  Y : ,  y  Y, |S y| < ϵ := by      intros ϵ hϵ_pos      obtain K, hK_pos, hK :  K : , 0 < K  1 / (K : ) < ϵ / 3 := by        exact ⌊ϵ⁻¹ * 3⌋₊ + 1, Nat.succ_pos _, by rw [div_lt_iff₀] <;> push_cast <;> nlinarith [Nat.lt_floor_add_one (ϵ⁻¹ * 3), mul_inv_cancel₀ hϵ_pos.ne']      obtain Y, hY :  Y : ,  x  Y, |S (x / K)| < ϵ := by        have h_tail_zero : Filter.Tendsto (fun x :  => 1 / (K : ) + 1 / x + |∑ n  Finset.Ioc ⌊x / K⌋₊ ⌊x⌋₊, (μ n : ) * (⌊x / (n : )⌋ : )| / x) Filter.atTop (nhds (1 / (K : ))) := by          simpa using Filter.Tendsto.add (tendsto_const_nhds.add (tendsto_inv_atTop_zero)) (h_tail_zero K hK_pos)        exact Filter.eventually_atTop.mp (h_tail_zero.eventually (gt_mem_nhds <| by linarith)) |> fun Y, hY  Max.max Y 1, fun x hx  lt_of_le_of_lt (h_bound K hK_pos x <| le_trans (le_max_right _ _) hx) <| hY x <| le_trans (le_max_left _ _) hx      use Y / K; intros y hy; specialize hY (y * K) (by nlinarith [show (K : )  1 by norm_cast, div_mul_cancel₀ Y (by positivity : (K : )  0)]) ; simp_all +decide [ne_of_gt]    exact Metric.tendsto_atTop.mpr fun ε hε => by simpa using h_eps ε hε  have h_sum_zero : Filter.Tendsto (fun x :  => ∑ n  Finset.range (⌊x⌋₊ + 1), (μ n : ) / n) Filter.atTop (nhds 0) := by    convert h_sum_zero using 2 ; erw [Finset.sum_Ico_eq_sub _ _] <;> norm_num [Finset.sum_range_succ']  simpa [Finset.sum_range_succ] using h_sum_zero.sub (show Filter.Tendsto (fun x :  => (μ ⌊x⌋₊ : ) / ⌊x⌋₊) Filter.atTop (nhds 0) from tendsto_zero_iff_norm_tendsto_zero.mpr <| squeeze_zero (fun _ => by positivity) (fun x => by simpa using div_le_div_of_nonneg_right (show |(μ ⌊x⌋₊ : )|  1 from mod_cast by { unfold ArithmeticFunction.moebius; aesop }) <| Nat.cast_nonneg _) <| tendsto_inv_atTop_zero.comp <| tendsto_natCast_atTop_atTop.comp <| tendsto_nat_floor_atTop)