Skip to content

Commit 272dcf5

Browse files
committed
feat: haar measures on short exact sequences (leanprover-community#32672)
This PR proves that if `1 → A → B → C → 1` is a short exact sequence of topological groups, then Haar measures on `A` and `C` induce a Haar measure on `B`. The final result of the file is a consequence needed for FLT: If `B → C` is injective on an open set `U`, then `U` has bounded measure. Co-authored-by: tb65536 <thomas.l.browning@gmail.com>
1 parent c39f23b commit 272dcf5

4 files changed

Lines changed: 313 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5301,6 +5301,7 @@ public import Mathlib.MeasureTheory.Measure.GiryMonad
53015301
public import Mathlib.MeasureTheory.Measure.Haar.Basic
53025302
public import Mathlib.MeasureTheory.Measure.Haar.Disintegration
53035303
public import Mathlib.MeasureTheory.Measure.Haar.DistribChar
5304+
public import Mathlib.MeasureTheory.Measure.Haar.Extension
53045305
public import Mathlib.MeasureTheory.Measure.Haar.InnerProductSpace
53055306
public import Mathlib.MeasureTheory.Measure.Haar.MulEquivHaarChar
53065307
public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace

Mathlib/MeasureTheory/Integral/Bochner/Basic.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,18 @@ theorem enorm_integral_le_lintegral_enorm (f : α → G) : ‖∫ a, f a ∂μ
352352
apply ENNReal.ofReal_le_of_le_toReal
353353
exact norm_integral_le_lintegral_norm f
354354

355+
theorem dist_integral_le_lintegral_edist
356+
{f g : α → G} (hf : Integrable f μ) (hg : Integrable g μ) :
357+
dist (∫ a, f a ∂μ) (∫ a, g a ∂μ) ≤ (∫⁻ a, edist (f a) (g a) ∂μ).toReal := by
358+
grw [dist_eq_norm, ← integral_sub hf hg, norm_integral_le_lintegral_norm]
359+
simp [edist_eq_enorm_sub]
360+
361+
theorem edist_integral_le_lintegral_edist
362+
{f g : α → G} (hf : Integrable f μ) (hg : Integrable g μ) :
363+
edist (∫ a, f a ∂μ) (∫ a, g a ∂μ) ≤ ∫⁻ a, edist (f a) (g a) ∂μ := by
364+
rw [edist_dist]
365+
exact ENNReal.ofReal_le_of_le_toReal (dist_integral_le_lintegral_edist hf hg)
366+
355367
theorem integral_eq_zero_of_ae {f : α → G} (hf : f =ᵐ[μ] 0) : ∫ a, f a ∂μ = 0 := by
356368
simp [integral_congr_ae hf, integral_zero]
357369

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
/-
2+
Copyright (c) 2025 Thomas Browning. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Thomas Browning
5+
-/
6+
module
7+
8+
public import Mathlib.Analysis.InnerProductSpace.Basic
9+
public import Mathlib.MeasureTheory.Group.Integral
10+
public import Mathlib.MeasureTheory.Integral.RieszMarkovKakutani.Real
11+
public import Mathlib.Topology.Algebra.Group.Extension
12+
13+
/-!
14+
# Haar measures on group extensions
15+
16+
In this file, if `1 → A → B → C → 1` is a short exact sequence of topological groups,
17+
we construct a Haar measure on `B` from Haar measures on `A` and `C`.
18+
19+
## Main definitions
20+
21+
* `TopologicalGroup.IsSES.inducedMeasure`: The Haar measure on `B` induced by Haar measures
22+
on `A` and `C`.
23+
24+
## Main results
25+
26+
* `TopologicalGroup.IsSES.isHaarMeasure_inducedMeasure`: `inducedMeasure` is a Haar measure.
27+
* `TopologicalGroup.IsSES.inducedMeasure_lt_of_injOn`: If `ψ` is injective on an open set `U`,
28+
then the induced measure on `U` is bounded by `μC Set.univ * μA {1}` (possibly infinite).
29+
30+
-/
31+
32+
@[expose] public section
33+
34+
open MeasureTheory Measure
35+
36+
open scoped Pointwise
37+
38+
namespace TopologicalGroup.IsSES
39+
40+
variable {A B C E : Type*} [Group A] [Group B] [Group C]
41+
[TopologicalSpace A] [TopologicalSpace B] [TopologicalSpace C]
42+
{φ : A →* B} {ψ : B →* C} (H : TopologicalGroup.IsSES φ ψ)
43+
[IsTopologicalGroup A] [IsTopologicalGroup B] [NormedAddCommGroup E]
44+
45+
/-- If `φ : A →* B` and `ψ : B →* C` define a short exact sequence of topological groups, then we
46+
can pull back a continuous compactly supported function `f` on `B` along `φ` to the continuous
47+
compactly supported function `a ↦ f (b * φ a)` on `A`. -/
48+
@[to_additive /-- If `φ : A →+ B` and `ψ : B →+ C` define a short exact sequence of additive
49+
topological groups, then we can pull back a continuous compactly supported function `f` on `B` along
50+
`φ` to the continuous compactly supported function `a ↦ f (b + φ a)` on `A`. -/]
51+
noncomputable abbrev pullback (f : CompactlySupportedContinuousMap B E) (b : B) :
52+
CompactlySupportedContinuousMap A E :=
53+
f.pullback_monoidHom H.isClosedEmbedding b
54+
55+
@[to_additive]
56+
theorem pullback_def (f : CompactlySupportedContinuousMap B E) (b : B) (a : A) :
57+
pullback H f b a = f (b * φ a) :=
58+
f.pullback_monoidHom_def H.isClosedEmbedding b a
59+
60+
variable [MeasurableSpace A] [BorelSpace A] (μA : Measure A) [hμA : IsHaarMeasure μA]
61+
[NormedSpace ℝ E]
62+
63+
@[to_additive]
64+
theorem integral_pullback_invFun_apply (f : CompactlySupportedContinuousMap B E) (b : B) :
65+
∫ a, H.pullback f (Function.invFun ψ (ψ b)) a ∂μA = ∫ a, H.pullback f b a ∂μA := by
66+
have h : ψ ((Function.invFun ψ (ψ b))⁻¹ * b) = 1 := by simp [Function.apply_invFun_apply]
67+
rw [← ψ.mem_ker, H.mulExact.monoidHom_ker_eq] at h
68+
obtain ⟨a, ha⟩ := h
69+
rw [← integral_mul_left_eq_self _ a]
70+
simp [pullback_def, ha, mul_assoc]
71+
72+
variable [IsTopologicalGroup C] [LocallyCompactSpace B]
73+
74+
/-- If `φ : A →* B` and `ψ : B →* C` define a short exact sequence of topological groups, then we
75+
can push forward a continuous compactly supported function on `B` to a continuous compactly
76+
supported function on `C` by integrating over `A`. -/
77+
@[to_additive /-- If `φ : A →+ B` and `ψ : B →+ C` define a short exact sequence of additive
78+
topological groups, then we can push forward a continuous compactly supported function on `B` to a
79+
continuous compactly supported function on `C` by integrating over `A`. -/]
80+
noncomputable def pushforward :
81+
CompactlySupportedContinuousMap B E →ₗ[ℝ] CompactlySupportedContinuousMap C E where
82+
toFun f :=
83+
{ toFun := fun c ↦ ∫ a, pullback H f (Function.invFun ψ c) a ∂μA
84+
hasCompactSupport' := by
85+
obtain ⟨K, hK, hf⟩ := exists_compact_iff_hasCompactSupport.mpr f.hasCompactSupport
86+
refine exists_compact_iff_hasCompactSupport.mp
87+
⟨ψ '' K, hK.image H.isOpenQuotientMap.continuous, fun x hx ↦ ?_⟩
88+
suffices ∀ a : A, f (Function.invFun ψ x * φ a) = 0 by simp [this, pullback_def]
89+
refine fun a ↦ hf _ (mt (Set.mem_image_of_mem ψ) ?_)
90+
rwa [map_mul, Function.rightInverse_invFun H.isOpenQuotientMap.surjective,
91+
H.mulExact.apply_apply_eq_one, mul_one]
92+
continuous_toFun := by
93+
let := IsTopologicalGroup.rightUniformSpace B
94+
simp_rw [← H.isOpenQuotientMap.continuous_comp_iff, Function.comp_def,
95+
integral_pullback_invFun_apply, Metric.continuous_iff']
96+
intro b ε hε
97+
obtain ⟨U₀, hU₀, hb⟩ := exists_compact_mem_nhds b
98+
obtain ⟨K, hK, hf₀⟩ := exists_compact_iff_hasCompactSupport.mpr f.hasCompactSupport
99+
let S : Set A := φ ⁻¹' (U₀⁻¹ * K)
100+
have hSc : IsCompact S := H.isClosedEmbedding.isCompact_preimage (hU₀.inv.mul hK)
101+
obtain ⟨δ, hδ0, hδ⟩ : ∃ δ > 0, ENNReal.ofReal δ * μA S < ENNReal.ofReal ε := by
102+
rw [← ENNReal.ofReal_toReal hSc.measure_ne_top, ← measureReal_def]
103+
by_cases hS' : μA.real S = 0
104+
· simp [hS', hε, exists_gt]
105+
· refine ⟨ε / 2 / μA.real S, by positivity, ?_⟩
106+
rwa [← ENNReal.ofReal_mul' measureReal_nonneg, ENNReal.ofReal_lt_ofReal_iff hε,
107+
div_mul_cancel₀ _ hS', half_lt_self_iff]
108+
have hS {x} (hx : x ∈ U₀) {y} (hy : y ∉ S) : H.pullback f x y = 0 := by
109+
contrapose! hy
110+
exact Set.mem_mul.mpr ⟨x⁻¹, Set.inv_mem_inv.mpr hx, x * φ y,
111+
not_imp_comm.mp (hf₀ (x * φ y)) hy, inv_mul_cancel_left x (φ y)⟩
112+
have ha := f.hasCompactSupport.uniformContinuous_of_continuous f.continuous
113+
rw [uniformContinuous_iff_eventually] at ha
114+
obtain ⟨U, hU, hf⟩ := ha _ (Metric.dist_mem_uniformity hδ0)
115+
refine Filter.mem_of_superset (Filter.inter_mem
116+
(mul_singleton_mem_nhds_of_nhds_one b (inv_mem_nhds_one B hU)) hb) ?_
117+
rintro - ⟨⟨t, ht, b, rfl, -, rfl⟩, htb⟩
118+
have h (a) (ha : a ∈ S) : edist (H.pullback f (t * b) a) (H.pullback f b a) ≤ .ofReal δ := by
119+
rw [edist_dist]
120+
exact ENNReal.ofReal_le_ofReal (@hf ⟨t * b * φ a, b * φ a⟩ (by simpa)).le
121+
grw [Set.mem_setOf_eq, dist_integral_le_lintegral_edist (H.pullback f (t * b)).integrable
122+
(H.pullback f b).integrable, ← setLIntegral_eq_of_support_subset]
123+
· refine ENNReal.toReal_lt_of_lt_ofReal ((setLIntegral_mono measurable_const h).trans_lt ?_)
124+
rwa [lintegral_const, restrict_apply_univ]
125+
· intro y hy
126+
contrapose! hy
127+
rw [Function.notMem_support, hS htb hy, hS (mem_of_mem_nhds hb) hy, edist_self] }
128+
map_add' f g := by
129+
ext c
130+
exact integral_add (pullback H f _).integrable (pullback H g _).integrable
131+
map_smul' x f := by
132+
ext c
133+
apply integral_smul
134+
135+
@[to_additive]
136+
theorem pushforward_def (f : CompactlySupportedContinuousMap B E) (c : C) :
137+
pushforward H μA f c = ∫ a, pullback H f (Function.invFun ψ c) a ∂μA :=
138+
rfl
139+
140+
@[to_additive]
141+
theorem pushforward_apply_apply (f : CompactlySupportedContinuousMap B E) (b : B) :
142+
pushforward H μA f (ψ b) = ∫ a, pullback H f b a ∂μA :=
143+
integral_pullback_invFun_apply H μA f b
144+
145+
@[to_additive]
146+
theorem pushforward_mono {f g : CompactlySupportedContinuousMap B ℝ} (h : f ≤ g) :
147+
pushforward H μA f ≤ pushforward H μA g :=
148+
fun _ ↦ integral_mono (pullback H f _).integrable (pullback H g _).integrable (fun _ ↦ h _)
149+
150+
variable [MeasurableSpace C] [BorelSpace C] (μC : Measure C) [hμC : IsHaarMeasure μC]
151+
152+
/-- If `φ : A →* B` and `ψ : B →* C` define a short exact sequence of topological groups, then we
153+
can integrate a continuous compactly supported function on `B` by integrating over `A` and `C`. -/
154+
@[to_additive /-- If `φ : A →+ B` and `ψ : B →+ C` define a short exact sequence of additive
155+
topological groups, then we can integrate a continuous compactly supported function on `B` by
156+
integrating over `A` and `C`. -/]
157+
noncomputable def integrate : CompactlySupportedContinuousMap B E →ₗ[ℝ] E where
158+
toFun f := ∫ c, pushforward H μA f c ∂μC
159+
map_add' f g := by
160+
rw [map_add]
161+
exact integral_add (pushforward H μA f).integrable (pushforward H μA g).integrable
162+
map_smul' x f := by
163+
rw [map_smul]
164+
exact integral_smul x (H.pushforward μA f)
165+
166+
@[to_additive]
167+
theorem integrate_apply (f : CompactlySupportedContinuousMap B E) :
168+
H.integrate μA μC f = ∫ c, pushforward H μA f c ∂μC :=
169+
rfl
170+
171+
@[to_additive]
172+
theorem integrate_mono {f g : CompactlySupportedContinuousMap B ℝ} (h : f ≤ g) :
173+
integrate H μA μC f ≤ integrate H μA μC g :=
174+
integral_mono (pushforward H μA f).integrable (pushforward H μA g).integrable
175+
(pushforward_mono H μA h)
176+
177+
variable [T2Space B] [MeasurableSpace B] [BorelSpace B]
178+
179+
/-- If `φ : A →* B` and `ψ : B →* C` define a short exact sequence of topological groups, then we
180+
can define a Haar measure on `B` induced by the Haar measures on `A` and `C`. -/
181+
@[to_additive /-- If `φ : A →+ B` and `ψ : B →+ C` define a short exact sequence of additive
182+
topological groups, then we can define a Haar measure on `B` induced by the Haar measures on `A`
183+
and `C`. -/]
184+
noncomputable def inducedMeasure : Measure B :=
185+
RealRMK.rieszMeasure ⟨integrate H μA μC, fun _ _ ↦ integrate_mono H μA μC⟩
186+
187+
@[to_additive]
188+
instance inducedMeasure_regular : (inducedMeasure H μA μC).Regular :=
189+
RealRMK.regular_rieszMeasure _
190+
191+
@[to_additive]
192+
theorem integral_inducedMeasure (f : CompactlySupportedContinuousMap B ℝ) :
193+
∫ b : B, f b ∂(inducedMeasure H μA μC) = integrate H μA μC f := by
194+
apply RealRMK.integral_rieszMeasure
195+
196+
@[to_additive]
197+
instance isHaarMeasure_inducedMeasure : IsHaarMeasure (inducedMeasure H μA μC) where
198+
lt_top_of_isCompact K hK := by
199+
obtain ⟨f, hf1, hf2, hf3, hf4⟩ :=
200+
exists_continuousMap_one_of_isCompact_subset_isOpen hK isOpen_univ K.subset_univ
201+
exact lt_of_le_of_lt (RealRMK.rieszMeasure_le_of_eq_one (f := ⟨f, hf2⟩) _
202+
(fun x ↦ (hf4 x).1) hK (fun x hx ↦ hf1 hx)) ENNReal.ofReal_lt_top
203+
map_mul_left_eq_self b := by
204+
have : ((inducedMeasure H μA μC).map (b * ·)).Regular := Regular.map (Homeomorph.mulLeft b)
205+
refine ext_of_integral_eq_on_compactlySupported fun f ↦ ?_
206+
rw [integral_map (by fun_prop) (by fun_prop)]
207+
have h (x : B) : f (b * x) = f.comp (Homeomorph.mulLeft b).toCocompactMap x := rfl
208+
simp_rw [h, integral_inducedMeasure, integrate_apply]
209+
rw [← integral_mul_left_eq_self _ (ψ b)⁻¹]
210+
congr with c
211+
obtain ⟨b', rfl⟩ := H.isOpenQuotientMap.surjective c
212+
rw [← map_inv, ← map_mul, pushforward_apply_apply, pushforward_apply_apply]
213+
simp [pullback_def, mul_assoc]
214+
open_pos U hU := by
215+
rintro ⟨b, hb⟩
216+
obtain ⟨K, hK, hb, hKU⟩ := exists_compact_subset hU hb
217+
obtain ⟨f, hf1, hf2, hf3, hf4⟩ := exists_continuousMap_one_of_isCompact_subset_isOpen hK hU hKU
218+
have hf0 : 0 ≤ H.pushforward μA ⟨f, hf2⟩ := by
219+
rw [← map_zero (H.pushforward μA)]
220+
apply pushforward_mono
221+
exact fun x ↦ (hf4 x).1
222+
grw [← pos_iff_ne_zero, inducedMeasure,
223+
← RealRMK.le_rieszMeasure_tsupport_subset (f := ⟨f, hf2⟩) _ hf4 hf3, ENNReal.ofReal_pos]
224+
suffices (0 : ℝ) < pushforward H μA ⟨f, hf2⟩ (ψ b) from
225+
(pushforward H μA ⟨f, hf2⟩).continuous.integral_pos_of_hasCompactSupport_nonneg_nonzero
226+
(pushforward H μA ⟨f, hf2⟩).hasCompactSupport hf0 this.ne'
227+
have : (Function.invFun ψ (ψ b))⁻¹ * b ∈ φ.range := by
228+
simp [← H.mulExact.monoidHom_ker_eq, Function.apply_invFun_apply]
229+
obtain ⟨a, ha⟩ := this
230+
replace ha : f (Function.invFun ψ (ψ b) * φ a) ≠ 0 := by simp [ha, hf1 (interior_subset hb)]
231+
exact (pullback H ⟨f, hf2⟩ _).continuous.integral_pos_of_hasCompactSupport_nonneg_nonzero
232+
(pullback H ⟨f, hf2⟩ _).hasCompactSupport (fun x ↦ (hf4 _).1) ha
233+
234+
/-- If `φ : A →* B` and `ψ : B →* C` define a short exact sequence of topological groups, and if
235+
`ψ` is injective on an open set `U`, then the induced measure on `U` is bounded above by
236+
`μC Set.univ * μA {1}` (possibly infinite). -/
237+
@[to_additive /-- If `φ : A →+ B` and `ψ : B →+ C` define a short exact sequence of additive
238+
topological groups, and if `ψ` is injective on an open set `U`, then the induced measure on `U` is
239+
bounded above by `μC Set.univ * μA {1}` (possibly infinite). -/]
240+
theorem inducedMeasure_lt_of_injOn {U : Set B} (hU : IsOpen U) [DiscreteTopology A]
241+
(h : U.InjOn ψ) :
242+
inducedMeasure H μA μC U ≤ μC Set.univ * μA {1} := by
243+
contrapose! h
244+
have ho : 0 < μA {1} := (isOpen_discrete {1}).measure_pos _ (Set.singleton_nonempty 1)
245+
have ht : μA {1} < ⊤ := isCompact_singleton.measure_lt_top
246+
obtain ⟨K, hKU, hK, h⟩ := Regular.innerRegular hU _ h
247+
obtain ⟨f, hf1, hf2, hf3, hf4⟩ := exists_continuousMap_one_of_isCompact_subset_isOpen hK hU hKU
248+
replace h : μC Set.univ * μA {1} < ENNReal.ofReal (∫ c : C, pushforward H μA ⟨f, hf2⟩ c ∂μC) :=
249+
lt_of_lt_of_le h ((RealRMK.rieszMeasure_le_of_eq_one (f := ⟨f, hf2⟩) _ (fun x ↦ (hf4 x).1)
250+
hK (fun x hx ↦ hf1 hx)))
251+
obtain ⟨c, hc⟩ : ∃ c : C, (μA {1}).toReal < pushforward H μA ⟨f, hf2⟩ c := by
252+
contrapose! h
253+
rcases eq_top_or_lt_top (μC Set.univ) with hC | hC
254+
· simp [hC, ENNReal.top_mul ho.ne']
255+
· have : IsFiniteMeasure μC := ⟨hC⟩
256+
rw [ENNReal.ofReal_le_iff_le_toReal (ENNReal.mul_lt_top hC ht).ne, ENNReal.toReal_mul,
257+
← Measure.real_def, ← smul_eq_mul, ← integral_const]
258+
exact integral_mono (H.pushforward μA ⟨f, hf2⟩).integrable (integrable_const _) h
259+
contrapose! hc
260+
obtain ⟨b, rfl⟩ := H.isOpenQuotientMap.surjective c
261+
simp only [pushforward_apply_apply, pullback_def, CompactlySupportedContinuousMap.coe_mk]
262+
rw [← setIntegral_support]
263+
have key : (Function.support fun a ↦ f (b * φ a)).Subsingleton := by
264+
intro a ha b hb
265+
simpa [H.isClosedEmbedding.injective.eq_iff] using hc (hf3 (subset_tsupport _ ha))
266+
(hf3 (subset_tsupport _ hb)) (by simp [H.mulExact.apply_apply_eq_one])
267+
obtain h | ⟨a, ha⟩ := key.eq_empty_or_singleton
268+
· simp [h]
269+
· rw [ha, integral_singleton, real_def, haar_singleton, smul_eq_mul, mul_le_iff_le_one_right]
270+
· exact (hf4 _).2
271+
· exact ENNReal.toReal_pos ho.ne' ht.ne
272+
273+
end TopologicalGroup.IsSES

Mathlib/Topology/ContinuousMap/CompactlySupported.lean

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,33 @@ lemma eq_toNNRealLinear_toRealPositiveLinear (Λ : C_c(α, ℝ≥0) →ₗ[ℝ
838838

839839
end toRealPositiveLinear
840840

841+
section pullback
842+
843+
variable [R1Space α] [Group α] [TopologicalSpace β] [R1Space β] [Group β] [ContinuousMul β]
844+
[NormedAddCommGroup γ] {φ : α →* β} (hφ : Topology.IsClosedEmbedding φ)
845+
846+
open scoped Pointwise in
847+
/-- Pull back a continuous compactly supported function `f` on `β` along a closed embedding
848+
`φ : α →* β` to the continuous compactly supported function `a ↦ f (b * φ a)` on `A`. -/
849+
@[to_additive /-- Pull back a continuous compactly supported function `f` on `β` along a closed
850+
embedding `φ : α →+ β` to the continuous compactly supported function `a ↦ f (b + φ a)` on `A`. -/]
851+
noncomputable def pullback_monoidHom (f : CompactlySupportedContinuousMap β γ) (b : β) :
852+
CompactlySupportedContinuousMap α γ where
853+
toFun a := f (b * φ a)
854+
hasCompactSupport' := by
855+
obtain ⟨K, hK, hf⟩ := exists_compact_iff_hasCompactSupport.mpr f.hasCompactSupport
856+
refine exists_compact_iff_hasCompactSupport.mp ⟨φ ⁻¹' (b⁻¹ • K),
857+
hφ.isCompact_preimage (hK.smul b⁻¹), fun x hx ↦ hf _ ?_⟩
858+
simpa [Set.mem_smul_set_iff_inv_smul_mem] using hx
859+
continuous_toFun := by fun_prop
860+
861+
@[to_additive]
862+
theorem pullback_monoidHom_def (f : CompactlySupportedContinuousMap β γ) (b : β) (a : α) :
863+
pullback_monoidHom hφ f b a = f (b * φ a) :=
864+
rfl
865+
866+
end pullback
867+
841868
end CompactlySupportedContinuousMap
842869

843870
end NonnegativePart

0 commit comments

Comments
 (0)