Skip to content

Commit 62126e3

Browse files
committed
feat(Analysis/Distribution/SchwartzMap): projection to ZeroAtInfty and corresponding type class (#9987)
Adds a characterization of ZeroAtInfty in terms of norms and uses one direction to show that every Schwartz function is zero at infinity. We also add a few lemmas that characterize elements of the `cocompact` filter in terms of norm estimates.
1 parent 922e827 commit 62126e3

File tree

4 files changed

+156
-3
lines changed

4 files changed

+156
-3
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,7 @@ import Mathlib.Analysis.Normed.Group.SemiNormedGroupCat.Completion
811811
import Mathlib.Analysis.Normed.Group.SemiNormedGroupCat.Kernels
812812
import Mathlib.Analysis.Normed.Group.Seminorm
813813
import Mathlib.Analysis.Normed.Group.Tannery
814+
import Mathlib.Analysis.Normed.Group.ZeroAtInfty
814815
import Mathlib.Analysis.Normed.MulAction
815816
import Mathlib.Analysis.Normed.Order.Basic
816817
import Mathlib.Analysis.Normed.Order.Lattice

Mathlib/Analysis/Distribution/SchwartzSpace.lean

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Mathlib.Analysis.Calculus.ContDiff.Bounds
99
import Mathlib.Analysis.Calculus.IteratedDeriv.Defs
1010
import Mathlib.Analysis.LocallyConvex.WithSeminorms
1111
import Mathlib.Topology.Algebra.UniformFilterBasis
12-
import Mathlib.Topology.ContinuousFunction.Bounded
12+
import Mathlib.Analysis.Normed.Group.ZeroAtInfty
1313
import Mathlib.Analysis.SpecialFunctions.Pow.Real
1414

1515
#align_import analysis.schwartz_space from "leanprover-community/mathlib"@"e137999b2c6f2be388f4cd3bbf8523de1910cd2b"
@@ -119,6 +119,9 @@ protected theorem continuous (f : 𝓢(E, F)) : Continuous f :=
119119
(f.smooth 0).continuous
120120
#align schwartz_map.continuous SchwartzMap.continuous
121121

122+
instance instContinuousMapClass : ContinuousMapClass 𝓢(E, F) E F where
123+
map_continuous := SchwartzMap.continuous
124+
122125
/-- Every Schwartz function is differentiable. -/
123126
protected theorem differentiable (f : 𝓢(E, F)) : Differentiable ℝ f :=
124127
(f.smooth 1).differentiable rfl.le
@@ -976,6 +979,11 @@ section BoundedContinuousFunction
976979

977980
open scoped BoundedContinuousFunction
978981

982+
instance instBoundedContinuousMapClass : BoundedContinuousMapClass 𝓢(E, F) E F :=
983+
{ instContinuousMapClass with
984+
map_bounded := fun f ↦ ⟨2 * (SchwartzMap.seminorm ℝ 0 0) f,
985+
(BoundedContinuousFunction.dist_le_two_norm' (norm_le_seminorm ℝ f))⟩ }
986+
979987
/-- Schwartz functions as bounded continuous functions -/
980988
def toBoundedContinuousFunction (f : 𝓢(E, F)) : E →ᵇ F :=
981989
BoundedContinuousFunction.ofNormedAddCommGroup f (SchwartzMap.continuous f)
@@ -1024,8 +1032,7 @@ def toBoundedContinuousFunctionCLM : 𝓢(E, F) →L[𝕜] E →ᵇ F :=
10241032
simp only [Seminorm.comp_apply, coe_normSeminorm, Finset.sup_singleton,
10251033
schwartzSeminormFamily_apply_zero, Seminorm.smul_apply, one_smul, ge_iff_le,
10261034
BoundedContinuousFunction.norm_le (map_nonneg _ _)]
1027-
intro x
1028-
exact norm_le_seminorm 𝕜 _ _ }
1035+
exact norm_le_seminorm 𝕜 _ }
10291036
#align schwartz_map.to_bounded_continuous_function_clm SchwartzMap.toBoundedContinuousFunctionCLM
10301037

10311038
@[simp]
@@ -1048,4 +1055,75 @@ theorem delta_apply (x₀ : E) (f : 𝓢(E, F)) : delta 𝕜 F x₀ f = f x₀ :
10481055

10491056
end BoundedContinuousFunction
10501057

1058+
section ZeroAtInfty
1059+
1060+
open scoped ZeroAtInfty
1061+
1062+
variable [ProperSpace E]
1063+
1064+
instance instZeroAtInftyContinuousMapClass : ZeroAtInftyContinuousMapClass 𝓢(E, F) E F :=
1065+
{ instContinuousMapClass with
1066+
zero_at_infty := by
1067+
intro f
1068+
apply zero_at_infty_of_norm_le
1069+
intro ε hε
1070+
use (SchwartzMap.seminorm ℝ 1 0) f / ε
1071+
intro x hx
1072+
rw [div_lt_iff hε] at hx
1073+
have hxpos : 0 < ‖x‖ := by
1074+
rw [norm_pos_iff']
1075+
intro hxzero
1076+
simp only [hxzero, norm_zero, zero_mul, ← not_le] at hx
1077+
exact hx (map_nonneg (SchwartzMap.seminorm ℝ 1 0) f)
1078+
have := norm_pow_mul_le_seminorm ℝ f 1 x
1079+
rw [pow_one, ← le_div_iff' hxpos] at this
1080+
apply lt_of_le_of_lt this
1081+
rwa [div_lt_iff' hxpos] }
1082+
1083+
/-- Schwartz functions as continuous functions vanishing at infinity. -/
1084+
def toZeroAtInfty (f : 𝓢(E, F)) : C₀(E, F) where
1085+
toFun := f
1086+
zero_at_infty' := zero_at_infty f
1087+
1088+
@[simp] theorem toZeroAtInfty_apply (f : 𝓢(E, F)) (x : E) : f.toZeroAtInfty x = f x :=
1089+
rfl
1090+
1091+
@[simp] theorem toZeroAtInfty_toBCF (f : 𝓢(E, F)) :
1092+
f.toZeroAtInfty.toBCF = f.toBoundedContinuousFunction := by
1093+
ext; rfl
1094+
1095+
variable (𝕜 E F)
1096+
variable [IsROrC 𝕜] [NormedSpace 𝕜 F] [SMulCommClass ℝ 𝕜 F]
1097+
1098+
/-- The inclusion map from Schwartz functions to continuous functions vanishing at infinity as a
1099+
linear map. -/
1100+
def toZeroAtInftyLM : 𝓢(E, F) →ₗ[𝕜] C₀(E, F) where
1101+
toFun f := f.toZeroAtInfty
1102+
map_add' f g := by ext; exact add_apply
1103+
map_smul' a f := by ext; exact smul_apply
1104+
1105+
@[simp] theorem toZeroAtInftyLM_apply (f : 𝓢(E, F)) (x : E) : toZeroAtInftyLM 𝕜 E F f x = f x :=
1106+
rfl
1107+
1108+
/-- The inclusion map from Schwartz functions to continuous functions vanishing at infinity as a
1109+
continuous linear map. -/
1110+
def toZeroAtInftyCLM : 𝓢(E, F) →L[𝕜] C₀(E, F) :=
1111+
{ toZeroAtInftyLM 𝕜 E F with
1112+
cont := by
1113+
change Continuous (toZeroAtInftyLM 𝕜 E F)
1114+
refine'
1115+
Seminorm.continuous_from_bounded (schwartz_withSeminorms 𝕜 E F)
1116+
(norm_withSeminorms 𝕜 (C₀(E, F))) _ fun _ => ⟨{0}, 1, fun f => _⟩
1117+
haveI : MulAction NNReal (Seminorm 𝕜 𝓢(E, F)) := Seminorm.instDistribMulAction.toMulAction
1118+
simp only [Seminorm.comp_apply, coe_normSeminorm, Finset.sup_singleton,
1119+
schwartzSeminormFamily_apply_zero, Seminorm.smul_apply, one_smul, ge_iff_le,
1120+
← ZeroAtInftyContinuousMap.norm_toBCF_eq_norm,
1121+
BoundedContinuousFunction.norm_le (map_nonneg _ _)]
1122+
exact norm_le_seminorm 𝕜 _ }
1123+
1124+
@[simp] theorem toZeroAtInftyCLM_apply (f : 𝓢(E, F)) (x : E) : toZeroAtInftyCLM 𝕜 E F f x = f x :=
1125+
rfl
1126+
1127+
end ZeroAtInfty
1128+
10511129
end SchwartzMap
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/-
2+
Copyright (c) 2024 Moritz Doll. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Moritz Doll
5+
-/
6+
7+
import Mathlib.Topology.ContinuousFunction.ZeroAtInfty
8+
9+
/-!
10+
# ZeroAtInftyContinuousMapClass in normed additive groups
11+
12+
In this file we give a characterization of the predicate `zero_at_infty` from
13+
`ZeroAtInftyContinuousMapClass`. A continuous map `f` is zero at infinity if and only if
14+
for every `ε > 0` there exists a `r : ℝ` such that for all `x : E` with `r < ‖x‖` it holds that
15+
`‖f x‖ < ε`.
16+
-/
17+
18+
open Topology Filter
19+
20+
variable {E F 𝓕 : Type*}
21+
variable [SeminormedAddGroup E] [SeminormedAddCommGroup F]
22+
variable [FunLike 𝓕 E F] [ZeroAtInftyContinuousMapClass 𝓕 E F]
23+
24+
theorem ZeroAtInftyContinuousMapClass.norm_le (f : 𝓕) (ε : ℝ) (hε : 0 < ε) :
25+
∃ (r : ℝ), ∀ (x : E) (_hx : r < ‖x‖), ‖f x‖ < ε := by
26+
have h := zero_at_infty f
27+
rw [tendsto_zero_iff_norm_tendsto_zero, tendsto_def] at h
28+
specialize h (Metric.ball 0 ε) (Metric.ball_mem_nhds 0 hε)
29+
rcases Metric.closedBall_compl_subset_of_mem_cocompact h 0 with ⟨r, hr⟩
30+
use r
31+
intro x hr'
32+
suffices x ∈ (fun x ↦ ‖f x‖) ⁻¹' Metric.ball 0 ε by aesop
33+
apply hr
34+
aesop
35+
36+
variable [ProperSpace E]
37+
38+
theorem zero_at_infty_of_norm_le (f : E → F)
39+
(h : ∀ (ε : ℝ) (_hε : 0 < ε), ∃ (r : ℝ), ∀ (x : E) (_hx : r < ‖x‖), ‖f x‖ < ε) :
40+
Tendsto f (cocompact E) (𝓝 0) := by
41+
rw [tendsto_zero_iff_norm_tendsto_zero]
42+
intro s hs
43+
rw [mem_map, Metric.mem_cocompact_iff_closedBall_compl_subset 0]
44+
rw [Metric.mem_nhds_iff] at hs
45+
rcases hs with ⟨ε, hε, hs⟩
46+
rcases h ε hε with ⟨r, hr⟩
47+
use r
48+
intro
49+
aesop

Mathlib/Topology/MetricSpace/Bounded.lean

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,31 @@ theorem cobounded_le_cocompact : cobounded α ≤ cocompact α :=
172172
#align comap_dist_right_at_top_le_cocompact Metric.cobounded_le_cocompactₓ
173173
#align comap_dist_left_at_top_le_cocompact Metric.cobounded_le_cocompactₓ
174174

175+
theorem isCobounded_iff_closedBall_compl_subset {s : Set α} (c : α) :
176+
IsCobounded s ↔ ∃ (r : ℝ), (Metric.closedBall c r)ᶜ ⊆ s := by
177+
rw [← isBounded_compl_iff, isBounded_iff_subset_closedBall c]
178+
apply exists_congr
179+
intro r
180+
rw [compl_subset_comm]
181+
182+
theorem _root_.Bornology.IsCobounded.closedBall_compl_subset {s : Set α} (hs : IsCobounded s)
183+
(c : α) : ∃ (r : ℝ), (Metric.closedBall c r)ᶜ ⊆ s :=
184+
(isCobounded_iff_closedBall_compl_subset c).mp hs
185+
186+
theorem closedBall_compl_subset_of_mem_cocompact {s : Set α} (hs : s ∈ cocompact α) (c : α) :
187+
∃ (r : ℝ), (Metric.closedBall c r)ᶜ ⊆ s :=
188+
IsCobounded.closedBall_compl_subset (cobounded_le_cocompact hs) c
189+
190+
theorem mem_cocompact_of_closedBall_compl_subset [ProperSpace α] (c : α)
191+
(h : ∃ r, (closedBall c r)ᶜ ⊆ s) : s ∈ cocompact α := by
192+
rcases h with ⟨r, h⟩
193+
rw [Filter.mem_cocompact]
194+
exact ⟨closedBall c r, isCompact_closedBall c r, h⟩
195+
196+
theorem mem_cocompact_iff_closedBall_compl_subset [ProperSpace α] (c : α) :
197+
s ∈ cocompact α ↔ ∃ r, (closedBall c r)ᶜ ⊆ s :=
198+
⟨(closedBall_compl_subset_of_mem_cocompact · _), mem_cocompact_of_closedBall_compl_subset _⟩
199+
175200
/-- Characterization of the boundedness of the range of a function -/
176201
theorem isBounded_range_iff {f : β → α} : IsBounded (range f) ↔ ∃ C, ∀ x y, dist (f x) (f y) ≤ C :=
177202
isBounded_iff.trans <| by simp only [forall_range_iff]

0 commit comments

Comments
 (0)