Skip to content

Commit f3e1fb7

Browse files
committed
feat(Analysis/Distribution): support (#34637)
We define the support of distributions. The definition applies to both tempered and classical distributions, but for this PR we only prove some elementary statements for tempered distributions.
1 parent 975f9e8 commit f3e1fb7

File tree

3 files changed

+256
-0
lines changed

3 files changed

+256
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,6 +1905,7 @@ public import Mathlib.Analysis.Distribution.SchwartzSpace
19051905
public import Mathlib.Analysis.Distribution.SchwartzSpace.Basic
19061906
public import Mathlib.Analysis.Distribution.SchwartzSpace.Deriv
19071907
public import Mathlib.Analysis.Distribution.SchwartzSpace.Fourier
1908+
public import Mathlib.Analysis.Distribution.Support
19081909
public import Mathlib.Analysis.Distribution.TemperateGrowth
19091910
public import Mathlib.Analysis.Distribution.TemperedDistribution
19101911
public import Mathlib.Analysis.Distribution.TestFunction
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
/-
2+
Copyright (c) 2026 Moritz Doll. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Moritz Doll, Anatole Dedecker
5+
-/
6+
module
7+
8+
public import Mathlib.Analysis.Distribution.TemperedDistribution
9+
10+
/-! # Support of distributions
11+
12+
We define the support of a distribution, `dsupport u`, as the intersection of all closed sets for
13+
which `u` vanishes on the complement.
14+
For this we also define a predicate `IsVanishingOn` that asserts that a map `f : F → V` vanishes on
15+
`s : Set α` if for all `u : F` with `tsupport u ⊆ s` it follows that `f u = 0`.
16+
17+
These definitions work independently of a specific class of distributions (classical, tempered, or
18+
compactly supported) and all basic properties are proved in an abstract setting using `FunLike`.
19+
20+
## Main definitions
21+
* `IsVanishingOn`: A distribution vanishes on a set if it acts trivially on all test functions
22+
supported in that subset.
23+
* `dsupport`: The support of a distribution is the intersection of all closed sets for which that
24+
distribution vanishes on the complement of the set.
25+
26+
## Main statements
27+
* `TemperedDistribution.dsupport_delta`: The support of the delta distribution is a single point.
28+
29+
-/
30+
31+
@[expose] public noncomputable section
32+
33+
variable {ι α β 𝕜 E F F₁ F₂ R V : Type*}
34+
35+
open scoped Topology
36+
37+
namespace Distribution
38+
39+
section IsVanishingOn
40+
41+
variable [FunLike F α β] [TopologicalSpace α] [Zero β]
42+
43+
variable {f g : F → V} {s s₁ s₂ : Set α}
44+
45+
/-! ### Vanishing of distributions -/
46+
47+
section Zero
48+
49+
variable [Zero V]
50+
51+
/-- A distribution `f` vanishes on a set `s` if it vanishes for all test functions `u` with
52+
`tsupport u ⊆ s`.
53+
54+
To make this definition work for all types of distributions, we define it for any function from
55+
a `FunLike` type to a type with zero. -/
56+
def IsVanishingOn (f : F → V) (s : Set α) : Prop :=
57+
∀ (u : F), tsupport u ⊆ s → f u = 0
58+
59+
@[gcongr]
60+
theorem IsVanishingOn.mono ⦃s₁ s₂ : Set α⦄ (hs : s₂ ⊆ s₁) (hf : IsVanishingOn f s₁) :
61+
IsVanishingOn f s₂ :=
62+
(hf · <| ·.trans hs)
63+
64+
theorem not_isVanishingOn_mono ⦃s₁ s₂ : Set α⦄ (hs : s₁ ⊆ s₂) (hf : ¬ IsVanishingOn f s₁) :
65+
¬ IsVanishingOn f s₂ :=
66+
(hf <| ·.mono hs)
67+
68+
theorem not_isVanishingOn_iff :
69+
¬ IsVanishingOn f s ↔ ∃ u : F, tsupport u ⊆ s ∧ f u ≠ 0 := by
70+
simp [IsVanishingOn]
71+
72+
end Zero
73+
74+
end IsVanishingOn
75+
76+
section dsupport
77+
78+
/-! ### Support -/
79+
80+
section Zero
81+
82+
variable [FunLike F α β] [TopologicalSpace α] [Zero β] [Zero V]
83+
84+
variable {f g : F → V} {s s₁ s₂ : Set α}
85+
86+
/-- The distributional support of `f` is the intersection of all closed sets `s` such that `f`
87+
vanishes on the complement of `s`.
88+
89+
To make this definition work for all types of distributions, we define it for any function from
90+
a `FunLike` type to a type with zero. -/
91+
def dsupport (f : F → V) : Set α := ⋂₀ { s | IsVanishingOn f sᶜ ∧ IsClosed s}
92+
93+
theorem mem_dsupport_iff (x : α) :
94+
x ∈ dsupport f ↔ ∀ (s : Set α), IsVanishingOn f sᶜ → IsClosed s → x ∈ s := by
95+
simp [dsupport]
96+
97+
/-- The complement of the support is the largest open set on which `f` vanishes. -/
98+
theorem dsupport_compl_eq : (dsupport f)ᶜ = ⋃₀ { a | IsVanishingOn f a ∧ IsOpen a } := by
99+
simp [dsupport, Set.compl_sInter, Set.compl_image_set_of]
100+
101+
@[simp high]
102+
theorem notMem_dsupport_iff (x : α) :
103+
x ∉ (dsupport f) ↔ ∃ (s : Set α), IsVanishingOn f s ∧ IsOpen s ∧ x ∈ s := by
104+
simp [← Set.mem_compl_iff, dsupport_compl_eq, Set.mem_sUnion, and_assoc]
105+
106+
theorem mem_dsupport_iff_not_isVanishingOn (x : α) :
107+
x ∈ dsupport f ↔ ∀ s, x ∈ s → IsOpen s → ¬ IsVanishingOn f s := by
108+
grind only [notMem_dsupport_iff]
109+
110+
theorem mem_dsupport_iff_forall_exists_ne (x : α) :
111+
x ∈ dsupport f ↔ ∀ s, x ∈ s → IsOpen s → ∃ u : F, tsupport u ⊆ s ∧ f u ≠ 0 := by
112+
simp_rw [mem_dsupport_iff_not_isVanishingOn, not_isVanishingOn_iff]
113+
114+
theorem mem_dsupport_iff_frequently {x : α} :
115+
x ∈ dsupport f ↔ ∃ᶠ u in (𝓝 x).smallSets, ¬ IsVanishingOn f u := by
116+
rw [nhds_basis_opens x |>.frequently_smallSets not_isVanishingOn_mono]
117+
simpa using mem_dsupport_iff_not_isVanishingOn x
118+
119+
theorem _root_.Filter.HasBasis.mem_dsupport {ι : Sort*} {p : ι → Prop}
120+
{s : ι → Set α} {x : α} (hl : (𝓝 x).HasBasis p s) :
121+
x ∈ dsupport f ↔ ∀ (i : ι), p i → ¬ IsVanishingOn f (s i) := by
122+
rw [mem_dsupport_iff_frequently]
123+
exact hl.frequently_smallSets not_isVanishingOn_mono
124+
125+
theorem notMem_dsupport_iff_eventually {x : α} :
126+
x ∉ dsupport f ↔ ∀ᶠ u in (𝓝 x).smallSets, IsVanishingOn f u := by
127+
simp [mem_dsupport_iff_frequently]
128+
129+
theorem _root_.Filter.HasBasis.notMem_dsupport {ι : Sort*} {p : ι → Prop}
130+
{s : ι → Set α} {x : α} (hl : (𝓝 x).HasBasis p s) :
131+
x ∉ dsupport f ↔ ∃ i, p i ∧ IsVanishingOn f (s i) := by
132+
simp [hl.mem_dsupport]
133+
134+
@[gcongr]
135+
theorem dsupport_subset_dsupport
136+
(h : ∀ (s : Set α) (_ : IsOpen s), IsVanishingOn g s → IsVanishingOn f s) :
137+
dsupport f ⊆ dsupport g :=
138+
Set.sInter_mono fun s ⟨g_van, s_cl⟩ ↦ ⟨h sᶜ s_cl.isOpen_compl g_van, s_cl⟩
139+
140+
@[grind .]
141+
theorem isClosed_dsupport : IsClosed (dsupport f) := by
142+
grind [dsupport, isClosed_sInter]
143+
144+
theorem IsVanishingOn.disjoint_dsupport (h : IsVanishingOn f s) (s_open : IsOpen s) :
145+
Disjoint s (dsupport f) := by
146+
rw [← Set.subset_compl_iff_disjoint_right, dsupport_compl_eq]
147+
exact Set.subset_sUnion_of_mem ⟨h, s_open⟩
148+
149+
end Zero
150+
151+
end dsupport
152+
153+
section normed
154+
155+
variable [FunLike F α β] [PseudoMetricSpace α] [Zero β] [Zero V]
156+
157+
variable {f : F → V}
158+
159+
/-- The complement of the support is given by all *bounded* open sets on which `f` vanishes. -/
160+
theorem compl_dsupport_eq_sUnion_isBounded :
161+
(dsupport f)ᶜ = ⋃₀ { a | IsVanishingOn f a ∧ IsOpen a ∧ Bornology.IsBounded a } := by
162+
ext x
163+
grind [(Metric.hasBasis_nhds_isOpen_isBounded x).notMem_dsupport]
164+
165+
end normed
166+
167+
/-! ## Tempered distributions -/
168+
169+
open SchwartzMap Distribution TemperedDistribution
170+
171+
variable [NormedAddCommGroup E] [NormedAddCommGroup F] [NormedSpace ℝ E] [NormedSpace ℂ F]
172+
173+
variable {f : 𝓢'(E, F)} {s : Set E}
174+
175+
namespace IsVanishingOn
176+
177+
open scoped Topology
178+
179+
@[grind .]
180+
theorem smulLeftCLM (hf : IsVanishingOn f s) {g : E → ℂ} (hg : g.HasTemperateGrowth) :
181+
IsVanishingOn (smulLeftCLM F g f) s := by
182+
intro u hu
183+
apply hf ((SchwartzMap.smulLeftCLM ℂ g) u)
184+
rw [SchwartzMap.smulLeftCLM_apply hg]
185+
exact (tsupport_smul_subset_right g u).trans hu
186+
187+
open LineDeriv
188+
189+
@[grind .]
190+
theorem lineDerivOp (hf : IsVanishingOn f s) (m : E) :
191+
IsVanishingOn (∂_{m} f : 𝓢'(E, F)) s := by
192+
intro u hu
193+
simp only [lineDerivOp_apply_apply, map_neg, neg_eq_zero]
194+
exact hf (∂_{m} u) <| (tsupport_fderiv_apply_subset ℝ m).trans hu
195+
196+
@[grind .]
197+
theorem iteratedLineDerivOp {n : ℕ} (hf : IsVanishingOn f s) (m : Fin n → E) :
198+
IsVanishingOn (∂^{m} f : 𝓢'(E, F)) s := by
199+
induction n with
200+
| zero =>
201+
exact hf
202+
| succ n IH =>
203+
exact (IH <| Fin.tail m).lineDerivOp (m 0)
204+
205+
@[grind .]
206+
theorem _root_.TemperedDistribution.isVanishingOn_delta (x : E) :
207+
IsVanishingOn (TemperedDistribution.delta x) {x}ᶜ := by
208+
intro u hu
209+
rw [Set.subset_compl_singleton_iff] at hu
210+
apply image_eq_zero_of_notMem_tsupport hu
211+
212+
end IsVanishingOn
213+
214+
section Support
215+
216+
theorem dsupport_smulLeftCLM_subset {g : E → ℂ} (hg : g.HasTemperateGrowth) :
217+
dsupport (smulLeftCLM F g f) ⊆ dsupport f := by
218+
gcongr; grind
219+
220+
open LineDeriv
221+
222+
theorem dsupport_lineDerivOp_subset (m : E) : dsupport (∂_{m} f : 𝓢'(E, F)) ⊆ dsupport f := by
223+
gcongr; grind
224+
225+
theorem dsupport_iteratedLineDerivOp_subset {n : ℕ} (m : Fin n → E) :
226+
dsupport (∂^{m} f : 𝓢'(E, F)) ⊆ dsupport f := by
227+
gcongr; grind
228+
229+
theorem dsupport_delta [FiniteDimensional ℝ E] (x : E) :
230+
dsupport (TemperedDistribution.delta x) = {x} := by
231+
apply subset_antisymm
232+
· intro x' hx'
233+
rw [mem_dsupport_iff] at hx'
234+
exact hx' {x} (isVanishingOn_delta x) (T1Space.t1 x)
235+
rintro x rfl
236+
rw [mem_dsupport_iff_forall_exists_ne]
237+
intro s hx hs
238+
obtain ⟨u, h₁, h₂, h₃, -, h₄⟩ :=
239+
exists_contDiff_tsupport_subset (n := ⊤) ((IsOpen.mem_nhds_iff hs).mpr hx)
240+
have h₁' : tsupport (Complex.ofRealCLM ∘ u) ⊆ s := (tsupport_comp_subset rfl _).trans h₁
241+
have h₂' : HasCompactSupport (Complex.ofRealCLM ∘ u) := h₂.comp_left rfl
242+
use h₂'.toSchwartzMap (Complex.ofRealCLM.contDiff.comp h₃)
243+
exact ⟨h₁', by simp [h₄]⟩
244+
245+
end Support
246+
247+
end Distribution

Mathlib/Topology/MetricSpace/Bounded.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ protected theorem _root_.Bornology.IsBounded.closure (h : IsBounded s) : IsBound
121121
theorem isBounded_closure_iff : IsBounded (closure s) ↔ IsBounded s :=
122122
fun h => h.subset subset_closure, fun h => h.closure⟩
123123

124+
theorem hasBasis_nhds_isOpen_isBounded (x : α) :
125+
(𝓝 x).HasBasis (fun a ↦ x ∈ a ∧ IsOpen a ∧ Bornology.IsBounded a) id := by
126+
simp_rw [← and_assoc]
127+
apply (nhds_basis_opens x).restrict fun s hs ↦ ?_
128+
exact ⟨s ∩ Metric.ball x 1,
129+
by aesop (add safe apply IsOpen.inter),
130+
by simpa using Metric.isBounded_ball.subset Set.inter_subset_right⟩
131+
124132
theorem hasBasis_cobounded_compl_closedBall (c : α) :
125133
(cobounded α).HasBasis (fun _ ↦ True) (fun r ↦ (closedBall c r)ᶜ) :=
126134
⟨compl_surjective.forall.2 fun _ ↦ (isBounded_iff_subset_closedBall c).trans <| by simp⟩

0 commit comments

Comments
 (0)