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

Smooth1ContinuousAt

PrimeNumberTheoremAnd.MellinCalculus · PrimeNumberTheoremAnd/MellinCalculus.lean:1389 to 1485

Mathematical statement

Exact Lean statement

@[blueprint
  (title := "Smooth1ContinuousAt")
  (statement := /--
  Fix a nonnegative, continuously differentiable function $F$ on $\mathbb{R}$ with support in
  $[1/2,2]$. Then for any $\epsilon>0$, the function
  $x \mapsto \int_{(0,\infty)} x^{1+it} \widetilde{1_{\epsilon}}(x) dx$ is continuous at any $y>0$.
  -/)
  (proof := /--
  Use Lemma \ref{MellinconvolutionSymmetric} to write $\widetilde{1_{\epsilon}}(x)$ as an integral
  over an integral near $1$, in particular avoiding the singularity at $0$. The integrand may be
  bounded by $2^{\epsilon}\nu_\epsilon(t)$ which is independent of $x$ and we can use dominated
  convergence to prove continuity.
  -/)
  (latexEnv := "lemma")]
lemma Smooth1ContinuousAt {SmoothingF : ℝ → ℝ}
    (diffSmoothingF : ContDiff ℝ 1 SmoothingF)
    (SmoothingFpos : ∀ x > 0, 0 ≤ SmoothingF x)
    (suppSmoothingF : SmoothingF.support ⊆ Icc (1 / 2) 2)
    {ε : ℝ} (εpos : 0 < ε) {y : ℝ} (ypos : 0 < y) :
    ContinuousAt (fun x ↦ Smooth1 SmoothingF ε x) y

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
@[blueprint  (title := "Smooth1ContinuousAt")  (statement := /--  Fix a nonnegative, continuously differentiable function $F$ on $\mathbb{R}$ with support in  $[1/2,2]$. Then for any $\epsilon>0$, the function  $x \mapsto \int_{(0,\infty)} x^{1+it} \widetilde{1_{\epsilon}}(x) dx$ is continuous at any $y>0$.  -/)  (proof := /--  Use Lemma \ref{MellinconvolutionSymmetric} to write $\widetilde{1_{\epsilon}}(x)$ as an integral  over an integral near $1$, in particular avoiding the singularity at $0$. The integrand may be  bounded by $2^{\epsilon}\nu_\epsilon(t)$ which is independent of $x$ and we can use dominated  convergence to prove continuity.  -/)  (latexEnv := "lemma")]lemma Smooth1ContinuousAt {SmoothingF :   }    (diffSmoothingF : ContDiff  1 SmoothingF)    (SmoothingFpos :  x > 0, 0  SmoothingF x)    (suppSmoothingF : SmoothingF.support  Icc (1 / 2) 2)    {ε : } (εpos : 0 < ε) {y : } (ypos : 0 < y) :    ContinuousAt (fun x  Smooth1 SmoothingF ε x) y := by  apply ContinuousAt.congr    (f := (fun x  MellinConvolution (DeltaSpike SmoothingF ε)      (fun x  if 0 < x  x  1 then 1 else 0) x)) _  · filter_upwards [lt_mem_nhds ypos] with x hx    apply MellinConvolutionSymmetric _ _ hx  apply continuousAt_of_dominated (bound := (fun x  2 ^ ε * DeltaSpike SmoothingF ε x))  · filter_upwards [lt_mem_nhds ypos] with x hx    apply Measurable.aestronglyMeasurable    apply Measurable.mul    · apply Measurable.mul      · exact Continuous.measurable <| DeltaSpikeContinuous εpos diffSmoothingF      · apply Measurable.ite _ (by fun_prop) (by fun_prop)        apply MeasurableSet.congr (s := Ici x) (by measurability)        ext a        constructor        · intro ha          have apos : 0 < a := lt_of_lt_of_le hx ha          constructor          · exact div_pos hx apos          · exact (div_le_one apos).mpr ha        · intro ha          have : 0 < a := (div_pos_iff_of_pos_left hx).mp ha.1          exact (div_le_one this).mp ha.2    · fun_prop  · filter_upwards [lt_mem_nhds ypos] with x hx    filter_upwards [ae_restrict_mem (by measurability)] with t ht    simp only [mul_ite, mul_one, mul_zero, RCLike.ofReal_real_eq_id, id_eq, norm_div, norm_eq_abs]    by_cases! h : DeltaSpike SmoothingF ε t = 0    · simp [h]    have := DeltaSpikeSupport' εpos ht.le suppSmoothingF h    have dsnonneg : 0  DeltaSpike SmoothingF ε t := by      apply DeltaSpikeNonNeg_of_NonNeg <;> assumption    calc      _  |DeltaSpike SmoothingF ε t| / |t| := by        gcongr        · split_ifs with h          · apply le_refl          · exact dsnonneg      _  _ := by        rw [_root_.abs_of_nonneg dsnonneg, mul_comm, div_eq_mul_one_div, _root_.abs_of_pos ht]        gcongr        apply (one_div_le ht (by bound)).mpr        · convert this.1 using 1          rw [div_eq_iff (by positivity),  rpow_add (by norm_num), neg_add_cancel, rpow_zero]  · apply Integrable.const_mul    apply (integrable_indicator_iff (by measurability)).mp    apply (integrableOn_iff_integrable_of_support_subset (s := Icc (2 ^ (-ε)) (2 ^ ε)) _).mp    · apply ContinuousOn.integrableOn_compact isCompact_Icc      apply ContinuousOn.congr  (f := DeltaSpike SmoothingF ε)      · apply Continuous.continuousOn        apply DeltaSpikeContinuous<;> assumption      · intro x hx        have : x  Ioi 0 := by          apply mem_Ioi.mpr          apply lt_of_lt_of_le (by bound) hx.1        rw [indicator, if_pos this]    · unfold indicator      simp_rw [mem_Ioi]      apply Function.support_subset_iff.mpr      simp only [ne_eq, ite_eq_right_iff, Classical.not_imp, mem_Icc, and_imp]      intro x hx      apply DeltaSpikeSupport' εpos hx.le suppSmoothingF  · have : ᵐ (a : ) ∂volume.restrict (Ioi 0), a  y := by      apply ae_iff.mpr      simp    filter_upwards [ae_restrict_mem (by measurability), this] with x hx hx2    simp only [mem_Ioi] at hx    apply ContinuousAt.div_const    apply ContinuousAt.mul (by fun_prop)    have : (fun x_1  if 0 < x_1 / x  x_1 / x  1 then 1 else 0) =        (Ioc 0 x).indicator (fun _  (1 : )) := by      ext t      unfold indicator      simp [div_pos_iff_of_pos_right, div_le_one₀, hx]    rw [this]    apply ContinuousOn.continuousAt_indicator (by fun_prop)    simp [frontier_Ioc hx, ypos.ne', hx2.symm]