Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 2b43587

Browse files
committed
feat(measure_theory/hausdorff_measure): Hausdorff measure and volume coincide in pi types (#8554)
co-authored by Yury Kudryashov
1 parent a983f24 commit 2b43587

File tree

1 file changed

+176
-1
lines changed

1 file changed

+176
-1
lines changed

src/measure_theory/measure/hausdorff.lean

Lines changed: 176 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Authors: Yury Kudryashov
66
import topology.metric_space.metric_separated
77
import measure_theory.constructions.borel_space
88
import analysis.special_functions.pow
9+
import measure_theory.measure.lebesgue
10+
import data.equiv.list
911

1012
/-!
1113
# Hausdorff measure and metric (outer) measures
@@ -65,7 +67,7 @@ Hausdorff measure, Hausdorff dimension, dimension, measure, metric measure
6567

6668
open_locale nnreal ennreal topological_space big_operators
6769

68-
open emetric set function filter
70+
open emetric set function filter encodable
6971

7072
noncomputable theory
7173

@@ -357,6 +359,16 @@ begin
357359
simp
358360
end
359361

362+
lemma le_mk_metric (m : ℝ≥0∞ → ℝ≥0∞) (μ : outer_measure X) (hμ : ∀ x, μ {x} = 0)
363+
(r : ℝ≥0∞) (h0 : 0 < r) (hr : ∀ s, diam s ≤ r → ¬s.subsingleton → μ s ≤ m (diam s)) :
364+
μ ≤ mk_metric m :=
365+
le_bsupr_of_le r h0 $ mk_metric'.le_pre.2 $ λ s hs,
366+
begin
367+
by_cases h : s.subsingleton,
368+
exacts [h.induction_on (μ.empty'.trans_le (zero_le _)) (λ x, ((hμ x).trans_le (zero_le _))),
369+
le_supr_of_le h (hr _ hs h)]
370+
end
371+
360372
end outer_measure
361373

362374
/-!
@@ -449,6 +461,14 @@ begin
449461
exact ⟨x, hx⟩ }
450462
end
451463

464+
lemma le_mk_metric (m : ℝ≥0∞ → ℝ≥0∞) (μ : measure X) [has_no_atoms μ] (ε : ℝ≥0∞) (h₀ : 0 < ε)
465+
(h : ∀ s : set X, diam s ≤ ε → ¬s.subsingleton → μ s ≤ m (diam s)) :
466+
μ ≤ mk_metric m :=
467+
begin
468+
rw [← to_outer_measure_le, mk_metric_to_outer_measure],
469+
exact outer_measure.le_mk_metric m μ.to_outer_measure measure_singleton ε h₀ h
470+
end
471+
452472
/-!
453473
### Hausdorff measure and Hausdorff dimension
454474
-/
@@ -458,6 +478,11 @@ def hausdorff_measure (d : ℝ) : measure X := mk_metric (λ r, r ^ d)
458478

459479
localized "notation `μH[` d `]` := measure_theory.measure.hausdorff_measure d" in measure_theory
460480

481+
lemma le_hausdorff_measure (d : ℝ) (μ : measure X) [has_no_atoms μ] (ε : ℝ≥0∞) (h₀ : 0 < ε)
482+
(h : ∀ s : set X, diam s ≤ ε → ¬s.subsingleton → μ s ≤ diam s ^ d) :
483+
μ ≤ μH[d] :=
484+
le_mk_metric _ μ ε h₀ h
485+
461486
/-- A formula for `μH[d] s` that works for all `d`. In case of a positive `d` a simpler formula
462487
is available as `measure_theory.measure.hausdorff_measure_apply`. -/
463488
lemma hausdorff_measure_apply' (d : ℝ) (s : set X) :
@@ -481,6 +506,50 @@ begin
481506
{ refl }
482507
end
483508

509+
/-- To bound the Hausdorff measure of a set, one may use coverings with maximum diameter tending
510+
to `0`, indexed by any sequence of encodable types. -/
511+
lemma hausdorff_measure_le {β : Type*} {ι : β → Type*} [hι : ∀ n, encodable (ι n)]
512+
{d : ℝ} (hd : 0 < d) (s : set X)
513+
{l : filter β} (r : β → ℝ≥0∞) (hr : tendsto r l (𝓝 0)) (t : Π (n : β), ι n → set X)
514+
(ht : ∀ᶠ n in l, ∀ i, diam (t n i) ≤ r n) (hst : ∀ᶠ n in l, s ⊆ ⋃ i, t n i) :
515+
μH[d] s ≤ liminf l (λ n, ∑' i, diam (t n i) ^ d) :=
516+
begin
517+
classical,
518+
rw hausdorff_measure_apply hd,
519+
refine le_of_forall_le_of_dense (λ c hc, _),
520+
refine supr_le (λ i, supr_le (λ hi, _)),
521+
rcases ((frequently_lt_of_liminf_lt (by is_bounded_default) hc).and_eventually
522+
((((tendsto_order.1 hr).2 _ hi)).and (ht.and hst))).exists with ⟨n, hn, hrn, htn, hstn⟩,
523+
let u : ℕ → set X := λ j, option.elim (decode₂ (ι n) j) ∅ (t n),
524+
refine (infi_le _ u).trans _,
525+
have : s ⊆ ⋃ j, u j,
526+
{ assume x hx,
527+
rcases mem_Union.1 (hstn hx) with ⟨w, hw⟩,
528+
apply mem_Union.2 ⟨encode w, _⟩,
529+
simp only [u],
530+
rw encodek₂ w,
531+
simpa },
532+
refine (infi_le _ this).trans _,
533+
have : ∀ (j : ℕ), diam (u j) ≤ i,
534+
{ assume j,
535+
apply le_trans _ hrn.le,
536+
simp only [u],
537+
generalize : decode₂ (ι n) j = e,
538+
cases e,
539+
{ simp },
540+
{ simp [htn e] } },
541+
refine (infi_le _ this).trans _,
542+
have A : ∀ (j : ℕ), j ∉ range (encode : ι n → ℕ) → diam (u j) ^ d = 0,
543+
{ assume j hj,
544+
have : decode₂ (ι n) j = none, by simpa [← decode₂_ne_none_iff] using hj,
545+
simp [u, this, hd] },
546+
have B : has_sum ((λ (j : ℕ), diam (u j) ^ d) ∘ (encode : ι n → ℕ)) (∑' i, diam (t n i) ^ d),
547+
by simp only [u, comp, encodek₂, ennreal.summable.has_sum, option.elim],
548+
rw function.injective.has_sum_iff encode_injective A at B,
549+
rw [B.tsum_eq],
550+
exact hn.le
551+
end
552+
484553
/-- If `d₁ < d₂`, then for any set `s` we have either `μH[d₂] s = 0`, or `μH[d₁] s = ∞`. -/
485554
lemma hausdorff_measure_zero_or_top {d₁ d₂ : ℝ} (h : d₁ < d₂) (s : set X) :
486555
μH[d₂] s = 0 ∨ μH[d₁] s = ∞ :=
@@ -597,4 +666,110 @@ by rw [sUnion_eq_bUnion, dimH_bUnion hS]
597666
@[simp] lemma dimH_union (s t : set X) : dimH (s ∪ t) = max (dimH s) (dimH t) :=
598667
by rw [union_eq_Union, dimH_Union, supr_bool_eq, cond, cond, ennreal.sup_eq_max]
599668

669+
/-!
670+
### Hausdorff measure and Lebesgue measure
671+
-/
672+
673+
/-- In the space `ι → ℝ`, Hausdorff measure coincides exactly with Lebesgue measure. -/
674+
theorem hausdorff_measure_pi_real {ι : Type*} [fintype ι] [nonempty ι] :
675+
(μH[fintype.card ι] : measure (ι → ℝ)) = volume :=
676+
begin
677+
classical,
678+
-- it suffices to check that the two measures coincide on products of rational intervals
679+
refine (pi_eq_generate_from (λ i, real.borel_eq_generate_from_Ioo_rat.symm)
680+
(λ i, real.is_pi_system_Ioo_rat) (λ i, real.finite_spanning_sets_in_Ioo_rat _)
681+
_).symm,
682+
simp only [mem_Union, mem_singleton_iff],
683+
-- fix such a product `s` of rational intervals, of the form `Π (a i, b i)`.
684+
intros s hs,
685+
choose a b H using hs,
686+
obtain rfl : s = λ i, Ioo (a i) (b i), from funext (λ i, (H i).2), replace H := λ i, (H i).1,
687+
apply le_antisymm _,
688+
-- first check that `volume s ≤ μH s`
689+
{ have Hle : volume ≤ (μH[fintype.card ι] : measure (ι → ℝ)),
690+
{ refine le_hausdorff_measure _ _ ∞ ennreal.coe_lt_top (λ s h₁ h₂, _),
691+
rw [ennreal.rpow_nat_cast],
692+
exact real.volume_pi_le_diam_pow s },
693+
rw [← volume_pi_pi (λ i, Ioo (a i : ℝ) (b i)) (λ i, measurable_set_Ioo)],
694+
exact measure.le_iff'.1 Hle _ },
695+
/- For the other inequality `μH s ≤ volume s`, we use a covering of `s` by sets of small diameter
696+
`1/n`, namely cubes with left-most point of the form `a i + f i / n` with `f i` ranging between
697+
`0` and `⌈(b i - a i) * n⌉`. Their number is asymptotic to `n^d * Π (b i - a i)`. -/
698+
have Hpos' : 0 < fintype.card ι := fintype.card_pos_iff.2 ‹nonempty ι›,
699+
have Hpos : 0 < (fintype.card ι : ℝ), by simp only [Hpos', nat.cast_pos],
700+
have I : ∀ i, 0 ≤ (b i : ℝ) - a i := λ i, by simpa only [sub_nonneg, rat.cast_le] using (H i).le,
701+
let γ := λ (n : ℕ), (Π (i : ι), fin ⌈((b i : ℝ) - a i) * n⌉₊),
702+
haveI : ∀ n, encodable (γ n) := λ n, (fintype_pi ι (λ (i : ι), fin _)).out,
703+
let t : Π (n : ℕ), γ n → set (ι → ℝ) :=
704+
λ n f, set.pi univ (λ i, Icc (a i + f i / n) (a i + (f i + 1) / n)),
705+
have A : tendsto (λ (n : ℕ), 1/(n : ℝ≥0∞)) at_top (𝓝 0),
706+
by simp only [one_div, ennreal.tendsto_inv_nat_nhds_zero],
707+
have B : ∀ᶠ n in at_top, ∀ (i : γ n), diam (t n i) ≤ 1 / n,
708+
{ apply eventually_at_top.21, λ n hn, _⟩,
709+
assume f,
710+
apply diam_pi_le_of_le (λ b, _),
711+
simp only [real.ediam_Icc, add_div, ennreal.of_real_div_of_pos (nat.cast_pos.mpr hn), le_refl,
712+
add_sub_add_left_eq_sub, add_sub_cancel', ennreal.of_real_one, ennreal.of_real_coe_nat] },
713+
have C : ∀ᶠ n in at_top, set.pi univ (λ (i : ι), Ioo (a i : ℝ) (b i)) ⊆ ⋃ (i : γ n), t n i,
714+
{ apply eventually_at_top.21, λ n hn, _⟩,
715+
have npos : (0 : ℝ) < n := nat.cast_pos.2 hn,
716+
assume x hx,
717+
simp only [mem_Ioo, mem_univ_pi] at hx,
718+
simp only [mem_Union, mem_Ioo, mem_univ_pi, coe_coe],
719+
let f : γ n := λ i, ⟨⌊(x i - a i) * n⌋₊,
720+
begin
721+
apply nat_floor_lt_nat_ceil_of_lt_of_pos,
722+
{ refine (mul_lt_mul_right npos).2 _,
723+
simp only [(hx i).right, sub_lt_sub_iff_right] },
724+
{ refine mul_pos _ npos,
725+
simpa only [rat.cast_lt, sub_pos] using H i }
726+
end⟩,
727+
refine ⟨f, λ i, ⟨_, _⟩⟩,
728+
{ calc (a i : ℝ) + ⌊(x i - a i) * n⌋₊ / n
729+
≤ (a i : ℝ) + ((x i - a i) * n) / n :
730+
begin
731+
refine add_le_add le_rfl ((div_le_div_right npos).2 _),
732+
exact nat_floor_le (mul_nonneg (sub_nonneg.2 (hx i).1.le) npos.le),
733+
end
734+
... = x i : by field_simp [npos.ne'] },
735+
{ calc x i
736+
= (a i : ℝ) + ((x i - a i) * n) / n : by field_simp [npos.ne']
737+
... ≤ (a i : ℝ) + (⌊(x i - a i) * n⌋₊ + 1) / n :
738+
add_le_add le_rfl ((div_le_div_right npos).2 (lt_nat_floor_add_one _).le) } },
739+
calc μH[fintype.card ι] (set.pi univ (λ (i : ι), Ioo (a i : ℝ) (b i)))
740+
≤ liminf at_top (λ (n : ℕ), ∑' (i : γ n), diam (t n i) ^ ↑(fintype.card ι)) :
741+
hausdorff_measure_le Hpos (set.pi univ (λ i, Ioo (a i : ℝ) (b i)))
742+
(λ (n : ℕ), 1/(n : ℝ≥0∞)) A t B C
743+
... ≤ liminf at_top (λ (n : ℕ), ∑' (i : γ n), (1/n) ^ (fintype.card ι)) :
744+
begin
745+
refine liminf_le_liminf _ (by is_bounded_default),
746+
filter_upwards [B],
747+
assume n hn,
748+
apply ennreal.tsum_le_tsum (λ i, _),
749+
simp only [← ennreal.rpow_nat_cast],
750+
exact ennreal.rpow_le_rpow (hn i) Hpos.le,
751+
end
752+
... = liminf at_top (λ (n : ℕ), ∏ (i : ι), (⌈((b i : ℝ) - a i) * n⌉₊ : ℝ≥0∞) / n) :
753+
begin
754+
congr' 1,
755+
ext1 n,
756+
simp only [tsum_fintype, finset.card_univ, nat.cast_prod, one_div, fintype.card_fin,
757+
finset.sum_const, nsmul_eq_mul, fintype.card_pi],
758+
simp_rw [← finset.card_univ, ← finset.prod_const, ← finset.prod_mul_distrib],
759+
refl,
760+
end
761+
... = ∏ (i : ι), volume (Ioo (a i : ℝ) (b i)) :
762+
begin
763+
simp only [real.volume_Ioo],
764+
apply tendsto.liminf_eq,
765+
refine ennreal.tendsto_finset_prod_of_ne_top _ (λ i hi, _) (λ i hi, _),
766+
{ apply tendsto.congr' _ ((ennreal.continuous_of_real.tendsto _).comp
767+
((tendsto_nat_ceil_mul_div_at_top (I i)).comp tendsto_coe_nat_at_top_at_top)),
768+
apply eventually_at_top.21, λ n hn, _⟩,
769+
simp only [ennreal.of_real_div_of_pos (nat.cast_pos.mpr hn), comp_app,
770+
ennreal.of_real_coe_nat] },
771+
{ simp only [ennreal.of_real_ne_top, ne.def, not_false_iff] }
772+
end
773+
end
774+
600775
end measure_theory

0 commit comments

Comments
 (0)