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

Commit 58c20c1

Browse files
committed
feat(measure_theory/group): add measures invariant under inversion/negation (#11954)
* Define measures invariant under `inv` or `neg` * Prove lemmas about measures invariant under `inv` similar to the lemmas about measures invariant under `mul` * Also provide more `pi` instances in `arithmetic`. * Rename some `integral_zero...` lemmas to `integral_eq_zero...` * Reformulate `pi.is_mul_left_invariant_volume` using nondependent functions, so that type class inference can find it for `ι → ℝ`) * Add some more integration lemmas, also for multiplication
1 parent f3a04ed commit 58c20c1

File tree

10 files changed

+224
-53
lines changed

10 files changed

+224
-53
lines changed

src/analysis/fourier.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ begin
205205
have hij : -i + j ≠ 0,
206206
{ rw add_comm,
207207
exact sub_ne_zero.mpr (ne.symm h) },
208-
exact integral_zero_of_mul_left_eq_neg (fourier_add_half_inv_index hij)
208+
exact integral_eq_zero_of_mul_left_eq_neg (fourier_add_half_inv_index hij)
209209
end
210210

211211
end monomials

src/measure_theory/constructions/pi.lean

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -539,13 +539,21 @@ end
539539
[∀ i, is_mul_left_invariant (μ i)] : is_mul_left_invariant (measure.pi μ) :=
540540
begin
541541
refine ⟨λ x, (measure.pi_eq (λ s hs, _)).symm⟩,
542-
have A : has_mul.mul x ⁻¹' (set.pi univ (λ (i : ι), s i))
543-
= set.pi univ (λ (i : ι), ((*) (x i)) ⁻¹' (s i)), by { ext, simp },
544-
rw [measure.map_apply (measurable_const_mul x) (measurable_set.univ_pi_fintype hs), A,
545-
pi_pi],
546-
simp only [measure_preimage_mul]
542+
have h : has_mul.mul x ⁻¹' (pi univ s) = set.pi univ (λ i, (λ y, x i * y) ⁻¹' s i),
543+
{ ext, simp },
544+
simp_rw [measure.map_apply (measurable_const_mul x) (measurable_set.univ_pi_fintype hs), h,
545+
pi_pi, measure_preimage_mul]
547546
end
548547

548+
@[to_additive] instance pi.is_inv_invariant [∀ i, group (α i)] [∀ i, has_measurable_inv (α i)]
549+
[∀ i, is_inv_invariant (μ i)] : is_inv_invariant (measure.pi μ) :=
550+
begin
551+
refine ⟨(measure.pi_eq (λ s hs, _)).symm⟩,
552+
have A : has_inv.inv ⁻¹' (pi univ s) = set.pi univ (λ i, has_inv.inv ⁻¹' s i),
553+
{ ext, simp },
554+
simp_rw [measure.inv, measure.map_apply measurable_inv (measurable_set.univ_pi_fintype hs), A,
555+
pi_pi, measure_preimage_inv]
556+
end
549557

550558
end measure
551559
instance measure_space.pi [Π i, measure_space (α i)] : measure_space (Π i, α i) :=
@@ -571,13 +579,24 @@ lemma volume_pi_closed_ball [Π i, measure_space (α i)] [∀ i, sigma_finite (v
571579
measure.pi_closed_ball _ _ hr
572580

573581
open measure
582+
/-- We intentionally restrict this only to the nondependent function space, since type-class
583+
inference cannot find an instance for `ι → ℝ` when this is stated for dependent function spaces. -/
574584
@[to_additive]
575-
instance pi.is_mul_left_invariant_volume [∀ i, group (α i)] [Π i, measure_space (α i)]
576-
[∀ i, sigma_finite (volume : measure (α i))]
577-
[∀ i, has_measurable_mul (α i)] [∀ i, is_mul_left_invariant (volume : measure (α i))] :
578-
is_mul_left_invariant (volume : measure (Π i, α i)) :=
585+
instance pi.is_mul_left_invariant_volume {α} [group α] [measure_space α]
586+
[sigma_finite (volume : measure α)]
587+
[has_measurable_mul α] [is_mul_left_invariant (volume : measure α)] :
588+
is_mul_left_invariant (volume : measure (ι → α)) :=
579589
pi.is_mul_left_invariant _
580590

591+
/-- We intentionally restrict this only to the nondependent function space, since type-class
592+
inference cannot find an instance for `ι → ℝ` when this is stated for dependent function spaces. -/
593+
@[to_additive]
594+
instance pi.is_inv_invariant_volume {α} [group α] [measure_space α]
595+
[sigma_finite (volume : measure α)]
596+
[has_measurable_inv α] [is_inv_invariant (volume : measure α)] :
597+
is_inv_invariant (volume : measure (ι → α)) :=
598+
pi.is_inv_invariant _
599+
581600
/-!
582601
### Measure preserving equivalences
583602

src/measure_theory/function/l1_space.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,10 @@ lemma integrable_map_measure [opens_measurable_space β] {f : α → δ} {g : δ
486486
integrable g (measure.map f μ) ↔ integrable (g ∘ f) μ :=
487487
by { simp_rw ← mem_ℒp_one_iff_integrable, exact mem_ℒp_map_measure_iff hg hf, }
488488

489+
lemma integrable.comp_measurable [opens_measurable_space β] {f : α → δ} {g : δ → β}
490+
(hg : integrable g (measure.map f μ)) (hf : measurable f) : integrable (g ∘ f) μ :=
491+
(integrable_map_measure hg.ae_measurable hf).mp hg
492+
489493
lemma _root_.measurable_embedding.integrable_map_iff {f : α → δ} (hf : measurable_embedding f)
490494
{g : δ → β} :
491495
integrable g (measure.map f μ) ↔ integrable (g ∘ f) μ :=

src/measure_theory/group/arithmetic.lean

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,23 @@ measurable_mul.comp_ae_measurable (hf.prod_mk hg)
131131

132132
omit m
133133

134+
@[priority 100, to_additive]
135+
instance has_measurable_mul₂.to_has_measurable_mul [has_measurable_mul₂ M] :
136+
has_measurable_mul M :=
137+
⟨λ c, measurable_const.mul measurable_id, λ c, measurable_id.mul measurable_const⟩
138+
134139
@[to_additive]
135140
instance pi.has_measurable_mul {ι : Type*} {α : ι → Type*} [∀ i, has_mul (α i)]
136141
[∀ i, measurable_space (α i)] [∀ i, has_measurable_mul (α i)] :
137142
has_measurable_mul (Π i, α i) :=
138-
⟨λ g, measurable_pi_iff.mpr $ λ i, (measurable_const_mul (g i)).comp $ measurable_pi_apply i,
139-
λ g, measurable_pi_iff.mpr $ λ i, (measurable_mul_const (g i)).comp $ measurable_pi_apply i
143+
⟨λ g, measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).const_mul _,
144+
λ g, measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).mul_const _
140145

141-
@[priority 100, to_additive]
142-
instance has_measurable_mul₂.to_has_measurable_mul [has_measurable_mul₂ M] :
143-
has_measurable_mul M :=
144-
⟨λ c, measurable_const.mul measurable_id, λ c, measurable_id.mul measurable_const⟩
146+
@[to_additive pi.has_measurable_add₂]
147+
instance pi.has_measurable_mul₂ {ι : Type*} {α : ι → Type*} [∀ i, has_mul (α i)]
148+
[∀ i, measurable_space (α i)] [∀ i, has_measurable_mul₂ (α i)] :
149+
has_measurable_mul₂ (Π i, α i) :=
150+
⟨measurable_pi_iff.mpr $ λ i, measurable_fst.eval.mul measurable_snd.eval⟩
145151

146152
attribute [measurability] measurable.add' measurable.add ae_measurable.add ae_measurable.add'
147153
measurable.const_add ae_measurable.const_add measurable.add_const ae_measurable.add_const
@@ -291,6 +297,19 @@ instance has_measurable_div₂.to_has_measurable_div [has_measurable_div₂ G] :
291297
has_measurable_div G :=
292298
⟨λ c, measurable_const.div measurable_id, λ c, measurable_id.div measurable_const⟩
293299

300+
@[to_additive]
301+
instance pi.has_measurable_div {ι : Type*} {α : ι → Type*} [∀ i, has_div (α i)]
302+
[∀ i, measurable_space (α i)] [∀ i, has_measurable_div (α i)] :
303+
has_measurable_div (Π i, α i) :=
304+
⟨λ g, measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).const_div _,
305+
λ g, measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).div_const _⟩
306+
307+
@[to_additive pi.has_measurable_sub₂]
308+
instance pi.has_measurable_div₂ {ι : Type*} {α : ι → Type*} [∀ i, has_div (α i)]
309+
[∀ i, measurable_space (α i)] [∀ i, has_measurable_div₂ (α i)] :
310+
has_measurable_div₂ (Π i, α i) :=
311+
⟨measurable_pi_iff.mpr $ λ i, measurable_fst.eval.div measurable_snd.eval⟩
312+
294313
@[measurability]
295314
lemma measurable_set_eq_fun {m : measurable_space α} {E} [measurable_space E] [add_group E]
296315
[measurable_singleton_class E] [has_measurable_sub₂ E] {f g : α → E}
@@ -373,6 +392,12 @@ attribute [measurability] measurable.neg ae_measurable.neg
373392

374393
omit m
375394

395+
@[to_additive]
396+
instance pi.has_measurable_inv {ι : Type*} {α : ι → Type*} [∀ i, has_inv (α i)]
397+
[∀ i, measurable_space (α i)] [∀ i, has_measurable_inv (α i)] :
398+
has_measurable_inv (Π i, α i) :=
399+
⟨measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).inv⟩
400+
376401
@[to_additive] lemma measurable_set.inv {s : set G} (hs : measurable_set s) : measurable_set s⁻¹ :=
377402
measurable_inv hs
378403

@@ -525,6 +550,13 @@ hf.const_smul' c
525550

526551
omit m
527552

553+
@[to_additive]
554+
instance pi.has_measurable_smul {ι : Type*} {α : ι → Type*} [∀ i, has_scalar M (α i)]
555+
[∀ i, measurable_space (α i)] [∀ i, has_measurable_smul M (α i)] :
556+
has_measurable_smul M (Π i, α i) :=
557+
⟨λ g, measurable_pi_iff.mpr $ λ i, (measurable_pi_apply i).const_smul _,
558+
λ g, measurable_pi_iff.mpr $ λ i, measurable_smul_const _⟩
559+
528560
end smul
529561

530562
section mul_action

src/measure_theory/group/integration.lean

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,31 @@ namespace measure_theory
1818
open measure topological_space
1919
open_locale ennreal
2020

21-
variables {𝕜 G E : Type*} [measurable_space G] {μ : measure G}
21+
variables {𝕜 G E F : Type*} [measurable_space G]
2222
variables [normed_group E] [second_countable_topology E] [normed_space ℝ E] [complete_space E]
23-
[measurable_space E] [borel_space E]
23+
variables [measurable_space E] [borel_space E]
24+
variables [normed_group F] [measurable_space F] [opens_measurable_space F]
25+
variables {μ : measure G} {f : G → E} {g : G}
26+
27+
section measurable_inv
28+
29+
variables [group G] [has_measurable_inv G]
30+
31+
@[to_additive]
32+
lemma integrable.comp_inv [is_inv_invariant μ] {f : G → F} (hf : integrable f μ) :
33+
integrable (λ t, f t⁻¹) μ :=
34+
(hf.mono_measure (map_inv_eq_self μ).le).comp_measurable measurable_inv
35+
36+
@[to_additive]
37+
lemma integral_inv_eq_self (f : G → E) (μ : measure G) [is_inv_invariant μ] :
38+
∫ x, f (x⁻¹) ∂μ = ∫ x, f x ∂μ :=
39+
begin
40+
have h : measurable_embedding (λ x : G, x⁻¹) :=
41+
(measurable_equiv.inv G).measurable_embedding,
42+
rw [← h.integral_map, map_inv_eq_self]
43+
end
44+
45+
end measurable_inv
2446

2547
section measurable_mul
2648

@@ -71,19 +93,54 @@ end
7193
/-- If some left-translate of a function negates it, then the integral of the function with respect
7294
to a left-invariant measure is 0. -/
7395
@[to_additive]
74-
lemma integral_zero_of_mul_left_eq_neg [is_mul_left_invariant μ] {f : G → E} {g : G}
75-
(hf' : ∀ x, f (g * x) = - f x) :
96+
lemma integral_eq_zero_of_mul_left_eq_neg [is_mul_left_invariant μ] (hf' : ∀ x, f (g * x) = - f x) :
7697
∫ x, f x ∂μ = 0 :=
7798
by simp_rw [← self_eq_neg ℝ E, ← integral_neg, ← hf', integral_mul_left_eq_self]
7899

79100
/-- If some right-translate of a function negates it, then the integral of the function with respect
80101
to a right-invariant measure is 0. -/
81102
@[to_additive]
82-
lemma integral_zero_of_mul_right_eq_neg [is_mul_right_invariant μ] {f : G → E} {g : G}
83-
(hf' : ∀ x, f (x * g) = - f x) :
84-
∫ x, f x ∂μ = 0 :=
103+
lemma integral_eq_zero_of_mul_right_eq_neg [is_mul_right_invariant μ]
104+
(hf' : ∀ x, f (x * g) = - f x) : ∫ x, f x ∂μ = 0 :=
85105
by simp_rw [← self_eq_neg ℝ E, ← integral_neg, ← hf', integral_mul_right_eq_self]
86106

107+
@[to_additive]
108+
lemma integrable.comp_mul_left {f : G → F} [is_mul_left_invariant μ] (hf : integrable f μ)
109+
(g : G) : integrable (λ t, f (g * t)) μ :=
110+
(hf.mono_measure (map_mul_left_eq_self μ g).le).comp_measurable $ measurable_const_mul g
111+
112+
@[to_additive]
113+
lemma integrable.comp_mul_right {f : G → F} [is_mul_right_invariant μ] (hf : integrable f μ)
114+
(g : G) : integrable (λ t, f (t * g)) μ :=
115+
(hf.mono_measure (map_mul_right_eq_self μ g).le).comp_measurable $ measurable_mul_const g
116+
117+
@[to_additive]
118+
lemma integrable.comp_div_right {f : G → F} [is_mul_right_invariant μ] (hf : integrable f μ)
119+
(g : G) : integrable (λ t, f (t / g)) μ :=
120+
by { simp_rw [div_eq_mul_inv], exact hf.comp_mul_right g⁻¹ }
121+
122+
variables [has_measurable_inv G]
123+
124+
@[to_additive]
125+
lemma integrable.comp_div_left {f : G → F}
126+
[is_inv_invariant μ] [is_mul_left_invariant μ] (hf : integrable f μ) (g : G) :
127+
integrable (λ t, f (g / t)) μ :=
128+
begin
129+
rw [← map_mul_right_inv_eq_self μ g⁻¹, integrable_map_measure, function.comp],
130+
{ simp_rw [div_inv_eq_mul, mul_inv_cancel_left], exact hf },
131+
{ refine ae_measurable.comp_measurable _ (measurable_id.const_div g),
132+
simp_rw [map_map (measurable_id'.const_div g) (measurable_id'.const_mul g⁻¹).inv,
133+
function.comp, div_inv_eq_mul, mul_inv_cancel_left, map_id'],
134+
exact hf.ae_measurable },
135+
exact (measurable_id'.const_mul g⁻¹).inv
136+
end
137+
138+
@[to_additive]
139+
lemma integral_div_left_eq_self (f : G → E) (μ : measure G) [is_inv_invariant μ]
140+
[is_mul_left_invariant μ] (x' : G) : ∫ x, f (x' / x) ∂μ = ∫ x, f x ∂μ :=
141+
by simp_rw [div_eq_mul_inv, integral_inv_eq_self (λ x, f (x' * x)) μ,
142+
integral_mul_left_eq_self f x']
143+
87144
end measurable_mul
88145

89146

src/measure_theory/group/measure.lean

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,15 @@ end mul
104104

105105
section group
106106

107-
variables [group G] [has_measurable_mul G]
107+
variables [group G]
108+
109+
@[to_additive]
110+
lemma map_div_right_eq_self (μ : measure G) [is_mul_right_invariant μ] (g : G) :
111+
map (/ g) μ = μ :=
112+
by simp_rw [div_eq_mul_inv, map_mul_right_eq_self μ g⁻¹]
113+
114+
115+
variables [has_measurable_mul G]
108116

109117
/-- We shorten this from `measure_preimage_mul_left`, since left invariant is the preferred option
110118
for measures in this formalization. -/
@@ -131,25 +139,59 @@ namespace measure
131139
protected def inv [has_inv G] (μ : measure G) : measure G :=
132140
measure.map inv μ
133141

134-
variables [group G] [has_measurable_inv G]
142+
/-- A measure is invariant under negation if `- μ = μ`. Equivalently, this means that for all
143+
measurable `A` we have `μ (- A) = μ A`, where `- A` is the pointwise negation of `A`. -/
144+
class is_neg_invariant [has_neg G] (μ : measure G) : Prop :=
145+
(neg_eq_self : μ.neg = μ)
135146

136-
@[to_additive]
147+
/-- A measure is invariant under inversion if `μ⁻¹ = μ`. Equivalently, this means that for all
148+
measurable `A` we have `μ (A⁻¹) = μ A`, where `A⁻¹` is the pointwise inverse of `A`. -/
149+
@[to_additive] class is_inv_invariant [has_inv G] (μ : measure G) : Prop :=
150+
(inv_eq_self : μ.inv = μ)
151+
152+
section inv
153+
154+
variables [has_inv G]
155+
156+
@[simp, to_additive]
157+
lemma inv_eq_self (μ : measure G) [is_inv_invariant μ] : μ.inv = μ :=
158+
is_inv_invariant.inv_eq_self
159+
160+
@[simp, to_additive]
161+
lemma map_inv_eq_self (μ : measure G) [is_inv_invariant μ] : map has_inv.inv μ = μ :=
162+
is_inv_invariant.inv_eq_self
163+
164+
end inv
165+
166+
section has_involutive_inv
167+
168+
variables [has_involutive_inv G] [has_measurable_inv G]
169+
170+
@[simp, to_additive]
137171
lemma inv_apply (μ : measure G) (s : set G) : μ.inv s = μ s⁻¹ :=
138172
(measurable_equiv.inv G).map_apply s
139173

140-
@[simp, to_additive] protected lemma inv_inv (μ : measure G) : μ.inv.inv = μ :=
174+
@[simp, to_additive]
175+
protected lemma inv_inv (μ : measure G) : μ.inv.inv = μ :=
141176
(measurable_equiv.inv G).map_symm_map
142177

143-
end measure
178+
@[simp, to_additive]
179+
lemma measure_inv (μ : measure G) [is_inv_invariant μ] (A : set G) : μ A⁻¹ = μ A :=
180+
by rw [← inv_apply, inv_eq_self]
144181

145-
section inv
146-
variables [group G] [has_measurable_inv G] {μ : measure G}
182+
@[to_additive]
183+
lemma measure_preimage_inv (μ : measure G) [is_inv_invariant μ] (A : set G) :
184+
μ (has_inv.inv ⁻¹' A) = μ A :=
185+
μ.measure_inv A
147186

148187
@[to_additive]
149-
instance [sigma_finite μ] : sigma_finite μ.inv :=
188+
instance (μ : measure G) [sigma_finite μ] : sigma_finite μ.inv :=
150189
(measurable_equiv.inv G).sigma_finite_map ‹_›
151190

152-
variables [has_measurable_mul G]
191+
end has_involutive_inv
192+
193+
section mul_inv
194+
variables [group G] [has_measurable_mul G] [has_measurable_inv G] {μ : measure G}
153195

154196
@[to_additive]
155197
instance [is_mul_left_invariant μ] : is_mul_right_invariant μ.inv :=
@@ -171,9 +213,28 @@ begin
171213
map_map measurable_inv (measurable_mul_const g⁻¹), function.comp, mul_inv_rev, inv_inv]
172214
end
173215

174-
end inv
216+
@[to_additive]
217+
lemma map_div_left_eq_self (μ : measure G) [is_inv_invariant μ] [is_mul_left_invariant μ] (g : G) :
218+
map (λ t, g / t) μ = μ :=
219+
begin
220+
simp_rw [div_eq_mul_inv],
221+
conv_rhs { rw [← map_mul_left_eq_self μ g, ← map_inv_eq_self μ] },
222+
exact (map_map (measurable_const_mul g) measurable_inv).symm
223+
end
175224

176-
section group
225+
@[to_additive]
226+
lemma map_mul_right_inv_eq_self (μ : measure G) [is_inv_invariant μ] [is_mul_left_invariant μ]
227+
(g : G) : map (λ t, (g * t)⁻¹) μ = μ :=
228+
begin
229+
conv_rhs { rw [← map_inv_eq_self μ, ← map_mul_left_eq_self μ g] },
230+
exact (map_map measurable_inv (measurable_const_mul g)).symm
231+
end
232+
233+
end mul_inv
234+
235+
end measure
236+
237+
section topological_group
177238

178239
variables [topological_space G] [borel_space G] {μ : measure G}
179240
variables [group G] [topological_group G]
@@ -263,7 +324,7 @@ lemma measure_lt_top_of_is_compact_of_is_mul_left_invariant'
263324
measure_lt_top_of_is_compact_of_is_mul_left_invariant (interior U) is_open_interior hU
264325
((measure_mono (interior_subset)).trans_lt (lt_top_iff_ne_top.2 h)).ne hK
265326

266-
end group
327+
end topological_group
267328

268329
section comm_group
269330

src/measure_theory/integral/bochner.lean

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -975,14 +975,20 @@ begin
975975
rw [this, hfi], refl }
976976
end
977977

978+
lemma integral_norm_eq_lintegral_nnnorm {G} [normed_group G] [measurable_space G]
979+
[opens_measurable_space G] {f : α → G} (hf : ae_measurable f μ) :
980+
∫ x, ∥f x∥ ∂μ = ennreal.to_real ∫⁻ x, ∥f x∥₊ ∂μ :=
981+
begin
982+
rw integral_eq_lintegral_of_nonneg_ae _ hf.norm,
983+
{ simp_rw [of_real_norm_eq_coe_nnnorm], },
984+
{ refine ae_of_all _ _, simp_rw [pi.zero_apply, norm_nonneg, imp_true_iff] },
985+
end
986+
978987
lemma of_real_integral_norm_eq_lintegral_nnnorm {G} [normed_group G] [measurable_space G]
979988
[opens_measurable_space G] {f : α → G} (hf : integrable f μ) :
980989
ennreal.of_real ∫ x, ∥f x∥ ∂μ = ∫⁻ x, ∥f x∥₊ ∂μ :=
981-
begin
982-
rw integral_eq_lintegral_of_nonneg_ae _ hf.1.norm,
983-
{ simp_rw [of_real_norm_eq_coe_nnnorm, ennreal.of_real_to_real (lt_top_iff_ne_top.mp hf.2)], },
984-
{ refine ae_of_all _ _, simp, },
985-
end
990+
by rw [integral_norm_eq_lintegral_nnnorm hf.ae_measurable,
991+
ennreal.of_real_to_real (lt_top_iff_ne_top.mp hf.2)]
986992

987993
lemma integral_eq_integral_pos_part_sub_integral_neg_part {f : α → ℝ} (hf : integrable f μ) :
988994
∫ a, f a ∂μ = (∫ a, real.to_nnreal (f a) ∂μ) - (∫ a, real.to_nnreal (-f a) ∂μ) :=

0 commit comments

Comments
 (0)