Skip to content

Commit 9e156ec

Browse files
committed
feat: equivalent characterisation of split continuous linear maps (#35057)
We add an equivalent characterisation of continuous linear maps with a continuous left inverse: `f` admits a continuous left inverse iff it is injective, has closed range and `range f` has a closed complement. This equivalence is used for extracting an explicit complement for immersions, hence transitively for proving that immersions are closed under composition. From the path towards immersions, submersions and embedded submanifolds.
1 parent b254bb3 commit 9e156ec

File tree

4 files changed

+151
-19
lines changed

4 files changed

+151
-19
lines changed

Mathlib/Algebra/Module/Submodule/Range.lean

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,24 @@ theorem comap_le_comap_iff {f : M →ₛₗ[τ₁₂] M₂} (hf : range f = ⊤)
206206
theorem comap_injective {f : M →ₛₗ[τ₁₂] M₂} (hf : range f = ⊤) : Injective (comap f) := fun _ _ h =>
207207
le_antisymm ((comap_le_comap_iff hf).1 (le_of_eq h)) ((comap_le_comap_iff hf).1 (ge_of_eq h))
208208

209-
-- TODO (?): generalize to semilinear maps with `f ∘ₗ g` bijective.
209+
-- TODO (?): generalize the next two lemmas to semilinear maps with `f ∘ₗ g` bijective.
210+
210211
theorem ker_eq_range_of_comp_eq_id {M P} [AddCommGroup M] [Module R M]
211212
[AddCommGroup P] [Module R P] {f : M →ₗ[R] P} {g : P →ₗ[R] M} (h : f ∘ₗ g = .id) :
212213
ker f = range (LinearMap.id - g ∘ₗ f) :=
213214
le_antisymm (fun x hx ↦ ⟨x, show x - g (f x) = x by rw [hx, map_zero, sub_zero]⟩) <|
214215
range_le_ker_iff.mpr <| by rw [comp_sub, comp_id, ← comp_assoc, h, id_comp, sub_self]
215216

217+
/-- If `f : E →ₗ[R] F` has a left inverse `g`, then `range f = ker (f ∘ g - id)`.
218+
219+
This is the dual version of `LinearMap.ker_eq_range_of_comp_eq_id`. -/
220+
lemma range_eq_ker_of_leftInverse {M P} [AddCommGroup M] [Module R M]
221+
[AddCommGroup P] [Module R P] {f : M →ₗ[R] P} {g : P →ₗ[R] M}
222+
(h : LeftInverse g f) : f.range = ker ((f.comp g) - LinearMap.id) :=
223+
-- If `y = f x ∈ range f`, we have `(f ∘ g) y = f (g (f x)) = f x = y` by hypothesis `h`.
224+
-- Conversely, f g z - z = 0 implies z = f (g z) ∈ range f.
225+
le_antisymm (by rintro y ⟨x, rfl⟩; simp [h x]) (fun x hx ↦ ⟨g x, by simpa [sub_eq_zero] using hx⟩)
226+
216227
end
217228

218229
end AddCommMonoid

Mathlib/Analysis/Normed/Module/ContinuousInverse.lean

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,7 @@ Authors: Michael Rothgang
55
-/
66
module
77

8-
public import Mathlib.Algebra.Order.BigOperators.Expect
9-
public import Mathlib.Algebra.Order.Field.Power
10-
public import Mathlib.Data.EReal.Inv
11-
public import Mathlib.Data.Real.Sqrt
12-
public import Mathlib.Logic.Equiv.PartialEquiv
13-
public import Mathlib.Tactic.ContinuousFunctionalCalculus
14-
public import Mathlib.Tactic.Positivity
8+
public import Mathlib.Analysis.Normed.Operator.Banach
159
public import Mathlib.Topology.Algebra.Module.FiniteDimension
1610

1711
/-! # Continuous linear maps with a continuous left/right inverse
@@ -23,6 +17,12 @@ linear equivalences, and a sufficient criterion in finite dimension: a surjectiv
2317
finite-dimensional space always admits a continuous right inverse; an injective linear map on a
2418
finite-dimensional space always admits a continuous left inverse.
2519
20+
We also prove an equivalent characterisation of admitting a continuous left inverse: `f` admits a
21+
continuous left inverse if and only if it is injective, has closed range and its range admits a
22+
closed complement. This characterisation is used to extract a complement from immersions, for use
23+
in the regular value theorem. (For submersions, there is a natural choice of complement, and an
24+
analogous statement is not necessary.)
25+
2626
This concept is used to give an equivalent definition of immersions and submersions of manifolds.
2727
2828
## Main definitions and results
@@ -31,6 +31,16 @@ This concept is used to give an equivalent definition of immersions and submersi
3131
which is a continuous linear map itself
3232
* `ContinuousLinearMap.HasRightInverse`: a continuous linear map admits a right inverse
3333
which is a continuous linear map itself
34+
35+
* `ContinuousLinearMap.HasLeftInverse.isClosed_range`: if `f` has a continuous left inverse,
36+
its range is closed
37+
* `ContinuousLinearMap.HasLeftInverse.closedComplemented_range`: if `f` has a continuous left
38+
inverse, its range admits a closed complement
39+
* `ContinuousLinearMap.HasLeftInverse.complement`: a choice of closed complement for `range f`
40+
* `ContinuousLinearMap.HasLeftInverse.of_injective_of_isClosed_range_of_closedComplement_range`:
41+
if `f` is injective and has closed range with a closed complement, it admits a continuous left
42+
inverse
43+
3444
* `ContinuousLinearEquiv.hasRightInverse` and `ContinuousLinearEquiv.hasRightInverse`:
3545
a continuous linear equivalence admits a continuous left (resp. right) inverse
3646
* `ContinuousLinearMap.HasLeftInverse.comp`, `ContinuousLinearMap.HasRightInverse.comp`:
@@ -56,8 +66,6 @@ This concept is used to give an equivalent definition of immersions and submersi
5666
* Suppose `E` and `F` are Banach and `f : E → F` is Fredholm.
5767
If `f` is surjective, it has a continuous right inverse.
5868
If `f` is injective, it has a continuout left inverse.
59-
* `f` has a continuous left inverse if and only if it is injective, has closed range,
60-
and its range admits a closed complement
6169
6270
-/
6371

@@ -185,6 +193,72 @@ lemma of_injective_of_finiteDimensional [CompleteSpace 𝕜] [FiniteDimensional
185193

186194
end NontriviallyNormedField
187195

196+
/-! An equivalent characterisation of maps with a continuous left inverse -/
197+
section Ring
198+
199+
-- The next lemmas assume we are working over a ring.
200+
variable {R E E' F F' G : Type*} [Ring R]
201+
[TopologicalSpace E] [AddCommGroup E] [Module R E]
202+
[TopologicalSpace F] [AddCommGroup F] [Module R F] {f : E →L[R] F}
203+
204+
/-- If `f` has a continuous left inverse, its range admits a closed complement. -/
205+
lemma closedComplemented_range (hf : f.HasLeftInverse) : Submodule.ClosedComplemented f.range := by
206+
-- Idea of proof: let g be a left inverse for f. Then ker g is a closed subspace of F,
207+
-- and a complement to range f.
208+
-- Mathlib's definition of closed complement takes a continuous projection to f.range instead
209+
-- of a complementary subspace: consider `f.comp g` instead, which is continuous as both maps are,
210+
-- and idempotent as a continuous left inverse.
211+
use (f.comp hf.leftInverse).codRestrict f.range (by intro y; simp)
212+
rintro ⟨y, x, rfl⟩
213+
ext
214+
simp only [coe_coe, coe_codRestrict_apply, coe_comp', Function.comp_apply]
215+
rw [hf.leftInverse_leftInverse]
216+
217+
section
218+
219+
variable [T1Space F]
220+
221+
lemma isClosed_range (hf : f.HasLeftInverse) [IsTopologicalAddGroup F] :
222+
IsClosed (range f) := by
223+
-- `range f = ker (f ∘ g - id)` is closed since `f ∘ g - id` is continuous.
224+
rw [← f.range_toLinearMap, ← f.coe_range,
225+
f.range_eq_ker_of_leftInverse (hf.leftInverse_leftInverse)]
226+
exact ((f.comp hf.leftInverse) - (ContinuousLinearMap.id R F)).isClosed_ker
227+
228+
/-- Choice of a closed complement of `range f` -/
229+
def complement (h : f.HasLeftInverse) : Submodule R F :=
230+
h.closedComplemented_range.complement
231+
232+
lemma isClosed_complement (h : f.HasLeftInverse) : IsClosed (X := F) h.complement :=
233+
h.closedComplemented_range.isClosed_complement
234+
235+
lemma isCompl_complement (h : f.HasLeftInverse) : IsCompl f.range h.complement :=
236+
h.closedComplemented_range.isCompl_complement
237+
238+
end
239+
240+
end Ring
241+
242+
section
243+
244+
variable {R E F : Type*} [NontriviallyNormedField R]
245+
[NormedAddCommGroup E] [NormedSpace R E] [CompleteSpace E]
246+
[NormedAddCommGroup F] [NormedSpace R F] [CompleteSpace F]
247+
248+
/-- A continuous linear map between Banach spaces has a continuous left inverse if it isjective,
249+
has closed range and its range has a closed complement. -/
250+
lemma of_injective_of_isClosed_range_of_closedComplement_range {f : E →L[R] F}
251+
(hf : Injective f) (hf' : IsClosed (range f)) (hf'' : Submodule.ClosedComplemented f.range) :
252+
f.HasLeftInverse := by
253+
have : (f.rangeRestrict).ker = ⊥ := by
254+
rw [ker_codRestrict]; exact LinearMap.ker_eq_bot.mpr hf
255+
-- We compose the continuous inverse of `f : E → range f` with the projection `p : F → range f`.
256+
obtain ⟨p, hp⟩ := hf''
257+
refine ⟨(f.leftInverse_of_injective_of_isClosed_range hf hf').comp p, fun x ↦ ?_⟩
258+
simpa [hp ⟨f x, by simp⟩] using f.rangeRestrict.leftInverse_apply_of_inj this x
259+
260+
end
261+
188262
end HasLeftInverse
189263

190264
namespace HasRightInverse
@@ -214,7 +288,7 @@ lemma _root_.ContinuousLinearEquiv.hasRightInverse (f : E ≃L[R] F) :
214288
ext y
215289
exact f.injective <| by simpa using f.hasRightInverse.rightInverse_rightInverse y
216290

217-
/-- An invertible continuous linear map splits. -/
291+
/-- An invertible continuous linear map has a continuous right inverse. -/
218292
lemma of_isInvertible (hf : IsInvertible f) : f.HasRightInverse := by
219293
obtain ⟨e, rfl⟩ := hf
220294
exact e.hasRightInverse

Mathlib/Analysis/Normed/Operator/Banach.lean

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,25 @@ variable {E F : Type*}
375375
[NormedAddCommGroup E] [NormedSpace 𝕜 E] [NormedAddCommGroup F] [NormedSpace 𝕜 F]
376376
[CompleteSpace E] [CompleteSpace F]
377377

378-
-- TODO: once mathlib has Fredholm operators, generalise the next two lemmas accordingly
378+
-- TODO: once mathlib has Fredholm operators, generalise the next four lemmas accordingly
379379

380380
/-- If `f : E →L[𝕜] F` is injective with closed range (and `E` and `F` are Banach spaces),
381381
`f` is anti-Lipschitz. -/
382382
lemma antilipschitz_of_injective_of_isClosed_range (f : E →L[𝕜] F)
383383
(hf : Injective f) (hf' : IsClosed (Set.range f)) : ∃ K, AntilipschitzWith K f :=
384384
⟨_, .comp (.subtype_coe (Set.range f)) (f.equivRange hf hf').antilipschitz⟩
385385

386+
/-- A choice of anti-Lipschitz constant for `f : E →L[𝕜] F` injective with closed range
387+
(assuming `E` and `F` are Banach spaces). -/
388+
noncomputable def antilipschitzConstant_of_injective_of_isClosed_range (f : E →L[𝕜] F)
389+
(hf : Injective f) (hf' : IsClosed (Set.range f)) : ℝ≥0 :=
390+
Classical.choose (f.antilipschitz_of_injective_of_isClosed_range hf hf')
391+
392+
lemma antilipschitz_antiLipschitzConstant_of_injective_of_isClosed_range (f : E →L[𝕜] F)
393+
(hf : Injective f) (hf' : IsClosed (Set.range f)) :
394+
AntilipschitzWith (f.antilipschitzConstant_of_injective_of_isClosed_range hf hf') f :=
395+
Classical.choose_spec (f.antilipschitz_of_injective_of_isClosed_range hf hf')
396+
386397
/-- An injective bounded linear operator between Banach spaces has closed range
387398
iff it is anti-Lipschitz. -/
388399
lemma isClosed_range_iff_antilipschitz_of_injective (f : E →L[𝕜] F)
@@ -391,6 +402,23 @@ lemma isClosed_range_iff_antilipschitz_of_injective (f : E →L[𝕜] F)
391402
choose K hf' using h
392403
exact hf'.isClosed_range f.uniformContinuous
393404

405+
/-- A choice of continuous left inverse of an injective continuous linear map with closed range:
406+
this is `LinearMap.leftInverse` as a continuous linear map;
407+
by injectivity, the junk value of `leftInverse` never matters, and continuity of the inverse
408+
follows form the closed range condition. -/
409+
noncomputable def leftInverse_of_injective_of_isClosed_range
410+
(f : E →L[𝕜] F) (hf : Injective f) (hf' : IsClosed (range f)) : f.range →L[𝕜] E :=
411+
letI K := f.antilipschitzConstant_of_injective_of_isClosed_range hf hf'
412+
letI hfK := f.antilipschitz_antiLipschitzConstant_of_injective_of_isClosed_range hf hf'
413+
LinearMap.mkContinuous f.rangeRestrict.leftInverse K (by
414+
rintro ⟨y, x, rfl⟩
415+
have aux := hfK.le_mul_dist x 0
416+
simp only [dist_zero_right, map_zero] at aux
417+
convert aux
418+
exact f.rangeRestrict.leftInverse_apply_of_inj
419+
(by rw [ker_codRestrict]; exact LinearMap.ker_eq_bot.mpr hf) x
420+
)
421+
394422
end
395423

396424
end ContinuousLinearMap

Mathlib/Topology/Algebra/Module/LinearMap.lean

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ initialize_simps_projections ContinuousLinearMap (toFun → apply, toLinearMap
155155
theorem ext {f g : M₁ →SL[σ₁₂] M₂} (h : ∀ x, f x = g x) : f = g :=
156156
DFunLike.ext f g h
157157

158+
@[simp, norm_cast]
159+
theorem coe_coe (f : M₁ →SL[σ₁₂] M₂) : ⇑(f : M₁ →ₛₗ[σ₁₂] M₂) = f :=
160+
rfl
161+
158162
/-- Copy of a `ContinuousLinearMap` with a new `toFun` equal to the old one. Useful to fix
159163
definitional equalities. -/
160164
protected def copy (f : M₁ →SL[σ₁₂] M₂) (f' : M₁ → M₂) (h : f' = ⇑f) : M₁ →SL[σ₁₂] M₂ where
@@ -178,6 +182,8 @@ theorem range_coeFn_eq :
178182
· rintro ⟨hfc, f, rfl⟩
179183
exact ⟨⟨f, hfc⟩, rfl⟩
180184

185+
lemma range_toLinearMap (f : M₁ →SL[σ₁₂] M₂) : Set.range f.toLinearMap = Set.range f := by simp
186+
181187
-- make some straightforward lemmas available to `simp`.
182188
protected theorem map_zero (f : M₁ →SL[σ₁₂] M₂) : f (0 : M₁) = 0 :=
183189
map_zero f
@@ -198,10 +204,6 @@ theorem map_smul_of_tower {R S : Type*} [Semiring S] [SMul R M₁] [Module S M
198204
f (c • x) = c • f x :=
199205
LinearMap.CompatibleSMul.map_smul (f : M₁ →ₗ[S] M₂) c x
200206

201-
@[simp, norm_cast]
202-
theorem coe_coe (f : M₁ →SL[σ₁₂] M₂) : ⇑(f : M₁ →ₛₗ[σ₁₂] M₂) = f :=
203-
rfl
204-
205207
@[ext]
206208
theorem ext_ring [TopologicalSpace R₁] {f g : R₁ →L[R₁] M₁} (h : f 1 = g 1) : f = g :=
207209
coe_inj.1 <| LinearMap.ext_ring h
@@ -1181,18 +1183,35 @@ open ContinuousLinearMap
11811183
def ClosedComplemented (p : Submodule R M) : Prop :=
11821184
∃ f : M →L[R] p, ∀ x : p, f x = x
11831185

1184-
theorem ClosedComplemented.exists_isClosed_isCompl {p : Submodule R M} [T1Space p]
1185-
(h : ClosedComplemented p) :
1186+
variable {p : Submodule R M}
1187+
1188+
namespace ClosedComplemented
1189+
1190+
variable [T1Space p]
1191+
1192+
theorem exists_isClosed_isCompl (h : ClosedComplemented p) :
11861193
∃ q : Submodule R M, IsClosed (q : Set M) ∧ IsCompl p q :=
11871194
Exists.elim h fun f hf => ⟨ker f, isClosed_ker f, LinearMap.isCompl_of_proj hf⟩
11881195

1189-
protected theorem ClosedComplemented.isClosed [IsTopologicalAddGroup M] [T1Space M]
1196+
/-- An arbitrary choice of closed complement of a closed complemented submodule. -/
1197+
noncomputable def complement (h : ClosedComplemented p) : Submodule R M :=
1198+
Classical.choose h.exists_isClosed_isCompl
1199+
1200+
theorem isClosed_complement (h : ClosedComplemented p) : IsClosed (h.complement : Set M) :=
1201+
Classical.choose_spec (h.exists_isClosed_isCompl) |>.1
1202+
1203+
theorem isCompl_complement (h : ClosedComplemented p) : IsCompl p h.complement :=
1204+
Classical.choose_spec (h.exists_isClosed_isCompl) |>.2
1205+
1206+
protected theorem isClosed [IsTopologicalAddGroup M] [T1Space M]
11901207
{p : Submodule R M} (h : ClosedComplemented p) : IsClosed (p : Set M) := by
11911208
rcases h with ⟨f, hf⟩
11921209
have : (ContinuousLinearMap.id R M - p.subtypeL.comp f).ker = p :=
11931210
LinearMap.ker_id_sub_eq_of_proj hf
11941211
exact this ▸ isClosed_ker _
11951212

1213+
end ClosedComplemented
1214+
11961215
@[simp]
11971216
theorem closedComplemented_bot : ClosedComplemented (⊥ : Submodule R M) :=
11981217
0, fun x => by simp only [zero_apply, eq_zero_of_bot_submodule x]⟩

0 commit comments

Comments
 (0)