Skip to content

Commit da121d2

Browse files
committed
feat(Topology/Algebra/Module/Complement): bundle prodEquivOfIsCompl and quotientEquivOfIsCompl, add ContinuousLinearMap.ofIsTopCompl (#39260)
This PR completes the three TODO items listed at the top of `Mathlib/Topology/Algebra/Module/Complement.lean` (introduced in #38547). `Submodule.prodEquivOfIsCompl` is shown to be a homeomorphism if and only if the two submodules are topological complements. The analogous characterisation for `Submodule.quotientEquivOfIsCompl` is also provided, and `ContinuousLinearMap.ofIsTopCompl` is defined as the continuous version of `LinearMap.ofIsCompl`, taking continuous linear maps from complementary submodules and producing the induced continuous linear map on the whole space.
1 parent 7a118c1 commit da121d2

2 files changed

Lines changed: 160 additions & 20 deletions

File tree

Mathlib/LinearAlgebra/Projection.lean

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,11 @@ def ofIsCompl {p q : Submodule R E} (h : IsCompl p q) (φ : p →ₗ[R] F) (ψ :
360360
variable {p q}
361361

362362
@[simp]
363-
theorem ofIsCompl_left_apply (h : IsCompl p q) {φ : p →ₗ[R] F} {ψ : q →ₗ[R] F} (u : p) :
363+
theorem ofIsCompl_apply_left (h : IsCompl p q) {φ : p →ₗ[R] F} {ψ : q →ₗ[R] F} (u : p) :
364364
ofIsCompl h φ ψ (u : E) = φ u := by simp [ofIsCompl]
365365

366366
@[simp]
367-
theorem ofIsCompl_right_apply (h : IsCompl p q) {φ : p →ₗ[R] F} {ψ : q →ₗ[R] F} (v : q) :
367+
theorem ofIsCompl_apply_right (h : IsCompl p q) {φ : p →ₗ[R] F} {ψ : q →ₗ[R] F} (v : q) :
368368
ofIsCompl h φ ψ (v : E) = ψ v := by simp [ofIsCompl]
369369

370370
theorem ofIsCompl_eq (h : IsCompl p q) {φ : p →ₗ[R] F} {ψ : q →ₗ[R] F} {χ : E →ₗ[R] F}
@@ -448,8 +448,8 @@ def ofIsComplProdEquiv {p q : Submodule R₁ E} (h : IsCompl p q) :
448448
invFun := fun φ => ⟨φ.domRestrict p, φ.domRestrict q⟩
449449
left_inv := fun φ ↦ by
450450
ext x
451-
· exact ofIsCompl_left_apply h x
452-
· exact ofIsCompl_right_apply h x
451+
· exact ofIsCompl_apply_left h x
452+
· exact ofIsCompl_apply_right h x
453453
right_inv := fun φ ↦ by
454454
ext x
455455
obtain ⟨a, b, hab, _⟩ := existsUnique_add_of_isCompl h x
@@ -829,5 +829,7 @@ namespace LinearMap
829829
surjective_comp_projectionOnto
830830
@[deprecated (since := "2026-05-04")] alias isIdempotentElem_iff_eq_isCompl_projection_range_ker :=
831831
isIdempotentElem_iff_eq_projection_range_ker
832+
@[deprecated (since := "2026-05-16")] alias ofIsCompl_left_apply := ofIsCompl_apply_left
833+
@[deprecated (since := "2026-05-16")] alias ofIsCompl_right_apply := ofIsCompl_apply_right
832834

833835
end LinearMap

Mathlib/Topology/Algebra/Module/Complement.lean

Lines changed: 154 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2026 Anatole Dedecker. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Anatole Dedecker
4+
Authors: Anatole Dedecker, Sharvil Kesarwani
55
-/
66
module
77

@@ -29,14 +29,20 @@ change to something less misleading.
2929
to the definition given above.
3030
* `Submodule.ClosedComplemented`: we say that a submodule is (topologically) *complemented* if
3131
there exists a continuous projection `M →ₗ[R] p`.
32-
* `Submodule.IsTopCompl.projectionOnto`: if `h : IsTopCompl p q`, `h.projectionOnto` is the
32+
* `Submodule.projectionOntoL`: if `h : IsTopCompl p q`, `p.projectionOntoL q h` is the
3333
continuous linear projection `M →L[R] p` along `q`. This is the continuous version of
34-
`Submodule.linearProjOfIsCompl`.
35-
* `Submodule.IsTopCompl.projection`: if `h : IsTopCompl p q`, `h.projection` is the continuous
34+
`Submodule.projectionOnto`.
35+
* `Submodule.projectionL`: if `h : IsTopCompl p q`, `p.projectionL q h` is the continuous
3636
linear projection `M →L[R] M` onto `p` along `q`. This is the continuous version of
3737
`Submodule.IsCompl.projection`.
3838
* `Submodule.ClosedComplemented.complement`: an arbitrary topological complement of a topologically
3939
complemented submodule.
40+
* `Submodule.prodEquivOfIsTopCompl`: the bundled continuous linear equivalence `p × q ≃L[R] M`
41+
arising from a topological complement pair.
42+
* `Submodule.quotientEquivOfIsTopCompl`: the bundled continuous linear equivalence `M ⧸ p ≃L[R] q`
43+
arising from a topological complement pair.
44+
* `ContinuousLinearMap.ofIsTopCompl`: the continuous linear map induced by maps on a topological
45+
complement pair.
4046
4147
## Main statements
4248
@@ -55,18 +61,6 @@ Because the condition is symmetric, a lot of lemmas could have a left and a righ
5561
In general we only include the left version, the right one being accessible through
5662
`Submodule.IsTopCompl.symm`.
5763
58-
## TODO
59-
60-
There is still a significant part of the algebraic API which should be ported to the
61-
topological setting. Notably, we should:
62-
* show that `Submodule.prodEquivOfIsCompl` is a homeomorphism if and only if
63-
the two subspaces are topological complements, and bundle it as a `ContinuousLinearEquiv` when
64-
this is the case. (See the existing `ClosedComplemented.exists_submodule_equiv_prod`).
65-
* show that `Submodule.quotientEquivOfIsCompl` is a homeomorphism if and only if
66-
the two subspaces are topological complements, and bundle it as a `ContinuousLinearEquiv` when
67-
this is the case.
68-
* define `ContinuousLinearMap.ofIsTopCompl`, analogous to `LinearMap.ofIsCompl`.
69-
7064
-/
7165

7266
@[expose] public section
@@ -121,6 +115,9 @@ protected theorem IsTopCompl.symm [ContinuousSub M] (h : IsTopCompl p q) : IsTop
121115
rw [projection_eq_id_sub_projection h.isCompl]
122116
exact continuous_id.sub h.continuous_projection
123117

118+
theorem isTopCompl_comm [ContinuousSub M] : IsTopCompl p q ↔ IsTopCompl q p :=
119+
⟨IsTopCompl.symm, IsTopCompl.symm⟩
120+
124121
open LinearMap in
125122
theorem _root_.ContinuousLinearMap.IsIdempotentElem.isTopCompl {f : M →L[R] M}
126123
(hf : IsIdempotentElem f) : IsTopCompl f.range f.ker where
@@ -399,4 +396,145 @@ lemma ClosedComplemented.exists_submodule_equiv_prod [IsTopologicalAddGroup M]
399396

400397
end ClosedComplemented
401398

399+
section ContinuousLinearEquiv
400+
401+
variable [IsTopologicalAddGroup M]
402+
403+
/-- Two complementary submodules are topological complements if and only if the linear equivalence
404+
`Submodule.prodEquivOfIsCompl` is continuous in the inverse direction. -/
405+
theorem IsCompl.isTopCompl_iff_continuous_symm_prodEquivOfIsCompl (h : IsCompl p q) :
406+
IsTopCompl p q ↔ Continuous (p.prodEquivOfIsCompl q h).symm :=
407+
fun hTop ↦ ((p.projectionOntoL q hTop).prod (q.projectionOntoL p hTop.symm)).continuous.congr
408+
fun x ↦ (prodEquivOfIsCompl_symm_apply h x).symm,
409+
fun hCont ↦ ⟨h, continuous_subtype_val.comp <| continuous_fst.comp hCont⟩⟩
410+
411+
/-- The linear equivalence `Submodule.prodEquivOfIsCompl` from a pair of complementary submodules is
412+
always continuous. -/
413+
theorem continuous_prodEquivOfIsCompl (h : IsCompl p q) : Continuous (p.prodEquivOfIsCompl q h) :=
414+
(continuous_subtype_val.comp continuous_fst).add (continuous_subtype_val.comp continuous_snd)
415+
416+
/-- Two complementary submodules are topological complements if and only if the linear equivalence
417+
`Submodule.prodEquivOfIsCompl` is a homeomorphism. -/
418+
theorem IsCompl.isTopCompl_iff_isHomeomorph_prodEquivOfIsCompl (h : IsCompl p q) :
419+
IsTopCompl p q ↔ IsHomeomorph (p.prodEquivOfIsCompl q h) := by
420+
rw [(p.prodEquivOfIsCompl q h).isHomeomorph_iff,
421+
isTopCompl_iff_continuous_symm_prodEquivOfIsCompl, and_iff_right]
422+
exact continuous_prodEquivOfIsCompl h
423+
424+
variable (p q) in
425+
/-- If two submodules are topological complements, then the linear equivalence
426+
`Submodule.prodEquivOfIsCompl` is a homeomorphism, bundled as a continuous linear equivalence. -/
427+
noncomputable def prodEquivOfIsTopCompl (h : IsTopCompl p q) : (p × q) ≃L[R] M :=
428+
{ p.prodEquivOfIsCompl q h.isCompl with
429+
continuous_toFun := continuous_prodEquivOfIsCompl h.isCompl
430+
continuous_invFun := h.isCompl.isTopCompl_iff_continuous_symm_prodEquivOfIsCompl.mp h }
431+
432+
@[simp]
433+
theorem toLinearEquiv_prodEquivOfIsTopCompl (h : IsTopCompl p q) :
434+
(prodEquivOfIsTopCompl p q h : (p × q) ≃ₗ[R] M) = p.prodEquivOfIsCompl q h.isCompl :=
435+
rfl
436+
437+
@[simp]
438+
theorem prodEquivOfIsTopCompl_apply (h : IsTopCompl p q) (x : p × q) :
439+
prodEquivOfIsTopCompl p q h x = (x.1 : M) + x.2 :=
440+
rfl
441+
442+
@[simp]
443+
theorem prodEquivOfIsTopCompl_symm_apply (h : IsTopCompl p q) (x : M) :
444+
(prodEquivOfIsTopCompl p q h).symm x =
445+
((p.projectionOntoL q h x, q.projectionOntoL p h.symm x) : p × q) :=
446+
prodEquivOfIsCompl_symm_apply h.isCompl x
447+
448+
/-- Two complementary submodules are topological complements if and only if the linear equivalence
449+
`Submodule.quotientEquivOfIsCompl` is continuous. -/
450+
theorem IsCompl.isTopCompl_iff_continuous_quotientEquivOfIsCompl (h : IsCompl p q) :
451+
IsTopCompl p q ↔ Continuous (p.quotientEquivOfIsCompl q h) := by
452+
have hproj : ⇑(p.quotientEquivOfIsCompl q h) ∘ ⇑p.mkQ = ⇑(q.projectionOnto p h.symm) := by
453+
funext; simp
454+
rw [p.isQuotientMap_mkQL.continuous_iff, coe_mkQL, hproj, ← h.symm.isTopCompl_iff_projectionOnto,
455+
isTopCompl_comm]
456+
457+
variable (p q) in
458+
/-- If two submodules are topological complements, then the linear equivalence
459+
`Submodule.quotientEquivOfIsCompl` is a homeomorphism, bundled as a continuous linear
460+
equivalence. -/
461+
noncomputable def quotientEquivOfIsTopCompl (h : IsTopCompl p q) : (M ⧸ p) ≃L[R] q :=
462+
{ p.quotientEquivOfIsCompl q h.isCompl with
463+
continuous_toFun := h.isCompl.isTopCompl_iff_continuous_quotientEquivOfIsCompl.mp h
464+
continuous_invFun := (p.mkQL.comp q.subtypeL).continuous }
465+
466+
@[simp]
467+
theorem toLinearEquiv_quotientEquivOfIsTopCompl (h : IsTopCompl p q) :
468+
(quotientEquivOfIsTopCompl p q h : (M ⧸ p) ≃ₗ[R] q) = p.quotientEquivOfIsCompl q h.isCompl :=
469+
rfl
470+
471+
@[simp]
472+
theorem quotientEquivOfIsTopCompl_apply (h : IsTopCompl p q) (x : M ⧸ p) :
473+
quotientEquivOfIsTopCompl p q h x = p.quotientEquivOfIsCompl q h.isCompl x :=
474+
rfl
475+
476+
@[simp]
477+
theorem quotientEquivOfIsTopCompl_symm_apply (h : IsTopCompl p q) (y : q) :
478+
(quotientEquivOfIsTopCompl p q h).symm y = p.mkQ y :=
479+
rfl
480+
481+
theorem quotientEquivOfIsTopCompl_apply_mk (h : IsTopCompl p q) (x : M) :
482+
quotientEquivOfIsTopCompl p q h (Quotient.mk x) = q.projectionOnto p h.isCompl.symm x :=
483+
quotientEquivOfIsCompl_apply_mk h.isCompl x
484+
485+
end ContinuousLinearEquiv
486+
402487
end Submodule
488+
489+
namespace ContinuousLinearMap
490+
491+
variable {R : Type*} [Ring R] {E F : Type*}
492+
[TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E]
493+
[TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F]
494+
{p q : Submodule R E}
495+
496+
/-- Given continuous linear maps `φ : p →L[R] F` and `ψ : q →L[R] F` from topological complement
497+
submodules `p` and `q` of `E`, `ContinuousLinearMap.ofIsCompl` is the induced continuous linear map
498+
`E →L[R] F` over the entire module.
499+
500+
This is the continuous version of `LinearMap.ofIsCompl`. -/
501+
noncomputable def ofIsTopCompl (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) : E →L[R] F :=
502+
φ.coprod ψ ∘L ↑(prodEquivOfIsTopCompl p q h).symm
503+
504+
theorem ofIsTopCompl_eq_add (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
505+
ofIsTopCompl h φ ψ = φ ∘L p.projectionOntoL q h + ψ ∘L q.projectionOntoL p h.symm := by
506+
ext; simp [ofIsTopCompl]
507+
508+
@[simp]
509+
theorem toLinearMap_ofIsTopCompl (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
510+
(ofIsTopCompl h φ ψ : E →ₗ[R] F) = LinearMap.ofIsCompl h.isCompl φ ψ :=
511+
rfl
512+
513+
@[simp]
514+
theorem ofIsTopCompl_apply (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : E) :
515+
ofIsTopCompl h φ ψ (x : E) = LinearMap.ofIsCompl h.isCompl φ ψ x :=
516+
rfl
517+
518+
theorem ofIsTopCompl_apply_left (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : p) :
519+
ofIsTopCompl h φ ψ (x : E) = φ x := by simp
520+
521+
theorem ofIsTopCompl_apply_right (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : q) :
522+
ofIsTopCompl h φ ψ (x : E) = ψ x := by simp
523+
524+
theorem ofIsTopCompl_eq (h : IsTopCompl p q) {φ : p →L[R] F} {ψ : q →L[R] F} {χ : E →L[R] F}
525+
(hφ : ∀ u : p, φ u = χ u) (hψ : ∀ u : q, ψ u = χ u) : ofIsTopCompl h φ ψ = χ := by
526+
ext; simp [LinearMap.ofIsCompl_eq h.isCompl hφ, hψ]
527+
528+
@[simp]
529+
theorem ofIsTopCompl_zero (h : IsTopCompl p q) : (ofIsTopCompl h 0 0 : E →L[R] F) = 0 := by
530+
ext; simp
531+
532+
@[simp]
533+
theorem ofIsTopCompl_add (h : IsTopCompl p q) (φ₁ φ₂ : p →L[R] F) (ψ₁ ψ₂ : q →L[R] F) :
534+
ofIsTopCompl h (φ₁ + φ₂) (ψ₁ + ψ₂) = ofIsTopCompl h φ₁ ψ₁ + ofIsTopCompl h φ₂ ψ₂ := by
535+
ext; simp
536+
537+
theorem range_ofIsTopCompl (h : IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
538+
LinearMap.range (ofIsTopCompl h φ ψ : E →ₗ[R] F) = φ.range ⊔ ψ.range := by simp
539+
540+
end ContinuousLinearMap

0 commit comments

Comments
 (0)