Skip to content

Commit 4c34f6c

Browse files
committed
feat: ContinuousLinearEquiv.submoduleMap and friends (#31899)
The continuous analogue of `LinearEquiv.{submoduleMap, submoduleMap', ofSubmodules}`. Also add `ContinuousLinearMap.ofEq` and `Homeomorph.ofEqSubtypes`, as these are necessary for the proof. This will be used in #28793 for dealing with a universe-polymorphic definition for smooth immersions.
1 parent ee16c22 commit 4c34f6c

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

Mathlib/Topology/Algebra/Module/Equiv.lean

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,104 @@ theorem coprod_comp_prodComm [ContinuousAdd M] (f : M₂ →L[R] M) (g : M₃
12181218

12191219
end ContinuousLinearMap
12201220

1221+
-- Restricting a continuous linear equivalence to a map between submodules.
1222+
section map
1223+
1224+
namespace ContinuousLinearEquiv
1225+
1226+
variable {R R₂ M M₂ : Type*} [Semiring R] [Semiring R₂] [AddCommMonoid M] [TopologicalSpace M]
1227+
[AddCommMonoid M₂] [TopologicalSpace M₂]
1228+
{module_M : Module R M} {module_M₂ : Module R₂ M₂} {σ₁₂ : R →+* R₂} {σ₂₁ : R₂ →+* R}
1229+
{re₁₂ : RingHomInvPair σ₁₂ σ₂₁} {re₂₁ : RingHomInvPair σ₂₁ σ₁₂}
1230+
1231+
/-- Continuous linear equivalence between two equal submodules:
1232+
this is `LinearEquiv.ofEq` as a continuous linear equivalence -/
1233+
def ofEq (p q : Submodule R M) (h : p = q) : p ≃L[R] q where
1234+
toLinearEquiv := LinearEquiv.ofEq _ _ h
1235+
continuous_toFun := by
1236+
have h' : (fun x ↦ x ∈ p) = (fun x ↦ x ∈ q) := by simp [h]
1237+
exact (Homeomorph.ofEqSubtypes h').continuous
1238+
continuous_invFun := by
1239+
have h' : (fun x ↦ x ∈ p) = (fun x ↦ x ∈ q) := by simp [h]
1240+
exact (Homeomorph.ofEqSubtypes h').symm.continuous
1241+
1242+
/--
1243+
A continuous linear equivalence of two modules restricts to a continuous linear equivalence
1244+
from any submodule `p` of the domain onto the image of that submodule.
1245+
1246+
This is the continuous linear version of `LinearEquiv.submoduleMap`.
1247+
This is `ContinuousLinearEquiv.ofSubmodule'` but with map on the right instead of comap on the left.
1248+
-/
1249+
def submoduleMap (e : M ≃SL[σ₁₂] M₂) (p : Submodule R M) :
1250+
p ≃SL[σ₁₂] Submodule.map e p where
1251+
toLinearMap := (e.comp p.subtype).codRestrict (p.map e) (fun ⟨c, hc⟩ ↦ by simpa)
1252+
invFun := (e.symm.comp (p.map e).subtype).codRestrict p (fun ⟨c, y, hy, eyc⟩ ↦ by
1253+
simpa [← eyc, e.symm_apply_apply])
1254+
left_inv x := by ext; simp
1255+
right_inv x := by ext; simp
1256+
continuous_toFun := by
1257+
have : Continuous (e.comp p.subtype) := by dsimp; fun_prop
1258+
dsimp
1259+
exact continuous_induced_rng.mpr this
1260+
continuous_invFun := by
1261+
have : Continuous (e.symm.comp (p.map e).subtype) := by dsimp; fun_prop
1262+
dsimp
1263+
exact continuous_induced_rng.mpr this
1264+
1265+
@[simp]
1266+
lemma submoduleMap_apply (e : M ≃SL[σ₁₂] M₂) (p : Submodule R M) (x : p) :
1267+
e.submoduleMap p x = e x := by
1268+
rfl
1269+
1270+
@[simp]
1271+
lemma submoduleMap_symm_apply (e : M ≃SL[σ₁₂] M₂) (p : Submodule R M) (x : p.map e) :
1272+
(e.submoduleMap p).symm x = e.symm x := by
1273+
rfl
1274+
1275+
/-- A continuous linear equivalence which maps a submodule of one module onto another,
1276+
restricts to a continuous linear equivalence of the two submodules.
1277+
This is `LinearEquiv.ofSubmodules` as a continuous linear equivalence. -/
1278+
def ofSubmodules (e : M ≃SL[σ₁₂] M₂)
1279+
(p : Submodule R M) (q : Submodule R₂ M₂) (h : p.map (e : M →SL[σ₁₂] M₂) = q) : p ≃SL[σ₁₂] q :=
1280+
(e.submoduleMap p).trans (.ofEq _ _ h)
1281+
1282+
@[simp]
1283+
theorem ofSubmodules_apply (e : M ≃SL[σ₁₂] M₂) {p : Submodule R M} {q : Submodule R₂ M₂}
1284+
(h : p.map e = q) (x : p) :
1285+
e.ofSubmodules p q h x = e x :=
1286+
rfl
1287+
1288+
@[simp]
1289+
theorem ofSubmodules_symm_apply (e : M ≃SL[σ₁₂] M₂) {p : Submodule R M} {q : Submodule R₂ M₂}
1290+
(h : p.map e = q) (x : q) : (e.ofSubmodules p q h).symm x = e.symm x :=
1291+
rfl
1292+
1293+
/-- A continuous linear equivalence of two modules restricts to a continuous linear equivalence
1294+
from the preimage of any submodule to that submodule.
1295+
This is `ContinuousLinearEquiv.ofSubmodule` but with `comap` on the left
1296+
instead of `map` on the right. -/
1297+
def ofSubmodule' (f : M ≃SL[σ₁₂] M₂) (U : Submodule R₂ M₂) : U.comap f ≃SL[σ₁₂] U :=
1298+
f.symm.ofSubmodules _ _ (U.map_equiv_eq_comap_symm f.toLinearEquiv.symm) |>.symm
1299+
1300+
theorem ofSubmodule'_toContinuousLinearMap (f : M ≃SL[σ₁₂] M₂) (U : Submodule R₂ M₂) :
1301+
(f.ofSubmodule' U).toContinuousLinearMap =
1302+
(f.toContinuousLinearMap.comp ((U.comap f).subtypeL)).codRestrict U
1303+
((fun ⟨x, hx⟩ ↦ by simpa [Submodule.mem_comap])) := by
1304+
rfl
1305+
1306+
@[simp]
1307+
theorem ofSubmodule'_apply (f : M ≃SL[σ₁₂] M₂) (U : Submodule R₂ M₂) (x : U.comap f) :
1308+
(f.ofSubmodule' U x : M₂) = f (x : M) :=
1309+
rfl
1310+
1311+
@[simp]
1312+
theorem ofSubmodule'_symm_apply (f : M ≃SL[σ₁₂] M₂) (U : Submodule R₂ M₂) (x : U) :
1313+
((f.ofSubmodule' U).symm x : M) = f.symm (x : M₂) := rfl
1314+
1315+
end ContinuousLinearEquiv
1316+
1317+
end map
1318+
12211319
namespace Submodule
12221320

12231321
variable {R : Type*} [Ring R] {M : Type*} [TopologicalSpace M] [AddCommGroup M] [Module R M]

Mathlib/Topology/Constructions.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,17 @@ theorem continuousAt_subtype_val {p : X → Prop} {x : Subtype p} :
440440
ContinuousAt ((↑) : Subtype p → X) x :=
441441
continuous_subtype_val.continuousAt
442442

443+
/-- The induced homeomorphism between two equal subtypes of a given topological space:
444+
the underlying equivalence is `Equiv.subtypeEquivProp`. -/
445+
def Homeomorph.ofEqSubtypes {p q : X → Prop} (hpq : p = q) : Subtype p ≃ₜ Subtype q where
446+
toEquiv := Equiv.subtypeEquivProp hpq
447+
continuous_toFun := continuous_id.subtype_map (fun x ↦ by simp [hpq])
448+
continuous_invFun := continuous_id.subtype_map (fun x ↦ by simp [hpq])
449+
450+
@[simp]
451+
lemma Homeomorph.ofEqSubtypes_toEquiv {p q : X → Prop} (hpq : p = q) :
452+
(Homeomorph.ofEqSubtypes hpq).toEquiv = Equiv.subtypeEquivProp hpq := rfl
453+
443454
theorem Subtype.dense_iff {s : Set X} {t : Set s} : Dense t ↔ s ⊆ closure ((↑) '' t) := by
444455
rw [IsInducing.subtypeVal.dense_iff, SetCoe.forall]
445456
rfl

0 commit comments

Comments
 (0)