Skip to content

Commit e92bd21

Browse files
sgouezelfpvandoorn
andauthored
feat: complete proof of Lemma 8.0.1 (#278)
I've also made a few changes throughout the files to get the right statement of Lemma 8.0.1: * instead of the norms `iLipNorm` (Lipschitz) and `hnorm` (Hölder), we now have versions defined using sups in ENNReal, called `iLipENorm` and `iHolENorm`, and their images in NNReal called `iLipNNNorm` and `iHolNNNorm`. * The definition of the Hölder norm has been fixed. It used to be ```lean ⨆ (x ∈ ball x₀ R), (‖ϕ x‖₊ : ℝ≥0∞) + R ^ τ * ⨆ (x ∈ ball x₀ R) (y ∈ ball x₀ R) (_ : x ≠ y), (‖ϕ x - ϕ y‖₊ / (nndist x y) ^ τ : ℝ≥0∞) ``` where the second sup was included in the first sup because of the lack of parentheses. * The definition of the class `IsCancellative` has been fixed: it required the test function to be globally Lipschitz, while the right condition is Lipschitz on a ball * With the change of `IsCancellative`, the proof that it is satisfied on the real line becomes harder. I had to change a little bit the Lean statement and proof of the classical Van der Corput lemma (requiring only a Lipschitz function on a ball) -- now it matches the statement in the blueprint. * I have streamlined the proof of `IsCancellative` on the real line, using new API around the Lipschitz and Hölder norms * For doubling measures, I have added the statement ```lean lemma measure_ball_le_same'' (x : X) {r t : ℝ} (ht : 0 < t) (h't : t ≤ 1) : μ.real (ball x r) ≤ A * t ^ (- Real.logb 2 A) * μ.real (ball x (t * r)) ``` Once this is established, this avoids juggling with powers of 2 in the proof of Lemma 8.0.1. I don't know if there are other places in the files where it could be used to streamline arguments. * Use enorm instead of the coercion of nnnorm wherever I've noticed it I can split in in smaller PRs if you prefer. --------- Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com>
1 parent 568cd95 commit e92bd21

File tree

11 files changed

+731
-276
lines changed

11 files changed

+731
-276
lines changed

Carleson/Antichain/TileCorrelation.lean

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -38,58 +38,67 @@ lemma ENNReal.mul_div_mul_comm {a b c d : ℝ≥0∞} (hc : c ≠ ⊤) (hd : d
3838
ring
3939

4040
lemma aux_6_2_3 (s₁ s₂ : ℤ) (x₁ x₂ y y' : X) :
41-
(‖Ks s₂ x₂ y‖₊ : ℝ≥0∞) * (‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖₊ : ℝ≥0∞)
41+
‖Ks s₂ x₂ y‖ₑ * ‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖
4242
↑(C2_1_3 ↑a) / volume (ball x₂ (↑D ^ s₂)) *
4343
(↑(D2_1_3 ↑a) / volume (ball x₁ (↑D ^ s₁)) * (↑(nndist y y') ^ τ / ↑((D : ℝ≥0) ^ s₁) ^ τ)) := by
4444
have hτ : 0 ≤ τ := by simp only [defaultτ, inv_nonneg, Nat.cast_nonneg]
45-
apply mul_le_mul nnnorm_Ks_le _ (zero_le _) (zero_le _)
45+
apply mul_le_mul enorm_Ks_le _ (zero_le _) (zero_le _)
4646
convert nnnorm_Ks_sub_Ks_le
4747
rw [← ENNReal.div_rpow_of_nonneg _ _ hτ]
4848
simp only [defaultτ]
4949
congr
5050
rw [ENNReal.coe_zpow (by simp)]
5151
rfl
5252

53+
/- TODO: PR-/
54+
@[simp, rclike_simps] lemma _root_.RCLike.enorm_conj {𝕜 : Type*} [RCLike 𝕜] (z : 𝕜) :
55+
‖conj z‖ₑ = ‖z‖ₑ := by simp [enorm]
56+
57+
namespace Real
58+
59+
/- TODO: PR-/
60+
theorem toNNReal_zpow {x : ℝ} (hx : 0 ≤ x) (n : ℤ) : (x ^ n).toNNReal = x.toNNReal ^ n := by
61+
rw [← NNReal.coe_inj, NNReal.coe_zpow, Real.coe_toNNReal _ (zpow_nonneg hx _),
62+
Real.coe_toNNReal x hx]
63+
64+
end Real
65+
5366
-- Eq. 6.2.3 (Lemma 6.2.1)
5467
lemma correlation_kernel_bound (ha : 1 < a) {s₁ s₂ : ℤ} (hs₁ : s₁ ∈ Icc (- (S : ℤ)) s₂)
5568
{x₁ x₂ : X} :
56-
hnorm (a := a) (correlation s₁ s₂ x₁ x₂) x₁ (↑D ^s₁) ≤
69+
iHolENorm (correlation s₁ s₂ x₁ x₂) x₁ (↑D ^s₁) ≤
5770
(C_6_2_1 a : ℝ≥0∞) / (volume (ball x₁ (↑D ^s₁)) * volume (ball x₂ (↑D ^s₂))) := by
5871
-- 6.2.4
59-
have hφ' : ∀ y : X, ‖correlation s₁ s₂ x₁ x₂ y‖
72+
have hφ' (y : X) : ‖correlation s₁ s₂ x₁ x₂ y‖
6073
(C2_1_3 a)^2 / ((volume (ball x₁ (D ^ s₁))) * (volume (ball x₂ (D ^ s₂)))) := by
61-
intro y
62-
simp only [correlation, nnnorm_mul, RCLike.nnnorm_conj, ENNReal.coe_mul, pow_two,
74+
simp only [correlation, enorm_mul, RCLike.enorm_conj, pow_two,
6375
ENNReal.mul_div_mul_comm (measure_ball_ne_top _ _) (measure_ball_ne_top _ _)]
64-
exact mul_le_mul nnnorm_Ks_le nnnorm_Ks_le (zero_le _) (zero_le _)
65-
76+
exact mul_le_mul enorm_Ks_le enorm_Ks_le (zero_le _) (zero_le _)
6677
-- 6.2.6 + 6.2.7
67-
have hsimp : ∀ (y y' : X),
68-
(‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖₊ : ℝ≥0∞)
69-
‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y‖ +
70-
‖Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖ := by
78+
have hsimp : ∀ (y y' : X),
79+
‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖
80+
‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y‖ +
81+
‖Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖ := by
7182
intro y y'
72-
calc (‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖₊ : ℝ≥0∞)
83+
calc ‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖
7384
_ = ‖conj (Ks s₁ x₁ y) * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * Ks s₂ x₂ y +
74-
(conj (Ks s₁ x₁ y') * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * (Ks s₂ x₂ y'))‖ := by
85+
(conj (Ks s₁ x₁ y') * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * (Ks s₂ x₂ y'))‖ := by
7586
simp only [correlation, sub_add_sub_cancel]
76-
_ ≤ ‖conj (Ks s₁ x₁ y) * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * Ks s₂ x₂ y ‖₊ +
77-
‖conj (Ks s₁ x₁ y') * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * (Ks s₂ x₂ y')‖₊ := by
78-
norm_cast
79-
exact nnnorm_add_le _ _
80-
_ = ‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y‖₊ +
81-
‖Ks s₁ x₁ y'‖₊ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖₊ := by
82-
norm_cast
83-
simp only [← sub_mul, ← mul_sub, nnnorm_mul, RCLike.nnnorm_conj, ← map_sub]
87+
_ ≤ ‖conj (Ks s₁ x₁ y) * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * Ks s₂ x₂ y ‖ₑ +
88+
‖conj (Ks s₁ x₁ y') * Ks s₂ x₂ y - conj (Ks s₁ x₁ y') * (Ks s₂ x₂ y')‖ₑ :=
89+
enorm_add_le _ _
90+
_ = ‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖ₑ * ‖Ks s₂ x₂ y‖ₑ +
91+
‖Ks s₁ x₁ y'‖ₑ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖ₑ := by
92+
simp only [← sub_mul, ← mul_sub, enorm_mul, RCLike.enorm_conj, ← map_sub]
8493
-- 6.2.5
8594
have hyy' : ∀ (y y' : X) (hy' : y ≠ y'), (((D ^ s₁ : ℝ≥0)) ^ τ) *
86-
(‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖ / (nndist y y')^τ) ≤
95+
(‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖ / (nndist y y')^τ) ≤
8796
(2^(253*a^3) / (volume (ball x₁ (↑D ^s₁)) * volume (ball x₂ (↑D ^s₂)))) := by
8897
intros y y' hy'
8998
rw [mul_comm, ← ENNReal.le_div_iff_mul_le, ENNReal.div_le_iff_le_mul]
90-
calc (‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖₊ : ℝ≥0∞)
91-
_ ≤ ‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖ * ‖Ks s₂ x₂ y‖ +
92-
‖Ks s₁ x₁ y'‖ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖ := hsimp y y' -- 6.2.6 + 6.2.7
99+
calc ‖correlation s₁ s₂ x₁ x₂ y - correlation s₁ s₂ x₁ x₂ y'‖
100+
_ ≤ ‖Ks s₁ x₁ y - Ks s₁ x₁ y'‖ * ‖Ks s₂ x₂ y‖ +
101+
‖Ks s₁ x₁ y'‖ * ‖Ks s₂ x₂ y - Ks s₂ x₂ y'‖ := hsimp y y' -- 6.2.6 + 6.2.7
93102
_ ≤ 2 ^ (252 * a ^ 3) / (volume (ball x₁ (↑D ^ s₁)) * volume (ball x₂ (↑D ^ s₂))) *
94103
(↑(nndist y y') ^ τ / ((D ^ s₁ : ℝ≥0) : ℝ≥0∞) ^ τ +
95104
↑(nndist y y') ^ τ / ((D ^ s₂ : ℝ≥0) : ℝ≥0∞) ^ τ) := by
@@ -101,7 +110,7 @@ lemma correlation_kernel_bound (ha : 1 < a) {s₁ s₂ : ℤ} (hs₁ : s₁ ∈
101110
simp only [ENNReal.mul_div_mul_comm (measure_ball_ne_top _ _) (measure_ball_ne_top _ _),
102111
mul_assoc]
103112
apply add_le_add (aux_6_2_3 s₁ s₂ x₁ x₂ y y')
104-
rw [← neg_sub, nnnorm_neg]
113+
rw [← neg_sub, enorm_neg]
105114
convert aux_6_2_3 s₂ s₁ x₂ x₁ y' y using 1
106115
simp only [← mul_assoc, ← ENNReal.mul_div_mul_comm (measure_ball_ne_top _ _)
107116
(measure_ball_ne_top _ _)]
@@ -175,15 +184,17 @@ lemma correlation_kernel_bound (ha : 1 < a) {s₁ s₂ : ℤ} (hs₁ : s₁ ∈
175184
· left
176185
refine ENNReal.rpow_ne_top_of_nonneg ?ht.h.hy0 ENNReal.coe_ne_top
177186
simp only [defaultτ, inv_nonneg, Nat.cast_nonneg]
178-
calc hnorm (a := a) (correlation s₁ s₂ x₁ x₂) x₁ (↑D ^s₁)
187+
calc iHolENorm (correlation s₁ s₂ x₁ x₂) x₁ (↑D ^s₁)
179188
_ ≤ (C2_1_3 a)^2 / ((volume (ball x₁ (D ^ s₁))) * (volume (ball x₂ (D ^ s₂)))) +
180189
(2^(253*a^3) / (volume (ball x₁ (↑D ^s₁)) * volume (ball x₂ (↑D ^s₂)))) := by
181-
simp only [hnorm]
182-
refine iSup₂_le ?h
183-
intro y _
184-
apply add_le_add (hφ' y)
190+
simp only [iHolENorm]
191+
apply add_le_add
192+
· simp only [iSup_le_iff, hφ', implies_true]
185193
simp only [ENNReal.mul_iSup, iSup_le_iff]
186-
exact fun z _ z' _ hzz' ↦ hyy' z z' hzz'
194+
intro z hz z' hz' hzz'
195+
convert hyy' z z' hzz'
196+
· rw [ENNReal.ofReal, Real.toNNReal_zpow D_nonneg, Real.toNNReal_coe_nat]
197+
· exact edist_nndist z z'
187198
_ ≤ (C_6_2_1 a : ℝ≥0∞) / (volume (ball x₁ (↑D ^s₁)) * volume (ball x₂ (↑D ^s₂))) := by
188199
have h12 : (1 : ℝ≥0∞) ≤ 2 := one_le_two
189200
have h204 : 204253 := by omega

Carleson/Classical/CarlesonOnTheRealLine.lean

Lines changed: 20 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -388,26 +388,19 @@ instance compatibleFunctions_R : CompatibleFunctions ℝ ℝ (2 ^ 4) where
388388
intro x R R' f
389389
exact integer_ball_cover.mono_nat (by norm_num)
390390

391+
open scoped NNReal
391392

392393
instance real_van_der_Corput : IsCancellative ℝ (defaultτ 4) where
393394
/- Lemma 11.7.12 (real van der Corput) from the paper. -/
394395
norm_integral_exp_le := by
395-
intro x r ϕ K hK _ f g
396-
by_cases r_pos : 0 ≥ r
397-
· rw [ball_eq_empty.mpr r_pos]
396+
intro x r ϕ hK _ f g
397+
rcases le_or_lt r 0 with r_nonpos | r_pos
398+
· rw [ball_eq_empty.mpr r_nonpos]
398399
simp
399-
push_neg at r_pos
400400
rw [defaultτ, ← one_div, measureReal_def, Real.volume_ball,
401401
ENNReal.toReal_ofReal (by linarith [r_pos]), Real.ball_eq_Ioo, ← integral_Ioc_eq_integral_Ioo,
402402
← intervalIntegral.integral_of_le (by linarith [r_pos]), dist_integer_linear_eq,
403403
max_eq_left r_pos.le]
404-
set L : NNReal :=
405-
⟨⨆ (x : ℝ) (y : ℝ) (_ : x ≠ y), ‖ϕ x - ϕ y‖ / dist x y,
406-
Real.iSup_nonneg fun x ↦ Real.iSup_nonneg fun y ↦ Real.iSup_nonneg
407-
fun _ ↦ div_nonneg (norm_nonneg _) dist_nonneg⟩ with Ldef
408-
set B : NNReal :=
409-
⟨⨆ y ∈ ball x r, ‖ϕ y‖, Real.iSup_nonneg fun i ↦ Real.iSup_nonneg
410-
fun _ ↦ norm_nonneg _⟩ with Bdef
411404
calc ‖∫ (x : ℝ) in x - r..x + r, (Complex.I * (↑(f x) - ↑(g x))).exp * ϕ x‖
412405
_ = ‖∫ (x : ℝ) in x - r..x + r, (Complex.I * ((↑f - ↑g) : ℤ) * x).exp * ϕ x‖ := by
413406
congr with x
@@ -416,69 +409,29 @@ instance real_van_der_Corput : IsCancellative ℝ (defaultτ 4) where
416409
push_cast
417410
rw [_root_.sub_mul]
418411
norm_cast
419-
_ ≤ 2 * π * ((x + r) - (x - r)) * (B + L * ((x + r) - (x - r)) / 2) *
412+
_ ≤ 2 * π * ((x + r) - (x - r)) * (iLipNNNorm ϕ x r +
413+
(iLipNNNorm ϕ x r / r.toNNReal : ℝ≥0) * ((x + r) - (x - r)) / 2) *
420414
(1 + |((↑f - ↑g) : ℤ)| * ((x + r) - (x - r)))⁻¹ := by
421415
apply van_der_Corput (by linarith)
422-
· rw [lipschitzWith_iff_dist_le_mul]
423-
intro x y
424-
--TODO: The following could be externalised as a lemma.
425-
by_cases hxy : x = y
426-
· rw [hxy]
427-
simp
428-
rw [dist_eq_norm, ← div_le_iff₀ (dist_pos.mpr hxy), Ldef, NNReal.coe_mk]
429-
apply le_ciSup_of_le _ x
430-
on_goal 1 => apply le_ciSup_of_le _ y
431-
on_goal 1 => apply le_ciSup_of_le _ hxy
432-
· rfl
433-
· use K
434-
rw [upperBounds]
435-
simp only [ne_eq, Set.mem_range, exists_prop, and_imp,
436-
forall_apply_eq_imp_iff, Set.mem_setOf_eq]
437-
intro h
438-
rw [div_le_iff₀ (dist_pos.mpr h), dist_eq_norm]
439-
exact LipschitzWith.norm_sub_le hK _ _
440-
· use K
441-
rw [upperBounds]
442-
simp only [ne_eq, Set.mem_range, forall_exists_index,
443-
forall_apply_eq_imp_iff, Set.mem_setOf_eq]
444-
intro y
445-
apply Real.iSup_le _ NNReal.zero_le_coe
446-
intro h
447-
rw [div_le_iff₀ (dist_pos.mpr h), dist_eq_norm]
448-
exact LipschitzWith.norm_sub_le hK _ _
449-
· use K
450-
rw [upperBounds]
451-
simp only [ne_eq, Set.mem_range, forall_exists_index,
452-
forall_apply_eq_imp_iff, Set.mem_setOf_eq]
453-
intro x
454-
apply Real.iSup_le _ NNReal.zero_le_coe
455-
intro y
456-
apply Real.iSup_le _ NNReal.zero_le_coe
457-
intro h
458-
rw [div_le_iff₀ (dist_pos.mpr h), dist_eq_norm]
459-
apply LipschitzWith.norm_sub_le hK
460-
· --prove main property of B
461-
intro y hy
462-
apply ConditionallyCompleteLattice.le_biSup
463-
· --TODO: externalize as lemma LipschitzWithOn.BddAbove or something like that?
464-
rw [Real.ball_eq_Ioo]
465-
exact BddAbove.mono (Set.image_mono Set.Ioo_subset_Icc_self)
466-
(isCompact_Icc.bddAbove_image (continuous_norm.comp hK.continuous).continuousOn)
467-
use y
468-
rw [Real.ball_eq_Ioo]
469-
use hy
470-
_ = 2 * π * (2 * r) * (B + r * L) * (1 + 2 * r * |((↑f - ↑g) : ℤ)|)⁻¹ := by
416+
· rw [Ioo_eq_ball]
417+
simp only [sub_add_add_cancel, add_self_div_two, add_sub_sub_cancel]
418+
apply LipschitzOnWith.of_iLipENorm_ne_top hK
419+
· intro y hy
420+
apply norm_le_iLipNNNorm_of_mem hK
421+
rwa [Real.ball_eq_Ioo]
422+
_ = 2 * π * (2 * r) * (iLipNNNorm ϕ x r + r * (iLipNNNorm ϕ x r / r.toNNReal : ℝ≥0))
423+
* (1 + 2 * r * |((↑f - ↑g) : ℤ)|)⁻¹ := by
471424
ring
472-
_ ≤ (2 ^ 4 : ℕ) * (2 * r) * iLipNorm ϕ x r *
425+
_ = 2 * π * (2 * r) * (iLipNNNorm ϕ x r + iLipNNNorm ϕ x r)
426+
* (1 + 2 * r * |((↑f - ↑g) : ℤ)|)⁻¹ := by
427+
congr
428+
rw [NNReal.coe_div, Real.coe_toNNReal _ r_pos.le, mul_div_cancel₀ _ r_pos.ne']
429+
_ = 4 * π * (2 * r) * iLipNNNorm ϕ x r * (1 + 2 * r * ↑|(↑f - ↑g : ℤ)|)⁻¹ := by ring
430+
_ ≤ (2 ^ 4 : ℕ) * (2 * r) * iLipNNNorm ϕ x r *
473431
(1 + 2 * r * ↑|(↑f - ↑g : ℤ)|) ^ (- (1 / (4 : ℝ))) := by
474432
gcongr
475-
· exact mul_nonneg (mul_nonneg (by norm_num) (by linarith)) (iLipNorm_nonneg r_pos.le)
476433
· norm_num
477434
linarith [pi_le_four]
478-
· unfold iLipNorm
479-
gcongr
480-
· apply le_of_eq Bdef
481-
· apply le_of_eq Ldef
482435
· rw [← Real.rpow_neg_one]
483436
apply Real.rpow_le_rpow_of_exponent_le _ (by norm_num)
484437
simp only [Int.cast_abs, Int.cast_sub, le_add_iff_nonneg_right]

0 commit comments

Comments
 (0)