@@ -21,7 +21,7 @@ functions `f : E → F` (where `F` is a normed vector space) such that:
2121- `f` vanishes outside of a compact set: `EqOn f 0 Kᶜ`.
2222
2323 The main reason this exists as a bundled type is to be endowed with its natural locally convex
24- topology (namely, uniform convergence of `f` and its derivative up to order `n`).
24+ topology (namely, uniform convergence of `f` and its derivatives up to order `n`).
2525Taking the locally convex inductive limit of these as `K` varies yields the natural topology on test
2626functions, used to define distributions. While most of distribution theory cares only about `C^∞`
2727functions, we also want to endow the space of `C^n` test functions with its natural topology.
@@ -32,9 +32,11 @@ larger space of test functions.
3232
3333- `ContDiffMapSupportedIn E F n K`: the type of bundled `n`-times continuously differentiable
3434 functions `E → F` which vanish outside of `K`.
35- - `ContDiffMapSupportedIn.iteratedFDerivₗ'`: wraps `iteratedFDeriv` into a `𝕜`-linear map on
36- `ContDiffMapSupportedIn E F n K`, as a map into
37- `ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) (n-i) K`.
35+ - `ContDiffMapSupportedIn.iteratedFDerivWithOrderLM`: wrapper, as a `𝕜`-linear map, for
36+ `iteratedFDeriv` from `ContDiffMapSupportedIn E F n K` to
37+ `ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) k K`.
38+ - `ContDiffMapSupportedIn.iteratedFDerivLM`: specialization of the above, giving a `𝕜`-linear map
39+ from `ContDiffMapSupportedIn E F ⊤ K` to `ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) ⊤ K`.
3840
3941 ## Main statements
4042
@@ -52,21 +54,28 @@ TODO:
5254
5355 ## Implementation details
5456
55- The technical choice of spelling `EqOn f 0 Kᶜ` in the definition, as opposed to `tsupport f ⊆ K`
56- is to make rewriting `f x` to `0` easier when `x ∉ K`.
57+ * The technical choice of spelling `EqOn f 0 Kᶜ` in the definition, as opposed to `tsupport f ⊆ K`
58+ is to make rewriting `f x` to `0` easier when `x ∉ K`.
59+ * Since the most common case is by far the smooth case, we often reserve the "expected" name
60+ of a result/definition to this case, and add `WithOrder` to the declaration applying to
61+ any regularity.
62+ * In `iteratedFDerivWithOrderLM`, we define the `i`-th iterated differentiation operator as
63+ a map from `𝓓^{n}_{K}` to `𝓓^{k}_{K}` without imposing relations on `n`, `k` and `i`. Of course
64+ this is defined as `0` if `k + i > n`. This creates some verbosity as all of these variables are
65+ explicit, but it allows the most flexibility while avoiding DTT hell.
5766
5867 ## Tags
5968
6069distributions
6170-/
6271
6372open TopologicalSpace SeminormFamily Set Function Seminorm UniformSpace
64- open scoped BoundedContinuousFunction Topology NNReal
73+ open scoped BoundedContinuousFunction Topology NNReal ContDiff
6574
6675variable (𝕜 E F : Type *) [NontriviallyNormedField 𝕜]
6776 [NormedAddCommGroup E] [NormedSpace ℝ E]
6877 [NormedAddCommGroup F] [NormedSpace ℝ F] [NormedSpace 𝕜 F] [SMulCommClass ℝ 𝕜 F]
69- {n : ℕ∞} {K : Compacts E}
78+ {n k : ℕ∞} {K : Compacts E}
7079
7180/-- The type of bundled `n`-times continuously differentiable maps which vanish outside of a fixed
7281compact set `K`. -/
@@ -160,8 +169,8 @@ theorem copy_eq (f : 𝓓^{n}_{K}(E, F)) (f' : E → F) (h : f' = f) : f.copy f'
160169 DFunLike.ext' h
161170
162171@[simp]
163- theorem toBoundedContinuousFunction_apply (f : 𝓓^{n}_{K}(E, F)) (x : E ) :
164- (f : BoundedContinuousFunction E F) x = (f x ) := rfl
172+ theorem coe_toBoundedContinuousFunction (f : 𝓓^{n}_{K}(E, F)) :
173+ (f : BoundedContinuousFunction E F) = (f : E → F ) := rfl
165174
166175section AddCommGroup
167176
@@ -243,4 +252,159 @@ protected def of_support_subset {f : E → F} (hf : ContDiff ℝ n f) (hsupp : s
243252 contDiff' := hf
244253 zero_on_compl' := support_subset_iff'.mp hsupp
245254
255+ protected theorem bounded_iteratedFDeriv (f : 𝓓^{n}_{K}(E, F)) {i : ℕ} (hi : i ≤ n) :
256+ ∃ C, ∀ x, ‖iteratedFDeriv ℝ i f x‖ ≤ C :=
257+ Continuous.bounded_above_of_compact_support
258+ (f.contDiff.continuous_iteratedFDeriv <| (WithTop.le_coe rfl).mpr hi)
259+ (f.hasCompactSupport.iteratedFDeriv i)
260+
261+ /-- Inclusion of `𝓓^{n}_{K}(E, F)` into the space `E →ᵇ F` of bounded continuous maps
262+ as a `𝕜`-linear map.
263+
264+ This is subsumed by `toBoundedContinuousFunctionCLM` (not yet in Mathlib), which also bundles the
265+ continuity. -/
266+ @[simps -fullyApplied]
267+ noncomputable def toBoundedContinuousFunctionLM : 𝓓^{n}_{K}(E, F) →ₗ[𝕜] E →ᵇ F where
268+ toFun f := f
269+ map_add' _ _ := rfl
270+ map_smul' _ _ := rfl
271+
272+ -- Workaround for simps' automatic name generation: manually specifying names is not supported yet.
273+ alias toBoundedContinuousFunctionLM_apply := toBoundedContinuousFunctionLM_apply_apply
274+
275+ lemma toBoundedContinuousFunctionLM_eq_of_scalars (𝕜' : Type *) [NontriviallyNormedField 𝕜']
276+ [NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
277+ (toBoundedContinuousFunctionLM 𝕜 : 𝓓^{n}_{K}(E, F) → _) = toBoundedContinuousFunctionLM 𝕜' :=
278+ rfl
279+
280+ variable (n k) in
281+ /-- `iteratedFDerivWithOrderLM 𝕜 n k i` is the `𝕜`-linear-map sending `f : 𝓓^{n}_{K}(E, F)` to
282+ its `i`-th iterated derivative as an element of `𝓓^{k}_{K}(E, E [×i]→L[ℝ] F)`.
283+ This only makes mathematical sense if `k + i ≤ n`, otherwise we define it as the zero map.
284+
285+ See `iteratedFDerivLM` for the very common case where everything is infinitely differentiable.
286+
287+ This is subsumed by `iteratedFDerivWithOrderCLM` (not yet in Mathlib), which also bundles the
288+ continuity. -/
289+ noncomputable def iteratedFDerivWithOrderLM (i : ℕ) :
290+ 𝓓^{n}_{K}(E, F) →ₗ[𝕜] 𝓓^{k}_{K}(E, E [×i]→L[ℝ] F) where
291+ /-
292+ Note: it is tempting to define this as some linear map if `k + i ≤ n`,
293+ and the zero map otherwise. However, we would lose the definitional equality between
294+ `iteratedFDerivWithOrderLM 𝕜 n k i f` and `iteratedFDerivWithOrderLM ℝ n k i f`.
295+
296+ This is caused by the fact that the equality `f (if p then x else y) = if p then f x else f y`
297+ is not definitional.
298+ -/
299+ toFun f :=
300+ if hi : k + i ≤ n then
301+ .of_support_subset
302+ (f.contDiff.iteratedFDeriv_right <| by exact_mod_cast hi)
303+ ((support_iteratedFDeriv_subset i).trans f.tsupport_subset)
304+ else 0
305+ map_add' f g := by
306+ split_ifs with hi
307+ · have hi' : (i : WithTop ℕ∞) ≤ n := by exact_mod_cast le_of_add_le_right hi
308+ ext
309+ simp [iteratedFDeriv_add (f.contDiff.of_le hi') (g.contDiff.of_le hi')]
310+ · simp
311+ map_smul' c f := by
312+ split_ifs with hi
313+ · have hi' : (i : WithTop ℕ∞) ≤ n := by exact_mod_cast le_of_add_le_right hi
314+ ext
315+ simp [iteratedFDeriv_const_smul_apply (f.contDiff.of_le hi').contDiffAt]
316+ · simp
317+
318+ @[simp]
319+ lemma iteratedFDerivWithOrderLM_apply {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) :
320+ iteratedFDerivWithOrderLM 𝕜 n k i f = if k + i ≤ n then iteratedFDeriv ℝ i f else 0 := by
321+ rw [ContDiffMapSupportedIn.iteratedFDerivWithOrderLM]
322+ split_ifs <;> rfl
323+
324+ lemma iteratedFDerivWithOrderLM_apply_of_le {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) (hin : k + i ≤ n) :
325+ iteratedFDerivWithOrderLM 𝕜 n k i f = iteratedFDeriv ℝ i f := by
326+ simp [hin]
327+
328+ lemma iteratedFDerivWithOrderLM_apply_of_gt {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) (hin : ¬ (k + i ≤ n)) :
329+ iteratedFDerivWithOrderLM 𝕜 n k i f = 0 := by
330+ ext : 1
331+ simp [hin]
332+
333+ lemma iteratedFDerivWithOrderLM_eq_of_scalars {i : ℕ} (𝕜' : Type *) [NontriviallyNormedField 𝕜']
334+ [NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
335+ (iteratedFDerivWithOrderLM 𝕜 n k i : 𝓓^{n}_{K}(E, F) → _)
336+ = iteratedFDerivWithOrderLM 𝕜' n k i :=
337+ rfl
338+
339+ /-- `iteratedFDerivLM 𝕜 i` is the `𝕜`-linear-map sending `f : 𝓓_{K}(E, F)` to
340+ its `i`-th iterated derivative as an element of `𝓓_{K}(E, E [×i]→L[ℝ] F)`.
341+
342+ See also `iteratedFDerivWithOrderLM` if you need more control on the regularities.
343+
344+ This is subsumed by `iteratedFDerivCLM` (not yet in Mathlib), which also bundles the
345+ continuity. -/
346+ noncomputable def iteratedFDerivLM (i : ℕ) :
347+ 𝓓_{K}(E, F) →ₗ[𝕜] 𝓓_{K}(E, E [×i]→L[ℝ] F) where
348+ toFun f := .of_support_subset
349+ (f.contDiff.iteratedFDeriv_right le_rfl)
350+ ((support_iteratedFDeriv_subset i).trans f.tsupport_subset)
351+ map_add' f g := by
352+ have hi : (i : WithTop ℕ∞) ≤ ∞ := by exact_mod_cast le_top
353+ ext
354+ simp [iteratedFDeriv_add (f.contDiff.of_le hi) (g.contDiff.of_le hi)]
355+ map_smul' c f := by
356+ have hi : (i : WithTop ℕ∞) ≤ ∞ := by exact_mod_cast le_top
357+ ext
358+ simp [iteratedFDeriv_const_smul_apply (f.contDiff.of_le hi).contDiffAt]
359+
360+ @[simp]
361+ lemma iteratedFDerivLM_apply {i : ℕ} (f : 𝓓_{K}(E, F)) :
362+ iteratedFDerivLM 𝕜 i f = iteratedFDeriv ℝ i f :=
363+ rfl
364+
365+ /-- Note: this turns out to be a definitional equality thanks to decidablity of the order
366+ on `ℕ∞`. This means we could have *defined* `iteratedFDerivLM` this way, but we avoid it
367+ to make sure that `if`s won't appear in the smooth case. -/
368+ lemma iteratedFDerivLM_eq_withOrder (i : ℕ) :
369+ (iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) →ₗ[𝕜] _) = iteratedFDerivWithOrderLM 𝕜 ⊤ ⊤ i :=
370+ rfl
371+
372+ lemma iteratedFDerivLM_eq_of_scalars {i : ℕ} (𝕜' : Type *) [NontriviallyNormedField 𝕜']
373+ [NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
374+ (iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) → _) = iteratedFDerivLM 𝕜' i :=
375+ rfl
376+
377+ variable (n) in
378+ /-- `structureMapLM 𝕜 n i` is the `𝕜`-linear-map sending `f : 𝓓^{n}_{K}(E, F)` to its
379+ `i`-th iterated derivative as an element of `E →ᵇ (E [×i]→L[ℝ] F)`. In other words, it
380+ is the composition of `toBoundedContinuousFunctionLM 𝕜` and `iteratedFDerivWithOrderLM 𝕜 n 0 i`.
381+ This only makes mathematical sense if `i ≤ n`, otherwise we define it as the zero map.
382+
383+ We call these "structure maps" because they define the topology on `𝓓^{n}_{K}(E, F)`.
384+
385+ This is subsumed by `structureMapCLM` (not yet in Mathlib), which also bundles the
386+ continuity. -/
387+ noncomputable def structureMapLM (i : ℕ) :
388+ 𝓓^{n}_{K}(E, F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F) :=
389+ toBoundedContinuousFunctionLM 𝕜 ∘ₗ iteratedFDerivWithOrderLM 𝕜 n 0 i
390+
391+ lemma structureMapLM_eq {i : ℕ} :
392+ (structureMapLM 𝕜 ⊤ i : 𝓓_{K}(E, F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F)) =
393+ (toBoundedContinuousFunctionLM 𝕜 : 𝓓_{K}(E, E [×i]→L[ℝ] F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F)) ∘ₗ
394+ (iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) →ₗ[𝕜] 𝓓_{K}(E, E [×i]→L[ℝ] F)) :=
395+ rfl
396+
397+ lemma structureMapLM_apply_withOrder {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) :
398+ structureMapLM 𝕜 n i f = if i ≤ n then iteratedFDeriv ℝ i f else 0 := by
399+ simp [structureMapLM]
400+
401+ lemma structureMapLM_apply {i : ℕ} (f : 𝓓_{K}(E, F)) :
402+ structureMapLM 𝕜 ⊤ i f = iteratedFDeriv ℝ i f := by
403+ simp [structureMapLM_eq]
404+
405+ lemma structureMapLM_eq_of_scalars {i : ℕ} (𝕜' : Type *) [NontriviallyNormedField 𝕜']
406+ [NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
407+ (structureMapLM 𝕜 n i : 𝓓^{n}_{K}(E, F) → _) = structureMapLM 𝕜' n i :=
408+ rfl
409+
246410end ContDiffMapSupportedIn
0 commit comments