Documentation

Mathlib.Topology.Algebra.Module.Complement

Topological complements of submodules #

Let M be a topological R-module. Two submodules p, q of M are said to be topological complements (Submodule.IsTopCompl) if they are algebraic complements and the algebraic isomorphism M ≃ p × q is a homeomorphism.

Not all submodules of M admit such a topological complements (even if they admit algebraic complements). In the literature, such a submodule is called topologically complemented or direct. One may also find the terminology closed complemented because, in a Banach space, a closed algebraic complement is automatically a topological complement. This is the terminology we use for now (Submodule.ClosedComplemented), but we should eventually change to something less misleading.

Main definitions #

Main statements #

Implementation details #

In the definition of Submodule.IsTopCompl, we choose to ask for the continuity of the projection on the left submdule along the right one, because it is a simpler map to work with than the map M ≃ p × q.

Because the condition is symmetric, a lot of lemmas could have a left and a right variation. In general we only include the left version, the right one being accessible through Submodule.IsTopCompl.symm.

structure Submodule.IsTopCompl {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p q : Submodule R M) :

Two submodules p and q are topological complements if they are algebraic complements and the projection on p along q is continuous.

Instances For
    def Submodule.ClosedComplemented {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p : Submodule R M) :

    A submodule p is called complemented if there exists a continuous projection M →ₗ[R] p.

    Equations
    Instances For
      theorem Submodule.IsCompl.isTopCompl_iff {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsCompl p q) :
      @[deprecated Submodule.IsCompl.isTopCompl_iff_projectionOnto (since := "2026-05-05")]

      Alias of Submodule.IsCompl.isTopCompl_iff_projectionOnto.

      @[deprecated Submodule.IsTopCompl.continuous_projectionOnto (since := "2026-05-05")]

      Alias of Submodule.IsTopCompl.continuous_projectionOnto.

      theorem Submodule.IsTopCompl.symm {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [ContinuousSub M] (h : IsTopCompl p q) :
      theorem Submodule.isTopCompl_comm {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [ContinuousSub M] :
      theorem ContinuousLinearMap.isTopCompl_range_ker_of_leftInverse {R : Type u_1} [Ring R] {M : Type u_2} {N : Type u_3} [TopologicalSpace M] [TopologicalSpace N] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] (f₁ : M →L[R] N) (f₂ : N →L[R] M) (h : Function.LeftInverse f₂ f₁) :
      Submodule.IsTopCompl (↑f₁).range (↑f₂).ker
      theorem ContinuousLinearMap.isTopCompl_of_proj {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p : Submodule R M} {f : M →L[R] p} (hf : ∀ (x : p), f x = x) :
      noncomputable def Submodule.projectionOntoL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p q : Submodule R M) (h : IsTopCompl p q) :
      M →L[R] p

      If h : IsTopCompl p q, h.projectionOnto is the continuous linear projection M →L[R] p along q. This is the continuous version of Submodule.linearProjOfIsCompl.

      See also Submodule.IsTopCompl.projection for the same projection as an element of M →L[R] M.

      Equations
      Instances For
        @[simp]
        theorem Submodule.toLinearMap_projectionOntoL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
        (p.projectionOntoL q h) = p.projectionOnto q
        @[simp]
        theorem Submodule.projectionOntoL_apply_left {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : p) :
        (p.projectionOntoL q h) x = x
        theorem Submodule.range_projectionOntoL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
        (↑(p.projectionOntoL q h)).range =
        @[simp]
        theorem Submodule.projectionOntoL_apply_eq_zero_iff {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) {x : M} :
        (p.projectionOntoL q h) x = 0 x q
        theorem Submodule.projectionOntoL_apply_eq_zero_of_mem_right {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) {x : M} :
        x q(p.projectionOntoL q h) x = 0

        Alias of the reverse direction of Submodule.projectionOntoL_apply_eq_zero_iff.

        @[simp]
        theorem Submodule.projectionOntoL_apply_right {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : q) :
        (p.projectionOntoL q h) x = 0
        theorem Submodule.ker_projectionOntoL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
        (↑(p.projectionOntoL q h)).ker = q
        noncomputable def Submodule.projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p q : Submodule R M) (h : IsTopCompl p q) :
        M →L[R] M

        If h : IsTopCompl p q, h.projection is the continuous linear projection M →L[R] M onto p along q. This is the continuous version of Submodule.IsCompl.projection.

        See also Submodule.IsTopCompl.projectionOnto for the same projection as an element of M →L[R] p.

        Equations
        Instances For
          @[simp]
          theorem Submodule.toLinearMap_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
          (p.projectionL q h) = p.projection q
          theorem Submodule.projectionL_apply {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : M) :
          (p.projectionL q h) x = ((p.projectionOntoL q h) x)
          @[simp]
          theorem Submodule.coe_projectionOntoL_apply {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : M) :
          ((p.projectionOntoL q h) x) = (p.projectionL q h) x
          @[simp]
          theorem Submodule.projectionL_apply_mem {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : M) :
          (p.projectionL q h) x p
          @[simp]
          theorem Submodule.projectionL_apply_left {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : p) :
          (p.projectionL q h) x = x
          theorem Submodule.range_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
          (↑(p.projectionL q h)).range = p
          @[simp]
          theorem Submodule.projectionL_apply_eq_zero_iff {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) {x : M} :
          (p.projectionL q h) x = 0 x q
          theorem Submodule.projectionL_apply_eq_zero_of_mem_right {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) {x : M} :
          x q(p.projectionL q h) x = 0

          Alias of the reverse direction of Submodule.projectionL_apply_eq_zero_iff.

          @[simp]
          theorem Submodule.projectionL_apply_right {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) (x : q) :
          (p.projectionL q h) x = 0
          theorem Submodule.ker_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
          (↑(p.projectionL q h)).ker = q
          @[simp]
          theorem Submodule.isIdempotentElem_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} (h : IsTopCompl p q) :
          theorem Submodule.projectionL_add_projectionL_eq_self {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [ContinuousSub M] (h : IsTopCompl p q) (x : M) :
          (p.projectionL q h) x + (q.projectionL p ) x = x
          theorem Submodule.projectionL_eq_self_sub_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [ContinuousSub M] (h : IsTopCompl p q) (x : M) :
          (q.projectionL p ) x = x - (p.projectionL q h) x
          @[simp]
          theorem Submodule.projectionL_eq_self_iff {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [ContinuousSub M] (h : IsTopCompl p q) (x : M) :
          (p.projectionL q h) x = x x p

          The projection to p along q of x equals x if and only if x ∈ p.

          theorem ContinuousLinearMap.IsIdempotentElem.eq_projectionL {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {f : M →L[R] M} (hf : IsIdempotentElem f) :
          f = (↑f).range.projectionL (↑f).ker
          theorem Submodule.IsTopCompl.isClosed' {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [T1Space p] (h : IsTopCompl p q) :

          A variant of Submodule.IsTopCompl.isClosed. This has the very mild advantage over h.symm.isClosed that it doesn't assume ContinuousSub M.

          theorem Submodule.IsTopCompl.isClosed {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [T1Space q] [ContinuousSub M] (h : IsTopCompl p q) :

          If p and q are topological complements and q is Hausdorff, then p is closed.

          theorem Submodule.IsTopCompl.t3Space {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [IsTopologicalAddGroup M] (h : IsTopCompl p q) (hq : IsClosed q) :
          T3Space p
          theorem Submodule.IsTopCompl.t2Space {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [IsTopologicalAddGroup M] (h : IsTopCompl p q) (hq : IsClosed q) :
          T2Space p

          If p and q are topological complements and q is closed, then p is Hausdorff.

          noncomputable def Submodule.ClosedComplemented.complement {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p : Submodule R M} (h : p.ClosedComplemented) :

          An arbitrary choice of topological complement of a topologically complemented submodule.

          Equations
          Instances For
            theorem ContinuousLinearMap.closedComplemented_range_of_leftInverse {R : Type u_1} [Ring R] {M : Type u_2} {N : Type u_3} [TopologicalSpace M] [TopologicalSpace N] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] (f₁ : M →L[R] N) (f₂ : N →L[R] M) (h : Function.LeftInverse f₂ f₁) :
            theorem ContinuousLinearMap.closedComplemented_ker_of_rightInverse {R : Type u_1} [Ring R] {M : Type u_2} {N : Type u_3} [TopologicalSpace M] [TopologicalSpace N] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] [ContinuousSub M] (f₁ : M →L[R] N) (f₂ : N →L[R] M) (h : Function.RightInverse f₂ f₁) :
            theorem Submodule.ClosedComplemented.exists_submodule_equiv_prod {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] [IsTopologicalAddGroup M] {p : Submodule R M} (hp : p.ClosedComplemented) :
            ∃ (q : Submodule R M) (e : M ≃L[R] p × q), (∀ (x : p), e x = (x, 0)) (∀ (y : q), e y = (0, y)) ∀ (x : p × q), e.symm x = x.1 + x.2

            If p is a closed complemented submodule, then there exists a submodule q and a continuous linear equivalence M ≃L[R] (p × q) such that e (x : p) = (x, 0), e (y : q) = (0, y), and e.symm x = x.1 + x.2.

            In fact, the properties of e imply the properties of e.symm and vice versa, but we provide both for convenience.

            Two complementary submodules are topological complements if and only if the linear equivalence Submodule.prodEquivOfIsCompl is continuous in the inverse direction.

            The linear equivalence Submodule.prodEquivOfIsCompl from a pair of complementary submodules is always continuous.

            Two complementary submodules are topological complements if and only if the linear equivalence Submodule.prodEquivOfIsCompl is a homeomorphism.

            noncomputable def Submodule.prodEquivOfIsTopCompl {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p q : Submodule R M) [IsTopologicalAddGroup M] (h : IsTopCompl p q) :
            (p × q) ≃L[R] M

            If two submodules are topological complements, then the linear equivalence Submodule.prodEquivOfIsCompl is a homeomorphism, bundled as a continuous linear equivalence.

            Equations
            Instances For
              @[simp]
              theorem Submodule.prodEquivOfIsTopCompl_apply {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [IsTopologicalAddGroup M] (h : IsTopCompl p q) (x : p × q) :
              (p.prodEquivOfIsTopCompl q h) x = x.1 + x.2
              @[simp]
              theorem Submodule.prodEquivOfIsTopCompl_symm_apply {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [IsTopologicalAddGroup M] (h : IsTopCompl p q) (x : M) :

              Two complementary submodules are topological complements if and only if the linear equivalence Submodule.quotientEquivOfIsCompl is continuous.

              noncomputable def Submodule.quotientEquivOfIsTopCompl {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] (p q : Submodule R M) [IsTopologicalAddGroup M] (h : IsTopCompl p q) :
              (M p) ≃L[R] q

              If two submodules are topological complements, then the linear equivalence Submodule.quotientEquivOfIsCompl is a homeomorphism, bundled as a continuous linear equivalence.

              Equations
              Instances For
                @[simp]
                @[simp]
                theorem Submodule.quotientEquivOfIsTopCompl_symm_apply {R : Type u_1} [Ring R] {M : Type u_2} [TopologicalSpace M] [AddCommGroup M] [Module R M] {p q : Submodule R M} [IsTopologicalAddGroup M] (h : IsTopCompl p q) (y : q) :
                noncomputable def ContinuousLinearMap.ofIsTopCompl {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
                E →L[R] F

                Given continuous linear maps φ : p →L[R] F and ψ : q →L[R] F from topological complement submodules p and q of E, ContinuousLinearMap.ofIsCompl is the induced continuous linear map E →L[R] F over the entire module.

                This is the continuous version of LinearMap.ofIsCompl.

                Equations
                Instances For
                  theorem ContinuousLinearMap.ofIsTopCompl_eq_add {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
                  @[simp]
                  theorem ContinuousLinearMap.toLinearMap_ofIsTopCompl {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
                  (ofIsTopCompl h φ ψ) = LinearMap.ofIsCompl φ ψ
                  @[simp]
                  theorem ContinuousLinearMap.ofIsTopCompl_apply {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : E) :
                  (ofIsTopCompl h φ ψ) x = (LinearMap.ofIsCompl φ ψ) x
                  theorem ContinuousLinearMap.ofIsTopCompl_apply_left {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : p) :
                  (ofIsTopCompl h φ ψ) x = φ x
                  theorem ContinuousLinearMap.ofIsTopCompl_apply_right {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) (x : q) :
                  (ofIsTopCompl h φ ψ) x = ψ x
                  theorem ContinuousLinearMap.ofIsTopCompl_eq {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) {φ : p →L[R] F} {ψ : q →L[R] F} {χ : E →L[R] F} ( : ∀ (u : p), φ u = χ u) ( : ∀ (u : q), ψ u = χ u) :
                  ofIsTopCompl h φ ψ = χ
                  @[simp]
                  theorem ContinuousLinearMap.ofIsTopCompl_add {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ₁ φ₂ : p →L[R] F) (ψ₁ ψ₂ : q →L[R] F) :
                  ofIsTopCompl h (φ₁ + φ₂) (ψ₁ + ψ₂) = ofIsTopCompl h φ₁ ψ₁ + ofIsTopCompl h φ₂ ψ₂
                  theorem ContinuousLinearMap.range_ofIsTopCompl {R : Type u_1} [Ring R] {E : Type u_2} {F : Type u_3} [TopologicalSpace E] [AddCommGroup E] [Module R E] [IsTopologicalAddGroup E] [TopologicalSpace F] [AddCommGroup F] [Module R F] [ContinuousAdd F] {p q : Submodule R E} (h : Submodule.IsTopCompl p q) (φ : p →L[R] F) (ψ : q →L[R] F) :
                  (↑(ofIsTopCompl h φ ψ)).range = (↑φ).range(↑ψ).range