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

Commit cc0d839

Browse files
committed
feat(measure_theory/measure/haar): cleanup, link with the is_haar_measure typeclass (#9244)
We show that the Haar measure constructed in `measure_theory/measure/haar` satisfies the `is_haar_measure` typeclass, and use the existence to show a few further properties of all Haar measures. Also weaken a little bit some assumptions in this file.
1 parent 602ad58 commit cc0d839

File tree

4 files changed

+146
-32
lines changed

4 files changed

+146
-32
lines changed

src/data/real/ennreal.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,15 @@ lemma mul_left_mono : monotone ((*) a) := λ b c, mul_le_mul (le_refl a)
610610

611611
lemma mul_right_mono : monotone (λ x, x * a) := λ b c h, mul_le_mul h (le_refl a)
612612

613+
lemma pow_strict_mono {n : ℕ} (hn : n ≠ 0) : strict_mono (λ (x : ℝ≥0∞), x^n) :=
614+
begin
615+
assume x y hxy,
616+
obtain ⟨n, rfl⟩ := nat.exists_eq_succ_of_ne_zero hn,
617+
induction n with n IH,
618+
{ simp only [hxy, pow_one] },
619+
{ simp only [pow_succ _ n.succ, mul_lt_mul hxy (IH (nat.succ_pos _).ne')] }
620+
end
621+
613622
lemma max_mul : max a b * c = max (a * c) (b * c) :=
614623
mul_right_mono.map_max
615624

src/measure_theory/measure/haar.lean

Lines changed: 105 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This is essentially the same argument as in
1818
https://en.wikipedia.org/wiki/Haar_measure#A_construction_using_compact_subsets.
1919
2020
We construct the Haar measure first on compact sets. For this we define `(K : U)` as the (smallest)
21-
number of left-translates of `U` are needed to cover `K` (`index` in the formalization).
21+
number of left-translates of `U` that are needed to cover `K` (`index` in the formalization).
2222
Then we define a function `h` on compact sets as `lim_U (K : U) / (K₀ : U)`,
2323
where `U` becomes a smaller and smaller open neighborhood of `1`, and `K₀` is a fixed compact set
2424
with nonempty interior. This function is `chaar` in the formalization, and we define the limit
@@ -42,6 +42,10 @@ where `ᵒ` denotes the interior.
4242
* `haar_measure_self`: the Haar measure is normalized.
4343
* `is_left_invariant_haar_measure`: the Haar measure is left invariant.
4444
* `regular_haar_measure`: the Haar measure is a regular measure.
45+
* `is_haar_measure_haar_measure`: the Haar measure satisfies the `is_haar_measure` typeclass, i.e.,
46+
it is invariant and gives finite mass to compact sets and positive mass to nonempty open sets.
47+
* `haar` : some choice of a Haar measure, on a locally compact Hausdorff group, constructed as
48+
`haar_measure K` where `K` is some arbitrary choice of a compact set with nonempty interior.
4549
4650
## References
4751
* Paul Halmos (1950), Measure Theory, §53
@@ -54,7 +58,7 @@ where `ᵒ` denotes the interior.
5458
noncomputable theory
5559

5660
open set has_inv function topological_space measurable_space
57-
open_locale nnreal classical ennreal pointwise
61+
open_locale nnreal classical ennreal pointwise topological_space
5862

5963
variables {G : Type*} [group G]
6064

@@ -506,24 +510,12 @@ scaled so that `add_haar_measure K₀ K₀ = 1`."]
506510
def haar_measure (K₀ : positive_compacts G) : measure G :=
507511
((haar_content K₀).outer_measure K₀.1)⁻¹ • (haar_content K₀).measure
508512

509-
-- Unfortunately we have to manually give the additive version here
510-
lemma add_haar_measure_apply {G : Type*} [add_group G] [topological_space G] [t2_space G]
511-
[topological_add_group G] [measurable_space G] [borel_space G] {K₀ : positive_compacts G}
512-
{s : set G} (hs : measurable_set s) : add_haar_measure K₀ s =
513-
(add_haar_content K₀).outer_measure s / (add_haar_content K₀).outer_measure K₀.1 :=
514-
begin
515-
delta add_haar_measure,
516-
simp only [hs, div_eq_mul_inv, mul_comm, content.measure_apply, algebra.id.smul_eq_mul,
517-
coe_smul, pi.smul_apply],
518-
end
519-
520513
@[to_additive]
521514
lemma haar_measure_apply {K₀ : positive_compacts G} {s : set G} (hs : measurable_set s) :
522515
haar_measure K₀ s = (haar_content K₀).outer_measure s / (haar_content K₀).outer_measure K₀.1 :=
523516
begin
524-
delta haar_measure,
525-
simp only [hs, div_eq_mul_inv, mul_comm, content.measure_apply, algebra.id.smul_eq_mul,
526-
coe_smul, pi.smul_apply],
517+
change (((haar_content K₀).outer_measure) K₀.val)⁻¹ * (haar_content K₀).measure s = _,
518+
simp only [hs, div_eq_mul_inv, mul_comm, content.measure_apply],
527519
end
528520

529521
@[to_additive]
@@ -538,38 +530,54 @@ begin
538530
end
539531

540532
@[to_additive]
541-
lemma haar_measure_self [locally_compact_space G] {K₀ : positive_compacts G} :
533+
lemma haar_measure_self {K₀ : positive_compacts G} :
542534
haar_measure K₀ K₀.1 = 1 :=
543535
begin
536+
haveI : locally_compact_space G := K₀.locally_compact_space_of_group,
544537
rw [haar_measure_apply K₀.2.1.measurable_set, ennreal.div_self],
545538
{ rw [← pos_iff_ne_zero], exact haar_content_outer_measure_self_pos },
546539
{ exact ne_of_lt (content.outer_measure_lt_top_of_is_compact _ K₀.2.1) }
547540
end
548541

549-
@[to_additive]
550-
lemma haar_measure_pos_of_is_open [locally_compact_space G] {K₀ : positive_compacts G}
551-
{U : set G} (hU : is_open U) (h2U : U.nonempty) : 0 < haar_measure K₀ U :=
552-
begin
553-
rw [haar_measure_apply hU.measurable_set, ennreal.div_pos_iff],
554-
refine ⟨_, ne_of_lt $ content.outer_measure_lt_top_of_is_compact _ K₀.2.1⟩,
555-
rw [← pos_iff_ne_zero],
556-
exact content.outer_measure_pos_of_is_mul_left_invariant _ is_left_invariant_haar_content
557-
⟨K₀.1, K₀.2.1⟩ (by simpa only [haar_content_self] using one_ne_zero) hU h2U
558-
end
559-
560542
/-- The Haar measure is regular. -/
561543
@[to_additive]
562-
instance regular_haar_measure [locally_compact_space G] {K₀ : positive_compacts G} :
544+
instance regular_haar_measure {K₀ : positive_compacts G} :
563545
(haar_measure K₀).regular :=
564546
begin
547+
haveI : locally_compact_space G := K₀.locally_compact_space_of_group,
565548
apply regular.smul,
566549
rw ennreal.inv_ne_top,
567-
exact haar_content_outer_measure_self_pos.ne'
550+
exact haar_content_outer_measure_self_pos.ne',
568551
end
569552

553+
/-- The Haar measure is sigma-finite in a second countable group. -/
554+
@[to_additive]
555+
instance sigma_finite_haar_measure [second_countable_topology G] {K₀ : positive_compacts G} :
556+
sigma_finite (haar_measure K₀) :=
557+
by { haveI : locally_compact_space G := K₀.locally_compact_space_of_group, apply_instance, }
558+
559+
/-- The Haar measure is a Haar measure, i.e., it is invariant and gives finite mass to compact
560+
sets and positive mass to nonempty open sets. -/
561+
@[to_additive]
562+
instance is_haar_measure_haar_measure (K₀ : positive_compacts G) :
563+
is_haar_measure (haar_measure K₀) :=
564+
begin
565+
apply is_haar_measure_of_is_compact_nonempty_interior _ (is_mul_left_invariant_haar_measure K₀)
566+
K₀.1 K₀.2.1 K₀.2.2,
567+
{ simp only [haar_measure_self], exact one_ne_zero },
568+
{ simp only [haar_measure_self], exact ennreal.coe_ne_top },
569+
end
570+
571+
/-- `haar` is some choice of a Haar measure, on a locally compact group. -/
572+
@[reducible, to_additive "`add_haar` is some choice of a Haar measure, on a locally compact
573+
additive group."]
574+
def haar [locally_compact_space G] : measure G :=
575+
haar_measure $ classical.choice (topological_space.nonempty_positive_compacts G)
576+
570577
section unique
571578

572-
variables [locally_compact_space G] [second_countable_topology G] {μ : measure G} [sigma_finite μ]
579+
variables [second_countable_topology G] {μ : measure G} [sigma_finite μ]
580+
573581
/-- The Haar measure is unique up to scaling. More precisely: every σ-finite left invariant measure
574582
is a scalar multiple of the Haar measure. -/
575583
@[to_additive]
@@ -584,13 +592,78 @@ end
584592

585593
@[to_additive]
586594
theorem regular_of_is_mul_left_invariant (hμ : is_mul_left_invariant μ) {K} (hK : is_compact K)
587-
(h2K : (interior K).nonempty) (hμK : μ K ≠ ∞) : regular μ :=
595+
(h2K : (interior K).nonempty) (hμK : μ K ≠ ∞) :
596+
regular μ :=
588597
begin
589598
rw [haar_measure_unique hμ ⟨K, hK, h2K⟩],
590599
exact regular.smul hμK
591600
end
592601

593602
end unique
594603

604+
@[to_additive is_add_haar_measure_eq_smul_is_add_haar_measure]
605+
theorem is_haar_measure_eq_smul_is_haar_measure
606+
[locally_compact_space G] [second_countable_topology G]
607+
(μ ν : measure G) [is_haar_measure μ] [is_haar_measure ν] :
608+
∃ (c : ℝ≥0∞), (c ≠ 0) ∧ (c ≠ ∞) ∧ (μ = c • ν) :=
609+
begin
610+
have K : positive_compacts G := classical.choice (topological_space.nonempty_positive_compacts G),
611+
have νpos : 0 < ν K.1 := haar_pos_of_nonempty_interior _ K.2.2,
612+
have νlt : ν K.1 < ∞ := is_compact.haar_lt_top _ K.2.1,
613+
refine ⟨μ K.1 / ν K.1, _, _, _⟩,
614+
{ simp only [νlt.ne, (μ.haar_pos_of_nonempty_interior K.property.right).ne', ne.def,
615+
ennreal.div_zero_iff, not_false_iff, or_self] },
616+
{ simp only [div_eq_mul_inv, νpos.ne', (is_compact.haar_lt_top μ K.property.left).ne, or_self,
617+
ennreal.inv_eq_top, with_top.mul_eq_top_iff, ne.def, not_false_iff, and_false, false_and] },
618+
{ calc
619+
μ = μ K.1 • haar_measure K : haar_measure_unique (is_mul_left_invariant_haar μ) K
620+
... = (μ K.1 / ν K.1) • (ν K.1 • haar_measure K) :
621+
by rw [smul_smul, div_eq_mul_inv, mul_assoc, ennreal.inv_mul_cancel νpos.ne' νlt.ne, mul_one]
622+
... = (μ K.1 / ν K.1) • ν : by rw ← haar_measure_unique (is_mul_left_invariant_haar ν) K }
623+
end
624+
625+
/-- Any Haar measure is invariant under inversion in a commutative group. -/
626+
@[to_additive]
627+
lemma map_haar_inv
628+
{G : Type*} [comm_group G] [topological_space G] [topological_group G] [t2_space G]
629+
[measurable_space G] [borel_space G] [locally_compact_space G] [second_countable_topology G]
630+
(μ : measure G) [is_haar_measure μ] :
631+
measure.map has_inv.inv μ = μ :=
632+
begin
633+
-- the image measure is a Haar measure. By uniqueness up to multiplication, it is of the form
634+
-- `c μ`. Applying again inversion, one gets the measure `c^2 μ`. But since inversion is an
635+
-- involution, this is also `μ`. Hence, `c^2 = 1`, which implies `c = 1`.
636+
haveI : is_haar_measure (measure.map has_inv.inv μ) :=
637+
is_haar_measure_map μ (mul_equiv.inv G) continuous_inv continuous_inv,
638+
obtain ⟨c, cpos, clt, hc⟩ : ∃ (c : ℝ≥0∞), (c ≠ 0) ∧ (c ≠ ∞) ∧ (measure.map has_inv.inv μ = c • μ)
639+
:= is_haar_measure_eq_smul_is_haar_measure _ _,
640+
have : map has_inv.inv (map has_inv.inv μ) = c^2 • μ,
641+
by simp only [hc, smul_smul, pow_two, linear_map.map_smul],
642+
have μeq : μ = c^2 • μ,
643+
{ rw [map_map continuous_inv.measurable continuous_inv.measurable] at this,
644+
{ simpa only [inv_involutive, involutive.comp_self, map_id] },
645+
all_goals { apply_instance } },
646+
have K : positive_compacts G := classical.choice (topological_space.nonempty_positive_compacts G),
647+
have : c^2 * μ K.1 = 1^2 * μ K.1,
648+
by { conv_rhs { rw μeq },
649+
-- use `change` instead of `simp` to avoid `to_additive` issues
650+
change c ^ 2 * μ K.1 = 1 ^ 2 * (c ^ 2 * μ K.1),
651+
rw [one_pow, one_mul] },
652+
have : c^2 = 1^2 :=
653+
(ennreal.mul_eq_mul_right (haar_pos_of_nonempty_interior _ K.2.2).ne'
654+
(is_compact.haar_lt_top _ K.2.1).ne).1 this,
655+
have : c = 1 := (ennreal.pow_strict_mono two_ne_zero).injective this,
656+
rw [hc, this, one_smul]
657+
end
658+
659+
@[simp, to_additive] lemma haar_preimage_inv
660+
{G : Type*} [comm_group G] [topological_space G] [topological_group G] [t2_space G]
661+
[measurable_space G] [borel_space G] [locally_compact_space G] [second_countable_topology G]
662+
(μ : measure G) [is_haar_measure μ] (s : set G) :
663+
μ (s⁻¹) = μ s :=
664+
calc μ (s⁻¹) = measure.map (has_inv.inv) μ s :
665+
((homeomorph.inv G).to_measurable_equiv.map_apply s).symm
666+
... = μ s : by rw map_haar_inv
667+
595668
end measure
596669
end measure_theory

src/topology/algebra/group.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import order.filter.pointwise
88
import group_theory.quotient_group
99
import topology.algebra.monoid
1010
import topology.homeomorph
11+
import topology.compacts
1112

1213
/-!
1314
# Theory of topological groups
@@ -651,6 +652,23 @@ begin
651652
exact ⟨n, hn⟩ }
652653
end
653654

655+
/-- Every separated topological group in which there exists a compact set with nonempty interior
656+
is locally compact. -/
657+
@[to_additive] lemma topological_space.positive_compacts.locally_compact_space_of_group
658+
[t2_space G] (K : positive_compacts G) :
659+
locally_compact_space G :=
660+
begin
661+
refine locally_compact_of_compact_nhds (λ x, _),
662+
obtain ⟨y, hy⟩ : ∃ y, y ∈ interior K.1 := K.2.2,
663+
let F := homeomorph.mul_left (x * y⁻¹),
664+
refine ⟨F '' K.1, _, is_compact.image K.2.1 F.continuous⟩,
665+
suffices : F.symm ⁻¹' K.1 ∈ 𝓝 x, by { convert this, apply equiv.image_eq_preimage },
666+
apply continuous_at.preimage_mem_nhds F.symm.continuous.continuous_at,
667+
have : F.symm x = y, by simp [F, homeomorph.mul_left_symm],
668+
rw this,
669+
exact mem_interior_iff_mem_nhds.1 hy
670+
end
671+
654672
end
655673

656674
section

src/topology/compacts.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,18 @@ set.inclusion $ λ s hs, hs.2.is_closed
118118

119119
end nonempty_compacts
120120

121+
section positive_compacts
122+
123+
variable (α)
124+
/-- In a nonempty locally compact space, there exists a compact set with nonempty interior. -/
125+
instance nonempty_positive_compacts [locally_compact_space α] [nonempty α] :
126+
nonempty (positive_compacts α) :=
127+
begin
128+
inhabit α,
129+
rcases exists_compact_subset is_open_univ (mem_univ (default α)) with ⟨K, hK⟩,
130+
exact ⟨⟨K, hK.1, ⟨_, hK.2.1⟩⟩⟩
131+
end
132+
133+
end positive_compacts
134+
121135
end topological_space

0 commit comments

Comments
 (0)