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

Commit 262dfc9

Browse files
committed
feat(analysis/convolution): weaken typeclass assumptions (#17452)
Remove some finite-dimensionality or propertness assumptions, by noticing that if a compactly supported function is nonzero then the space has to be finite-dimensional.
1 parent 23cd34b commit 262dfc9

File tree

4 files changed

+92
-18
lines changed

4 files changed

+92
-18
lines changed

src/analysis/convolution.lean

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,10 @@ lemma convolution_smul [smul_comm_class ℝ 𝕜 F]
420420
{y : 𝕜} : f ⋆[L, μ] (y • g) = y • (f ⋆[L, μ] g) :=
421421
by { ext, simp only [pi.smul_apply, convolution_def, ← integral_smul, (L _).map_smul] }
422422

423-
lemma zero_convolution : 0 ⋆[L, μ] g = 0 :=
423+
@[simp] lemma zero_convolution : 0 ⋆[L, μ] g = 0 :=
424424
by { ext, simp_rw [convolution_def, pi.zero_apply, L.map_zero₂, integral_zero] }
425425

426-
lemma convolution_zero : f ⋆[L, μ] 0 = 0 :=
426+
@[simp] lemma convolution_zero : f ⋆[L, μ] 0 = 0 :=
427427
by { ext, simp_rw [convolution_def, pi.zero_apply, (L _).map_zero, integral_zero] }
428428

429429
lemma convolution_exists_at.distrib_add {x : G} (hfg : convolution_exists_at f g x L μ)
@@ -582,6 +582,19 @@ lemma convolution_mul_swap [normed_space ℝ 𝕜] [complete_space 𝕜] {f : G
582582
(f ⋆[mul 𝕜 𝕜, μ] g) x = ∫ t, f (x - t) * g t ∂μ :=
583583
convolution_eq_swap _
584584

585+
/-- The convolution of two even functions is also even. -/
586+
lemma convolution_neg_of_neg_eq (h1 : ∀ᵐ x ∂μ, f (-x) = f x) (h2 : ∀ᵐ x ∂μ, g (-x) = g x) :
587+
(f ⋆[L, μ] g) (-x) = (f ⋆[L, μ] g) x :=
588+
calc ∫ (t : G), (L (f t)) (g (-x - t)) ∂μ
589+
= ∫ (t : G), (L (f (-t))) (g (x + t)) ∂μ :
590+
begin
591+
apply integral_congr_ae,
592+
filter_upwards [h1, (eventually_add_left_iff μ x).2 h2] with t ht h't,
593+
simp_rw [ht, ← h't, neg_add'],
594+
end
595+
... = ∫ (t : G), (L (f t)) (g (x - t)) ∂μ :
596+
by { rw ← integral_neg_eq_self, simp only [neg_neg, ← sub_eq_add_neg] }
597+
585598
end measurable
586599

587600
variables [topological_space G]
@@ -933,20 +946,23 @@ end
933946

934947
end assoc
935948

936-
variables [normed_add_comm_group G] [borel_space G]
937-
variables [second_countable_topology G] [sigma_compact_space G]
949+
variables [normed_add_comm_group G] [borel_space G] [normed_space 𝕜 G]
938950

939951
lemma convolution_precompR_apply {g : G → E'' →L[𝕜] E'}
940952
(hf : locally_integrable f μ) (hcg : has_compact_support g) (hg : continuous g)
941953
(x₀ : G) (x : E'') : (f ⋆[L.precompR E'', μ] g) x₀ x = (f ⋆[L, μ] (λ a, g a x)) x₀ :=
942954
begin
955+
rcases hcg.eq_zero_or_finite_dimensional 𝕜 hg with rfl|fin_dim,
956+
{ simp only [convolution, pi.zero_apply, integral_const, smul_zero, zero_apply,
957+
_root_.map_zero] },
958+
resetI,
959+
haveI : proper_space G, from finite_dimensional.proper_is_R_or_C 𝕜 G,
943960
have := hcg.convolution_exists_right (L.precompR E'' : _) hf hg x₀,
944961
simp_rw [convolution_def, continuous_linear_map.integral_apply this],
945962
refl,
946963
end
947964

948965
variables [sigma_finite μ] [is_add_left_invariant μ]
949-
variables [normed_space 𝕜 G] [proper_space G]
950966

951967
/-- Compute the total derivative of `f ⋆ g` if `g` is `C^1` with compact support and `f` is locally
952968
integrable. To write down the total derivative as a convolution, we use
@@ -955,6 +971,12 @@ lemma has_compact_support.has_fderiv_at_convolution_right
955971
(hcg : has_compact_support g) (hf : locally_integrable f μ) (hg : cont_diff 𝕜 1 g) (x₀ : G) :
956972
has_fderiv_at (f ⋆[L, μ] g) ((f ⋆[L.precompR G, μ] fderiv 𝕜 g) x₀) x₀ :=
957973
begin
974+
rcases hcg.eq_zero_or_finite_dimensional 𝕜 hg.continuous with rfl|fin_dim,
975+
{ have : fderiv 𝕜 (0 : G → E') = 0, from fderiv_const (0 : E'),
976+
simp only [this, convolution_zero, pi.zero_apply],
977+
exact has_fderiv_at_const (0 : F) x₀ },
978+
resetI,
979+
haveI : proper_space G, from finite_dimensional.proper_is_R_or_C 𝕜 G,
958980
set L' := L.precompR G,
959981
have h1 : ∀ᶠ x in 𝓝 x₀, ae_strongly_measurable (λ t, L (f t) (g (x - t))) μ :=
960982
eventually_of_forall
@@ -988,10 +1010,14 @@ begin
9881010
exact hcf.has_fderiv_at_convolution_right L.flip hg hf x₀,
9891011
end
9901012

991-
lemma has_compact_support.cont_diff_convolution_right [finite_dimensional 𝕜 G]
1013+
lemma has_compact_support.cont_diff_convolution_right
9921014
(hcg : has_compact_support g) (hf : locally_integrable f μ) (hg : cont_diff 𝕜 n g) :
9931015
cont_diff 𝕜 n (f ⋆[L, μ] g) :=
9941016
begin
1017+
rcases hcg.eq_zero_or_finite_dimensional 𝕜 hg.continuous with rfl|fin_dim,
1018+
{ simp only [convolution_zero], exact cont_diff_zero_fun, },
1019+
resetI,
1020+
haveI : proper_space G, from finite_dimensional.proper_is_R_or_C 𝕜 G,
9951021
induction n using enat.nat_induction with n ih ih generalizing g,
9961022
{ rw [cont_diff_zero] at hg ⊢,
9971023
exact hcg.continuous_convolution_right L hf hg },
@@ -1011,7 +1037,7 @@ begin
10111037
{ rw [cont_diff_top] at hg ⊢, exact λ n, ih n hcg (hg n) }
10121038
end
10131039

1014-
lemma has_compact_support.cont_diff_convolution_left [finite_dimensional 𝕜 G] [is_neg_invariant μ]
1040+
lemma has_compact_support.cont_diff_convolution_left [is_neg_invariant μ]
10151041
(hcf : has_compact_support f) (hf : cont_diff 𝕜 n f) (hg : locally_integrable g μ) :
10161042
cont_diff 𝕜 n (f ⋆[L, μ] g) :=
10171043
by { rw [← convolution_flip], exact hcf.cont_diff_convolution_right L.flip hg hf }

src/analysis/normed_space/finite_dimension.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,27 @@ begin
511511
simpa using h.image this,
512512
end
513513

514+
/-- If a function has compact multiplicative support, then either the function is trivial or the
515+
space if finite-dimensional. -/
516+
@[to_additive "If a function has compact support, then either the function is trivial or the
517+
space if finite-dimensional."]
518+
lemma has_compact_mul_support.eq_one_or_finite_dimensional {X : Type*}
519+
[topological_space X] [has_one X] [t2_space X]
520+
{f : E → X} (hf : has_compact_mul_support f) (h'f : continuous f) :
521+
f = 1 ∨ finite_dimensional 𝕜 E :=
522+
begin
523+
by_cases h : ∀ x, f x = 1, { apply or.inl, ext x, exact h x },
524+
apply or.inr,
525+
push_neg at h,
526+
obtain ⟨x, hx⟩ : ∃ x, f x ≠ 1, from h,
527+
have : function.mul_support f ∈ 𝓝 x, from h'f.is_open_mul_support.mem_nhds hx,
528+
obtain ⟨r, rpos, hr⟩ : ∃ (r : ℝ) (hi : 0 < r), metric.closed_ball x r ⊆ function.mul_support f,
529+
from metric.nhds_basis_closed_ball.mem_iff.1 this,
530+
have : is_compact (metric.closed_ball x r),
531+
from is_compact_of_is_closed_subset hf metric.is_closed_ball (hr.trans (subset_mul_tsupport _)),
532+
exact finite_dimensional_of_is_compact_closed_ball 𝕜 rpos this,
533+
end
534+
514535
end riesz
515536

516537
/-- An injective linear map with finite-dimensional domain is a closed embedding. -/

src/measure_theory/group/measure.lean

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,23 @@ begin
159159
{ rw map_mul_right_eq_self ν h, apply_instance },
160160
end
161161

162+
@[to_additive]
163+
lemma is_mul_left_invariant_map {H : Type*}
164+
[measurable_space H] [has_mul H] [has_measurable_mul H]
165+
[is_mul_left_invariant μ]
166+
(f : G →ₙ* H) (hf : measurable f) (h_surj : surjective f) :
167+
is_mul_left_invariant (measure.map f μ) :=
168+
begin
169+
refine ⟨λ h, _⟩,
170+
rw map_map (measurable_const_mul _) hf,
171+
obtain ⟨g, rfl⟩ := h_surj h,
172+
conv_rhs { rw ← map_mul_left_eq_self μ g },
173+
rw map_map hf (measurable_const_mul _),
174+
congr' 2,
175+
ext y,
176+
simp only [comp_app, map_mul],
177+
end
178+
162179
end has_measurable_mul
163180

164181
end mul
@@ -211,6 +228,21 @@ lemma map_div_right_ae (μ : measure G) [is_mul_right_invariant μ] (x : G) :
211228
filter.map (λ t, t / x) μ.ae = μ.ae :=
212229
((measurable_equiv.div_right x).map_ae μ).trans $ congr_arg ae $ map_div_right_eq_self μ x
213230

231+
@[to_additive]
232+
lemma eventually_mul_left_iff (μ : measure G) [is_mul_left_invariant μ] (t : G) {p : G → Prop} :
233+
(∀ᵐ x ∂μ, p (t * x)) ↔ ∀ᵐ x ∂μ, p x :=
234+
by { conv_rhs { rw [filter.eventually, ← map_mul_left_ae μ t] }, refl }
235+
236+
@[to_additive]
237+
lemma eventually_mul_right_iff (μ : measure G) [is_mul_right_invariant μ] (t : G) {p : G → Prop} :
238+
(∀ᵐ x ∂μ, p (x * t)) ↔ ∀ᵐ x ∂μ, p x :=
239+
by { conv_rhs { rw [filter.eventually, ← map_mul_right_ae μ t] }, refl }
240+
241+
@[to_additive]
242+
lemma eventually_div_right_iff (μ : measure G) [is_mul_right_invariant μ] (t : G) {p : G → Prop} :
243+
(∀ᵐ x ∂μ, p (x / t)) ↔ ∀ᵐ x ∂μ, p x :=
244+
by { conv_rhs { rw [filter.eventually, ← map_div_right_ae μ t] }, refl }
245+
214246
end group
215247

216248
namespace measure
@@ -523,17 +555,7 @@ lemma is_haar_measure_map [borel_space G] [topological_group G] {H : Type*} [gro
523555
(f : G →* H) (hf : continuous f) (h_surj : surjective f)
524556
(h_prop : tendsto f (cocompact G) (cocompact H)) :
525557
is_haar_measure (measure.map f μ) :=
526-
{ to_is_mul_left_invariant := begin
527-
constructor,
528-
assume h,
529-
rw map_map (continuous_mul_left h).measurable hf.measurable,
530-
obtain ⟨g, rfl⟩ := h_surj h,
531-
conv_rhs { rw ← map_mul_left_eq_self μ g },
532-
rw map_map hf.measurable (continuous_mul_left _).measurable,
533-
congr' 2,
534-
ext y,
535-
simp only [comp_app, map_mul],
536-
end,
558+
{ to_is_mul_left_invariant := is_mul_left_invariant_map f.to_mul_hom hf.measurable h_surj,
537559
lt_top_of_is_compact := begin
538560
assume K hK,
539561
rw map_apply hf.measurable hK.measurable_set,

src/topology/separation.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,11 @@ is_closed_singleton.is_open_compl
315315
lemma is_open_ne [t1_space α] {x : α} : is_open {y | y ≠ x} :=
316316
is_open_compl_singleton
317317

318+
@[to_additive]
319+
lemma continuous.is_open_mul_support [t1_space α] [has_one α] [topological_space β]
320+
{f : β → α} (hf : continuous f) : is_open (mul_support f) :=
321+
is_open_ne.preimage hf
322+
318323
lemma ne.nhds_within_compl_singleton [t1_space α] {x y : α} (h : x ≠ y) :
319324
𝓝[{y}ᶜ] x = 𝓝 x :=
320325
is_open_ne.nhds_within_eq h

0 commit comments

Comments
 (0)