Skip to content

Commit 125d0a3

Browse files
committed
feat: continuous linear maps with a continuous left/right inverseContinuousinverse (#34991)
Define continuous linear maps which admit a continuous left resp. right inverse, prove their basic properties (closure under products, composition and continuous linear equivalences admitting both inverses) and a sufficient condition in finite dimension. A future PRs will add an equivalent characterisation of maps with a continuous left inverse, and use this to prove that the composition of immersions (resp. submersions) is an immersion (resp. submersion). Part of the path towards immersions, submersions, embedded submanifolds and the regular value theorem.
1 parent 5c6d055 commit 125d0a3

File tree

2 files changed

+284
-0
lines changed

2 files changed

+284
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,7 @@ public import Mathlib.Analysis.Normed.Module.Basic
20122012
public import Mathlib.Analysis.Normed.Module.Complemented
20132013
public import Mathlib.Analysis.Normed.Module.Completion
20142014
public import Mathlib.Analysis.Normed.Module.Connected
2015+
public import Mathlib.Analysis.Normed.Module.ContinuousInverse
20152016
public import Mathlib.Analysis.Normed.Module.Convex
20162017
public import Mathlib.Analysis.Normed.Module.Dual
20172018
public import Mathlib.Analysis.Normed.Module.ENormedSpace
Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
/-
2+
Copyright (c) 2026 Michael Rothgang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Michael Rothgang
5+
-/
6+
module
7+
8+
public import Mathlib.Analysis.Normed.Module.Complemented
9+
public import Mathlib.Analysis.Normed.Module.HahnBanach
10+
11+
/-! # Continuous linear maps with a continuous left/right inverse
12+
13+
This file defines continuous linear maps which admit a continuous left/right inverse.
14+
15+
We prove that both of these classes of maps are closed under products, composition and contain
16+
linear equivalences, and a sufficient criterion in finite dimension: a surjective linear map on a
17+
finite-dimensional space always admits a continuous right inverse; an injective linear map on a
18+
finite-dimensional space always admits a continuous left inverse.
19+
20+
This concept is used to give an equivalent definition of immersions and submersions of manifolds.
21+
22+
## Main definitions and results
23+
24+
* `ContinuousLinearMap.HasRightInverse`: a continuous linear map admits a left inverse
25+
which is a continuous linear map itself
26+
* `ContinuousLinearMap.HasRightInverse`: a continuous linear map admits a right inverse
27+
which is a continuous linear map itself
28+
* `ContinuousLinearEquiv.hasRightInverse` and `ContinuousLinearEquiv.hasRightInverse`:
29+
a continuous linear equivalence admits a continuous left (resp. right) inverse
30+
* `ContinuousLinearMap.HasLeftInverse.comp`, `ContinuousLinearMap.HasRightInverse.comp`:
31+
if `f : E → F` and `g : F → G` both admit a continuous left (resp. right) inverse,
32+
so does `g.comp f`.
33+
* `ContinuousLinearMap.HasLefttInverse.of_comp`, `ContinuousLinearMap.HasRightInverse.of_comp`:
34+
suppose `f : E → F` and `g : F → G` are continuous linear maps.
35+
If `g.comp f : E → G` admits a continuous left inverse, then so does `f`.
36+
If `g.comp f : E → G` admits a continuous right inverse, then so does `g`.
37+
* `ContinuousLinearMap.HasLeftInverse.prodMap`, `ContinuousLinearMap.HasRightInverse.prodMap`:
38+
having a continuous right inverse is closed under taking products
39+
* `ContinuousLinearMap.HasLeftInverse.inl`, `ContinuousLinearMap.HasLeftInverse.inr`:
40+
`ContinuousLinearMap.inl` and `.inr` have a continuous left inverse
41+
* `ContinuousLinearMap.HasRightInverse.fst`, `ContinuousLinearMap.HasRightInverse.snd`:
42+
`ContinuousLinearMap.fst` and `.snd` hav a continuous right inverse
43+
* `ContinuousLinearMap.HasLeftInverse.of_injective_of_finiteDimensional`:
44+
if `f : E → F` is injective and `F` is finite-dimensional, `f` has a continuous left inverse.
45+
* `ContinuousLinearMap.HasRightInverse.of_surjective_of_finiteDimensional`:
46+
if `f : E → F` is surjective and `F` is finite-dimensional, `f` has a continuous right inverse.
47+
48+
## TODO
49+
50+
* Suppose `E` and `F` are Banach and `f : E → F` is Fredholm.
51+
If `f` is surjective, it has a continuous right inverse.
52+
If `f` is injective, it has a continuout left inverse.
53+
* `f` has a continuous left inverse if and only if it is injective, has closed range,
54+
and its range admits a closed complement
55+
56+
-/
57+
58+
public section
59+
60+
open Function Set
61+
62+
variable {R : Type*} [Semiring R] {E E' F F' G : Type*}
63+
[TopologicalSpace E] [AddCommMonoid E] [Module R E]
64+
[TopologicalSpace E'] [AddCommMonoid E'] [Module R E']
65+
[TopologicalSpace F] [AddCommMonoid F] [Module R F]
66+
[TopologicalSpace F'] [AddCommMonoid F'] [Module R F']
67+
68+
noncomputable section
69+
70+
/-- A continuous linear map admits a left inverse which is a continuous linear map itself. -/
71+
@[expose] protected def ContinuousLinearMap.HasLeftInverse (f : E →L[R] F) : Prop :=
72+
∃ g : F →L[R] E, LeftInverse g f
73+
74+
/-- A continuous linear map admits a right inverse which is a continuous linear map itself. -/
75+
@[expose] protected def ContinuousLinearMap.HasRightInverse (f : E →L[R] F) : Prop :=
76+
∃ g : F →L[R] E, RightInverse g f
77+
78+
namespace ContinuousLinearMap
79+
80+
namespace HasLeftInverse
81+
82+
variable {f : E →L[R] F}
83+
84+
/-- Choice of continuous left inverse for `f : F →L[R] E`, given that such an inverse exists. -/
85+
def leftInverse (h : f.HasLeftInverse) : F →L[R] E := Classical.choose h
86+
87+
lemma leftInverse_leftInverse (h : f.HasLeftInverse) : LeftInverse h.leftInverse f :=
88+
Classical.choose_spec h
89+
90+
lemma injective (h : f.HasLeftInverse) : Injective f :=
91+
h.leftInverse_leftInverse.injective
92+
93+
example (h : f.HasLeftInverse) (x : E) : h.leftInverse (f x) = x :=
94+
h.leftInverse_leftInverse x
95+
96+
lemma congr {g : E →L[R] F} (hf : f.HasLeftInverse) (hfg : g = f) :
97+
g.HasLeftInverse :=
98+
hfg ▸ hf
99+
100+
/-- A continuous linear equivalence has a continuous left inverse. -/
101+
lemma _root_.ContinuousLinearEquiv.hasLeftInverse (f : E ≃L[R] F) :
102+
f.toContinuousLinearMap.HasLeftInverse :=
103+
⟨f.symm, rightInverse_of_comp (by simp)⟩
104+
105+
@[simp] lemma _root_.ContinuousLinearEquiv.leftInverse_hasLeftInverse (f : E ≃L[R] F) :
106+
f.hasLeftInverse.leftInverse = f.symm := by
107+
ext y
108+
calc f.hasLeftInverse.leftInverse y
109+
_ = f.hasLeftInverse.leftInverse (f (f.symm y)) := by simp
110+
_ = f.symm y := f.hasLeftInverse.leftInverse_leftInverse (f.symm y)
111+
112+
/-- An invertible continuous linear map has a continuous left inverse. -/
113+
lemma of_isInvertible (hf : IsInvertible f) : f.HasLeftInverse := by
114+
obtain ⟨e, rfl⟩ := hf
115+
exact e.hasLeftInverse
116+
117+
/-- If `f` and `g` admit continuous left inverses, so does `f × g`. -/
118+
lemma prodMap {g : E' →L[R] F'} (hf : f.HasLeftInverse) (hg : g.HasLeftInverse) :
119+
(f.prodMap g).HasLeftInverse := by
120+
obtain ⟨finv, hfinv⟩ := hf
121+
obtain ⟨ginv, hginv⟩ := hg
122+
use finv.prodMap ginv
123+
simp [hfinv, hginv]
124+
125+
variable [TopologicalSpace G] [AddCommMonoid G] [Module R G]
126+
127+
lemma comp {g : F →L[R] G} (hg : g.HasLeftInverse) (hf : f.HasLeftInverse) :
128+
(g.comp f).HasLeftInverse := by
129+
obtain ⟨finv, hfinv⟩ := hf
130+
obtain ⟨ginv, hginv⟩ := hg
131+
refine ⟨finv.comp ginv, fun x ↦ ?_⟩
132+
simp only [coe_comp', Function.comp_apply]
133+
rw [hginv, hfinv]
134+
135+
lemma of_comp {g : F →L[R] G} (hfg : (g.comp f).HasLeftInverse) :
136+
f.HasLeftInverse := by
137+
obtain ⟨fginv, hfginv⟩ := hfg
138+
refine ⟨fginv.comp g, fun y ↦ ?_⟩
139+
simp only [coe_comp', Function.comp_apply]
140+
exact hfginv y
141+
142+
lemma comp_continuousLinearEquivalence {f₀ : F' ≃L[R] E} (hf : f.HasLeftInverse) :
143+
(f.comp f₀.toContinuousLinearMap).HasLeftInverse :=
144+
hf.comp f₀.hasLeftInverse
145+
146+
lemma continuousLinearEquivalence_comp {g : F ≃L[R] F'} (hf : f.HasLeftInverse) :
147+
(g.toContinuousLinearMap.comp f).HasLeftInverse :=
148+
g.hasLeftInverse.comp hf
149+
150+
/-- `ContinuousLinearMap.inl` has a continuous left inverse. -/
151+
protected lemma inl : (ContinuousLinearMap.inl R F G).HasLeftInverse := by
152+
use ContinuousLinearMap.fst _ _ _
153+
intro x
154+
simp
155+
156+
/-- `ContinuousLinearMap.inr` has a continuous left inverse. -/
157+
protected lemma inr : (ContinuousLinearMap.inr R F G).HasLeftInverse := by
158+
use ContinuousLinearMap.snd _ _ _
159+
intro x
160+
simp
161+
162+
section NontriviallyNormedField
163+
164+
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E F : Type*}
165+
[TopologicalSpace E] [AddCommGroup E] [Module 𝕜 E] [IsTopologicalAddGroup E] [ContinuousSMul 𝕜 E]
166+
[TopologicalSpace F] [AddCommGroup F] [Module 𝕜 F] [IsTopologicalAddGroup F] [ContinuousSMul 𝕜 F]
167+
[T2Space F] {f : E →L[𝕜] F}
168+
169+
/-- If `f : E → F` is injective and `E` is finite-dimensional,
170+
`f` has a continuous left inverse. -/
171+
lemma of_injective_of_finiteDimensional [CompleteSpace 𝕜] [FiniteDimensional 𝕜 F]
172+
(hf : Injective f) :
173+
f.HasLeftInverse := by
174+
-- An injective linear map has a linear inverse; this inverse is automatically continuous
175+
-- because its domain is finite-dimensional.
176+
obtain ⟨g, hg⟩ :=
177+
f.toLinearMap.exists_leftInverse_of_injective (f.ker_eq_bot_of_injective hf)
178+
exact ⟨⟨g, LinearMap.continuous_of_finiteDimensional _⟩, fun x ↦ congr($hg x)⟩
179+
180+
end NontriviallyNormedField
181+
182+
end HasLeftInverse
183+
184+
namespace HasRightInverse
185+
186+
variable {f : E →L[R] F}
187+
188+
/-- Choice of continuous right inverse for `f : F →L[R] E`, given that such an inverse exists. -/
189+
def rightInverse (h : f.HasRightInverse) : F →L[R] E := Classical.choose h
190+
191+
lemma rightInverse_rightInverse (h : f.HasRightInverse) : RightInverse h.rightInverse f :=
192+
Classical.choose_spec h
193+
194+
lemma surjective (h : f.HasRightInverse) : Surjective f :=
195+
h.rightInverse_rightInverse.surjective
196+
197+
lemma congr {g : E →L[R] F} (hf : f.HasRightInverse) (hfg : g = f) :
198+
g.HasRightInverse :=
199+
hfg ▸ hf
200+
201+
/-- A continuous linear equivalence has a continuous right inverse. -/
202+
lemma _root_.ContinuousLinearEquiv.hasRightInverse (f : E ≃L[R] F) :
203+
f.toContinuousLinearMap.HasRightInverse :=
204+
⟨f.symm, rightInverse_of_comp (by simp)⟩
205+
206+
@[simp] lemma _root_.ContinuousLinearEquiv.rightInverse_hasRightInverse (f : E ≃L[R] F) :
207+
f.hasRightInverse.rightInverse = f.symm := by
208+
ext y
209+
exact f.injective <| by simpa using f.hasRightInverse.rightInverse_rightInverse y
210+
211+
/-- An invertible continuous linear map splits. -/
212+
lemma of_isInvertible (hf : IsInvertible f) : f.HasRightInverse := by
213+
obtain ⟨e, rfl⟩ := hf
214+
exact e.hasRightInverse
215+
216+
/-- If `f` and `g` split, then so does `f × g`. -/
217+
lemma prodMap {g : E' →L[R] F'} (hf : f.HasRightInverse) (hg : g.HasRightInverse) :
218+
(f.prodMap g).HasRightInverse := by
219+
obtain ⟨finv, hfinv⟩ := hf
220+
obtain ⟨ginv, hginv⟩ := hg
221+
use finv.prodMap ginv
222+
simp [hfinv, hginv]
223+
224+
variable [TopologicalSpace G] [AddCommMonoid G] [Module R G]
225+
226+
lemma comp {g : F →L[R] G} (hg : g.HasRightInverse) (hf : f.HasRightInverse) :
227+
(g.comp f).HasRightInverse := by
228+
obtain ⟨finv, hfinv⟩ := hf
229+
obtain ⟨ginv, hginv⟩ := hg
230+
refine ⟨finv.comp ginv, fun x ↦ ?_⟩
231+
simp only [coe_comp', Function.comp_apply]
232+
rw [hfinv, hginv]
233+
234+
lemma of_comp {g : F →L[R] G} (hfg : (g.comp f).HasRightInverse) :
235+
g.HasRightInverse := by
236+
obtain ⟨fginv, hfginv⟩ := hfg
237+
exact ⟨f.comp fginv, fun y ↦ by simpa using hfginv y⟩
238+
239+
lemma comp_continuousLinearEquivalence {f₀ : F' ≃L[R] E} (hf : f.HasRightInverse) :
240+
(f.comp f₀.toContinuousLinearMap).HasRightInverse :=
241+
hf.comp f₀.hasRightInverse
242+
243+
lemma continuousLinearEquivalence_comp {g : F ≃L[R] F'} (hf : f.HasRightInverse) :
244+
(g.toContinuousLinearMap.comp f).HasRightInverse :=
245+
g.hasRightInverse.comp hf
246+
247+
/-- `ContinuousLinearMap.fst` has a continuous right inverse. -/
248+
protected lemma fst : (ContinuousLinearMap.fst R F G).HasRightInverse := by
249+
use (ContinuousLinearMap.id _ _).prod 0
250+
intro x
251+
simp
252+
253+
/-- `ContinuousLinearMap.snd` has a continuous right inverse. -/
254+
protected lemma snd : (ContinuousLinearMap.snd R F G).HasRightInverse := by
255+
use ContinuousLinearMap.prod 0 (.id R G)
256+
intro x
257+
simp
258+
259+
section NontriviallyNormedField
260+
261+
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E F : Type*}
262+
[TopologicalSpace E] [AddCommGroup E] [Module 𝕜 E] [IsTopologicalAddGroup E] [ContinuousSMul 𝕜 E]
263+
[TopologicalSpace F] [AddCommGroup F] [Module 𝕜 F] [IsTopologicalAddGroup F] [ContinuousSMul 𝕜 F]
264+
[T2Space F] {f : E →L[𝕜] F}
265+
266+
/-- If `f : E → F` is surjective and `F` is finite-dimensional,
267+
`f` has a continuous right inverse. -/
268+
lemma of_surjective_of_finiteDimensional [CompleteSpace 𝕜] [FiniteDimensional 𝕜 F]
269+
(hf : Surjective f) :
270+
f.HasRightInverse := by
271+
-- A surjective linear map has a linear inverse, which is automatically continuous
272+
-- because its domain is finite-dimensional.
273+
obtain ⟨g, hg⟩ :=
274+
f.toLinearMap.exists_rightInverse_of_surjective (f.range_eq_top_of_surjective hf)
275+
exact ⟨⟨g, g.continuous_of_finiteDimensional⟩, fun x ↦ congr($hg x)⟩
276+
277+
end NontriviallyNormedField
278+
279+
end HasRightInverse
280+
281+
end ContinuousLinearMap
282+
283+
end

0 commit comments

Comments
 (0)