Skip to content

Commit 32a03d8

Browse files
committed
feat: {Continuous}Linear{Isometry}Equiv.conj{Continuous, Star}AlgEquiv are "almost" injective (leanprover-community#33417)
... "almost" meaning that they are colinear. I.e., `f.conj{Continuous, Star}AlgEquiv S = g.conj{Continuous, Star}AlgEquiv S` iff `f = α • g` for some unit(ary) `α`. Also, the same for `Unitary.conjStarAlgAut`. All in one PR since they all have analogous proofs.
1 parent fd83ef4 commit 32a03d8

9 files changed

Lines changed: 246 additions & 4 deletions

File tree

Mathlib/Algebra/Central/End.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,31 @@ public instance [IsCentral S R] : IsCentral S (End R M) where out T hT :=
3939
⟨y, by aesop⟩
4040

4141
end Algebra.IsCentral
42+
43+
open LinearMap in
44+
public theorem LinearEquiv.conjAlgEquiv_ext_iff {M₂ : Type*} [AddCommMonoid M₂] [Module R M₂]
45+
[Module S M₂] [SMulCommClass R S M₂] [IsScalarTower S R M₂] [Algebra.IsCentral S R]
46+
{f g : M ≃ₗ[R] M₂} : f.conjAlgEquiv S = g.conjAlgEquiv S ↔ ∃ α : S, ⇑f = α • g := by
47+
conv_lhs => rw [eq_comm]
48+
simp_rw [AlgEquiv.ext_iff, conjAlgEquiv_apply, ← eq_toLinearMap_symm_comp, ← comp_assoc,
49+
eq_comp_toLinearMap_symm, comp_assoc, ← comp_assoc _ _ g.symm.toLinearMap, comp_coe,
50+
← End.mul_eq_comp, ← Subalgebra.mem_center_iff (R := S), Algebra.IsCentral.center_eq_bot,
51+
← comp_coe, Algebra.mem_bot, Set.mem_range, Algebra.algebraMap_eq_smul_one,
52+
eq_toLinearMap_symm_comp, eq_comm, LinearMap.ext_iff, funext_iff, comp_apply, coe_coe,
53+
LinearMap.smul_apply, End.one_apply, Pi.smul_apply, LinearMapClass.map_smul_of_tower g]
54+
55+
open LinearMap in
56+
public theorem LinearEquiv.conjAlgEquiv_ext_iff' {S M₂ : Type*} [CommRing S] [IsCancelMulZero S]
57+
[Module S M] [SMulCommClass R S M] [Algebra S R] [IsScalarTower S R M] [AddCommGroup M₂]
58+
[Module R M₂] [Module S M₂] [SMulCommClass R S M₂] [IsScalarTower S R M₂]
59+
[Algebra.IsCentral S R] [IsTorsionFree S M₂]
60+
(f g : M ≃ₗ[R] M₂) : f.conjAlgEquiv S = g.conjAlgEquiv S ↔ ∃ α : Sˣ, f = α • g := by
61+
refine ⟨fun h ↦ ?_, fun ⟨y, h⟩ ↦ conjAlgEquiv_ext_iff.mpr ⟨(y : S), congr($h)⟩⟩
62+
by_cases! Subsingleton M
63+
· exact ⟨1, by ext; simp [Subsingleton.eq_zero]⟩
64+
obtain ⟨α, hα⟩ := conjAlgEquiv_ext_iff.mp h
65+
obtain ⟨β, hβ⟩ := conjAlgEquiv_ext_iff.mp h.symm
66+
obtain ⟨x, hx⟩ := exists_ne (0 : M)
67+
have : (1 : S) • f x = (α * β) • f x := by simpa [hβ, smul_smul] using congr($hα x)
68+
rw [smul_left_inj (by simpa)] at this
69+
exact ⟨.mk α β this.symm (mul_comm α β ▸ this.symm), ext fun _ ↦ by simpa using congr($hα _)⟩

Mathlib/Algebra/Module/Equiv/Basic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ def toModuleAut : S →* M ≃ₗ[R] M where
206206

207207
end DistribMulAction
208208

209+
theorem LinearEquiv.smul_refl [Semiring R] [Semiring S] [AddCommMonoid M] [Module R M] [Module S M]
210+
[SMulCommClass R S M] [SMul S R] [IsScalarTower S R M] (α : Sˣ) :
211+
letI := SMulCommClass.symm R Sˣ M
212+
α • refl R M = DistribMulAction.toLinearEquiv R M α := rfl
213+
209214
namespace AddEquiv
210215

211216
section AddCommMonoid

Mathlib/Algebra/Module/Equiv/Defs.lean

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,4 +605,38 @@ theorem coe_ofInvolutive {σ σ' : R →+* R} [RingHomInvPair σ σ'] [RingHomIn
605605

606606
end AddCommMonoid
607607

608+
section smul
609+
variable {S R V W G : Type*} [Semiring R] [Semiring S]
610+
[AddCommMonoid V] [Module R V] [Module S V]
611+
[AddCommMonoid W] [Module R W] [Module S W]
612+
[AddCommMonoid G] [Module R G] [Module S G]
613+
[SMulCommClass R S W] [SMul S R] [IsScalarTower S R V] [IsScalarTower S R W]
614+
615+
/-- Left scalar multiplication of a unit and a linear equivalence, as a linear equivalence. -/
616+
instance : SMul Sˣ (V ≃ₗ[R] W) where smul α e :=
617+
{ __ := (α : S) • e.toLinearMap
618+
invFun x := (↑α⁻¹ : S) • e.symm x
619+
left_inv _ := by simp [LinearMapClass.map_smul_of_tower e.symm, smul_smul]
620+
right_inv _ := by simp [smul_smul] }
621+
622+
@[simp] theorem smul_apply (α : Sˣ) (e : V ≃ₗ[R] W) (x : V) : (α • e) x = (α : S) • e x := rfl
623+
624+
theorem symm_smul_apply (e : V ≃ₗ[R] W) (α : Sˣ) (x : W) :
625+
(α • e).symm x = (↑α⁻¹ : S) • e.symm x := rfl
626+
627+
@[simp] theorem symm_smul [SMulCommClass R S V] (e : V ≃ₗ[R] W) (α : Sˣ) :
628+
(α • e).symm = α⁻¹ • e.symm := rfl
629+
630+
@[simp] theorem toLinearMap_smul (e : V ≃ₗ[R] W) (α : Sˣ) :
631+
(α • e).toLinearMap = (α : S) • e.toLinearMap := rfl
632+
633+
theorem smul_trans [SMulCommClass R S V] [IsScalarTower S R G]
634+
(α : Sˣ) (e : G ≃ₗ[R] V) (f : V ≃ₗ[R] W) :
635+
(α • e).trans f = α • (e.trans f) := by ext; simp [LinearMapClass.map_smul_of_tower f]
636+
637+
theorem trans_smul [IsScalarTower S R G]
638+
(α : Sˣ) (e : G ≃ₗ[R] V) (f : V ≃ₗ[R] W) :
639+
e.trans (α • f) = α • (e.trans f) := by ext; simp
640+
641+
end smul
608642
end LinearEquiv

Mathlib/Algebra/Star/UnitaryStarAlgAut.lean

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Monica Omar
55
-/
66
module
77

8+
public import Mathlib.Algebra.Central.Basic
89
public import Mathlib.Algebra.Ring.Action.ConjAct
910
public import Mathlib.Algebra.Star.StarAlgHom
1011
public import Mathlib.Algebra.Star.Unitary
@@ -68,4 +69,36 @@ theorem toAlgEquiv_conjStarAlgAut {S : Type*} [CommSemiring S] [Algebra S R] (u
6869
MulSemiringAction.toAlgEquiv _ R (ConjAct.toConjAct <| toUnits u) :=
6970
rfl
7071

72+
theorem conjStarAlgAut_ext_iff {S : Type*} [CommSemiring S] [Algebra S R] [Algebra.IsCentral S R]
73+
(u v : unitary R) : conjStarAlgAut S R u = conjStarAlgAut S R v ↔ ∃ α : S, (u : R) = α • v := by
74+
conv_lhs => rw [eq_comm]
75+
simp_rw [StarAlgEquiv.ext_iff, conjStarAlgAut_apply, ← coe_star, star_eq_inv,
76+
← val_inv_toUnits_apply, ← val_toUnits_apply, mul_assoc, ← Units.eq_inv_mul_iff_mul_eq,
77+
← mul_assoc, Units.eq_mul_inv_iff_mul_eq, mul_assoc, ← mul_assoc (((toUnits v)⁻¹ : Rˣ) : R),
78+
← Subalgebra.mem_center_iff (R := S), Algebra.IsCentral.center_eq_bot, Algebra.mem_bot,
79+
Set.mem_range, Algebra.algebraMap_eq_smul_one, Units.eq_inv_mul_iff_mul_eq, mul_smul_comm,
80+
mul_one, eq_comm]
81+
82+
theorem conjStarAlgAut_ext_iff' {R S : Type*} [Ring R] [StarMul R] [CommRing S] [StarMul S]
83+
[Algebra S R] [StarModule S R] [Algebra.IsCentral S R] [IsCancelMulZero S]
84+
[Module.IsTorsionFree S R] (u v : unitary R) :
85+
conjStarAlgAut S R u = conjStarAlgAut S R v ↔ ∃ α : unitary S, u = α • v := by
86+
conv_lhs => rw [eq_comm]
87+
simp_rw [StarAlgEquiv.ext_iff, conjStarAlgAut_apply, ← coe_star, star_eq_inv,
88+
← val_inv_toUnits_apply, ← val_toUnits_apply, mul_assoc, ← Units.eq_inv_mul_iff_mul_eq,
89+
← mul_assoc, Units.eq_mul_inv_iff_mul_eq, mul_assoc, ← mul_assoc (((toUnits v)⁻¹ : Rˣ) : R),
90+
← Subalgebra.mem_center_iff (R := S), Algebra.IsCentral.center_eq_bot, Algebra.mem_bot,
91+
Set.mem_range, Algebra.algebraMap_eq_smul_one, val_inv_toUnits_apply, val_toUnits_apply,
92+
← star_eq_inv, coe_star]
93+
refine ⟨fun ⟨y, h⟩ ↦ ?_, fun ⟨y, h⟩ ↦ ⟨(y : S), by
94+
simp only [h, coe_smul, mul_smul_comm, SetLike.coe_mem, star_mul_self_of_mem]; rfl⟩⟩
95+
have huv : (u : R) = y • (v : R) := by simpa [← mul_assoc] using congr(v * $h).symm
96+
have hvu : (v : R) = star y • (u : R) := by simpa [← mul_assoc] using congr(u * (star $h)).symm
97+
have hvy : (v : R) = (star y * y) • (v : R) := by simp [← smul_smul, ← huv, ← hvu]
98+
nth_rw 1 [← one_smul S (v : R)] at hvy
99+
rw [← sub_eq_zero, ← sub_smul, smul_eq_zero, sub_eq_zero, eq_comm] at hvy
100+
obtain (this | this) := hvy
101+
· exact ⟨⟨y, by simp [mem_iff, this, mul_comm y]⟩, by ext; exact huv⟩
102+
· exact ⟨1, by ext; simp [this, huv] at huv ⊢⟩
103+
71104
end Unitary

Mathlib/Analysis/InnerProductSpace/Adjoint.lean

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@ Authors: Frédéric Dupuis, Heather Macbeth
55
-/
66
module
77

8+
public import Mathlib.Algebra.Star.UnitaryStarAlgAut
89
public import Mathlib.Analysis.InnerProductSpace.Dual
910
public import Mathlib.Analysis.InnerProductSpace.PiL2
11+
public import Mathlib.Analysis.LocallyConvex.SeparatingDual
12+
13+
import Mathlib.Algebra.Central.Basic
1014

1115
/-!
1216
# Adjoint of operators on Hilbert spaces
@@ -713,7 +717,11 @@ namespace LinearIsometryEquiv
713717

714718
open ContinuousLinearMap ContinuousLinearEquiv in
715719
/-- An isometric linear equivalence of two Hilbert spaces induces an equivalence of
716-
⋆-algebras of their endomorphisms. -/
720+
⋆-algebras of their endomorphisms.
721+
722+
When `H = K`, this is exactly `Unitary.conjStarAlgAut`
723+
(see `Unitary.conjStarAlgEquiv_unitaryLinearIsometryEquiv` and
724+
`Unitary.conjStarAlgAut_symm_unitaryLinearIsometryEquiv`). -/
717725
def conjStarAlgEquiv (e : H ≃ₗᵢ[𝕜] K) : (H →L[𝕜] H) ≃⋆ₐ[𝕜] (K →L[𝕜] K) :=
718726
.ofAlgEquiv e.toContinuousLinearEquiv.conjContinuousAlgEquiv fun x ↦ by
719727
simp [star_eq_adjoint, conjContinuousAlgEquiv_apply, ← toContinuousLinearEquiv_symm, comp_assoc]
@@ -736,6 +744,33 @@ theorem conjStarAlgEquiv_trans {G : Type*} [NormedAddCommGroup G] [InnerProductS
736744
[CompleteSpace G] (e : H ≃ₗᵢ[𝕜] K) (f : K ≃ₗᵢ[𝕜] G) :
737745
(e.trans f).conjStarAlgEquiv = e.conjStarAlgEquiv.trans f.conjStarAlgEquiv := rfl
738746

747+
open ContinuousLinearEquiv ContinuousLinearMap in
748+
theorem conjStarAlgEquiv_ext_iff (f g : H ≃ₗᵢ[𝕜] K) :
749+
f.conjStarAlgEquiv = g.conjStarAlgEquiv ↔ ∃ α : unitary 𝕜, f = α • g := by
750+
conv_lhs => rw [eq_comm]
751+
simp_rw [StarAlgEquiv.ext_iff, LinearIsometryEquiv.ext_iff, conjStarAlgEquiv_apply,
752+
← eq_toContinuousLinearMap_symm_comp, ← comp_assoc, toContinuousLinearEquiv_symm,
753+
eq_comp_toContinuousLinearMap_symm,
754+
comp_assoc, ← comp_assoc _ (f : H →L[𝕜] K), comp_coe, ← ContinuousLinearMap.mul_def,
755+
← Subalgebra.mem_center_iff (R := 𝕜), Algebra.IsCentral.center_eq_bot, ← comp_coe,
756+
Algebra.mem_bot, Set.mem_range, Algebra.algebraMap_eq_smul_one]
757+
refine ⟨fun ⟨y, h⟩ ↦ ?_, fun ⟨y, h⟩ ↦ ⟨(y : 𝕜), by ext; simp [h]⟩⟩
758+
by_cases! hy : y = 0
759+
· exact ⟨1, fun x ↦ by simp [by simpa [hy] using congr($h x).symm]⟩
760+
have hfg : (f : H →L[𝕜] K) = y • g := by ext; simpa using congr(g ($h _)).symm
761+
have hgf : (g : H →L[𝕜] K) = star y • f := by
762+
ext x
763+
have := by simpa [map_smulₛₗ, ← ContinuousLinearEquiv.comp_coe, ← toContinuousLinearEquiv_symm,
764+
← adjoint_eq_symm, ContinuousLinearMap.one_def] using congr(f (adjoint $h x)).symm
765+
simpa
766+
have : (g : H →L[𝕜] K) = (starRingEnd 𝕜 y * y) • g := by
767+
simp [← smul_smul, ← hfg, ← star_def, ← hgf]
768+
nth_rw 1 [← one_smul 𝕜 (g : H →L[𝕜] K)] at this
769+
rw [← sub_eq_zero, ← sub_smul, smul_eq_zero, sub_eq_zero, eq_comm] at this
770+
obtain (this | this) := this
771+
· exact ⟨⟨y, by simp [Unitary.mem_iff, this, mul_comm y]⟩, fun x ↦ congr($hfg x)⟩
772+
· exact ⟨1, fun x ↦ by simp [by simpa using congr($this x)]⟩
773+
739774
end LinearIsometryEquiv
740775
end linearIsometryEquiv
741776

@@ -785,6 +820,13 @@ lemma coe_symm_linearIsometryEquiv_apply (e : H ≃ₗᵢ[𝕜] H) :
785820
@[deprecated (since := "2025-12-16")] alias linearIsometryEquiv_coe_symm_apply :=
786821
coe_symm_linearIsometryEquiv_apply
787822

823+
theorem conjStarAlgEquiv_unitaryLinearIsometryEquiv (u : unitary (H →L[𝕜] H)) :
824+
(linearIsometryEquiv u).conjStarAlgEquiv = conjStarAlgAut 𝕜 _ u := rfl
825+
826+
theorem conjStarAlgAut_symm_unitaryLinearIsometryEquiv (u : H ≃ₗᵢ[𝕜] H) :
827+
conjStarAlgAut 𝕜 _ (linearIsometryEquiv.symm u) = u.conjStarAlgEquiv := by
828+
simp [← conjStarAlgEquiv_unitaryLinearIsometryEquiv]
829+
788830
end Unitary
789831

790832
namespace unitary

Mathlib/Analysis/LocallyConvex/SeparatingDual.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public import Mathlib.Algebra.Central.Basic
99
public import Mathlib.Analysis.LocallyConvex.Separation
1010
public import Mathlib.Analysis.LocallyConvex.WithSeminorms
1111
public import Mathlib.LinearAlgebra.Dual.Lemmas
12+
public import Mathlib.Topology.Algebra.Module.StrongTopology
1213

1314
/-!
1415
# Spaces with separating dual
@@ -162,6 +163,24 @@ instance _root_.Algebra.IsCentral.instContinuousLinearMap [Algebra.IsCentral S R
162163
have (y : V) := by simpa [hg] using congr($(Subalgebra.mem_center_iff.mp hf (g.smulRight y)) x)
163164
exact ⟨g (f x), by simp [this, ContinuousLinearMap.ext_iff]⟩
164165

166+
open ContinuousLinearMap ContinuousLinearEquiv in
167+
theorem _root_.ContinuousLinearEquiv.conjContinuousAlgEquiv_ext_iff
168+
{R V W : Type*} [NormedField R] [AddCommGroup V] [AddCommGroup W] [TopologicalSpace R]
169+
[TopologicalSpace V] [TopologicalSpace W] [IsTopologicalRing R] [Module R V] [Module R W]
170+
[SeparatingDual R V] [IsTopologicalAddGroup V] [IsTopologicalAddGroup W]
171+
[ContinuousSMul R V] [ContinuousSMul R W] (f g : V ≃L[R] W) :
172+
f.conjContinuousAlgEquiv = g.conjContinuousAlgEquiv ↔ ∃ α : Rˣ, f = α • g := by
173+
conv_lhs => rw [eq_comm]
174+
simp_rw [ContinuousAlgEquiv.ext_iff, funext_iff, conjContinuousAlgEquiv_apply,
175+
← eq_toContinuousLinearMap_symm_comp, ← ContinuousLinearMap.comp_assoc,
176+
eq_comp_toContinuousLinearMap_symm, ContinuousLinearMap.comp_assoc,
177+
← ContinuousLinearMap.comp_assoc _ f.toContinuousLinearMap, comp_coe, ← mul_def,
178+
← Subalgebra.mem_center_iff (R := R), Algebra.IsCentral.center_eq_bot, ← comp_coe,
179+
Algebra.mem_bot, Set.mem_range, Algebra.algebraMap_eq_smul_one, ContinuousLinearEquiv.ext_iff]
180+
refine ⟨fun ⟨y, h⟩ ↦ ?_, fun ⟨y, h⟩ ↦ ⟨(y : R), by ext; simp [h]⟩⟩
181+
if hy : y = 0 then exact ⟨1, funext fun x ↦ by simp [by simpa [hy] using congr($h x).symm]⟩
182+
else exact ⟨.mk0 y hy, funext fun x ↦ by simp [by simpa [eq_symm_apply] using congr($h x)]⟩
183+
165184
end algebra
166185

167186
/-- In a topological vector space with separating dual, the group of continuous linear equivalences

Mathlib/Analysis/Normed/Operator/ContinuousAlgEquiv.lean

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ The proof follows the same idea as the non-continuous version.
3030

3131
open ContinuousLinearMap ContinuousLinearEquiv
3232

33+
section
34+
variable {𝕜 V W : Type*} [NontriviallyNormedField 𝕜] [SeminormedAddCommGroup V]
35+
[SeminormedAddCommGroup W] [NormedSpace 𝕜 V] [NormedSpace 𝕜 W] [SeparatingDual 𝕜 V]
36+
[SeparatingDual 𝕜 W]
37+
3338
/-- This is the continuous version of `AlgEquiv.eq_linearEquivConjAlgEquiv`. -/
34-
public theorem ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv {𝕜 V W : Type*}
35-
[NontriviallyNormedField 𝕜] [SeminormedAddCommGroup V] [SeminormedAddCommGroup W]
36-
[NormedSpace 𝕜 V] [NormedSpace 𝕜 W] [SeparatingDual 𝕜 V] [SeparatingDual 𝕜 W]
39+
public theorem ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv
3740
(f : (V →L[𝕜] V) ≃A[𝕜] (W →L[𝕜] W)) :
3841
∃ U : V ≃L[𝕜] W, f = U.conjContinuousAlgEquiv := by
3942
/- The proof goes as follows:
@@ -87,6 +90,13 @@ public theorem ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv
8790
simp [LinearMap.ext_iff, ← Tₗ.injective.eq_iff, T', this, hT, hd, Tₗ] }
8891
exact ⟨TL, fun A ↦ (ContinuousLinearMap.ext <| this A).symm⟩
8992

93+
variable (𝕜 V W) in
94+
public theorem ContinuousLinearEquiv.conjContinuousAlgEquiv_surjective :
95+
Function.Surjective (conjContinuousAlgEquiv (𝕜 := 𝕜) (G := V) (H := W)) :=
96+
fun f ↦ f.eq_continuousLinearEquivConjContinuousAlgEquiv.imp fun _ h ↦ h.symm
97+
98+
end
99+
90100
variable {𝕜 V W : Type*} [RCLike 𝕜] [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [CompleteSpace V]
91101
[NormedAddCommGroup W] [InnerProductSpace 𝕜 W] [CompleteSpace W]
92102

Mathlib/Analysis/RCLike/Basic.lean

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,3 +1287,36 @@ noncomputable def IsRCLikeNormedField.rclike (𝕜 : Type*)
12871287
exact p.copy_of_normedField hk hp
12881288

12891289
end
1290+
1291+
namespace LinearIsometryEquiv
1292+
variable {𝕜 V W G : Type*} [RCLike 𝕜] [SeminormedAddCommGroup V] [Module 𝕜 V]
1293+
[SeminormedAddCommGroup W] [NormedSpace 𝕜 W] [SeminormedAddCommGroup G] [NormedSpace 𝕜 G]
1294+
1295+
/-- Left scalar multiplication of a unit with norm one and a linear isometric equivalence,
1296+
as a linear isometric equivalence. -/
1297+
instance : SMul (unitary 𝕜) (V ≃ₗᵢ[𝕜] W) where smul α e :=
1298+
{ __ := Unitary.toUnits α • e.toLinearEquiv
1299+
norm_map' _ := by simp [norm_smul] }
1300+
1301+
@[simp] theorem smul_apply (e : V ≃ₗᵢ[𝕜] W) (α : unitary 𝕜) (x : V) :
1302+
(α • e) x = (α : 𝕜) • e x := rfl
1303+
1304+
theorem symm_smul_apply (e : V ≃ₗᵢ[𝕜] W) (α : unitary 𝕜) (x : W) :
1305+
(α • e).symm x = (↑α⁻¹ : 𝕜) • e.symm x := rfl
1306+
1307+
@[simp] theorem symm_units_smul (e : G ≃ₗᵢ[𝕜] W) (α : unitary 𝕜) :
1308+
(α • e).symm = α⁻¹ • e.symm := by ext; simp [symm_smul_apply]
1309+
1310+
@[simp] theorem toLinearEquiv_smul (e : V ≃ₗᵢ[𝕜] W) (α : unitary 𝕜) :
1311+
(α • e).toLinearEquiv = Unitary.toUnits α • e.toLinearEquiv := rfl
1312+
1313+
@[simp] theorem toContinuousLinearEquiv_smul (e : G ≃ₗᵢ[𝕜] W) (α : unitary 𝕜) :
1314+
(α • e).toContinuousLinearEquiv = Unitary.toUnits α • e.toContinuousLinearEquiv := rfl
1315+
1316+
theorem smul_trans (α : unitary 𝕜) (e : V ≃ₗᵢ[𝕜] G) (f : G ≃ₗᵢ[𝕜] W) :
1317+
(α • e).trans f = α • (e.trans f) := by ext; simp
1318+
1319+
theorem trans_smul (α : unitary 𝕜) (e : V ≃ₗᵢ[𝕜] G) (f : G ≃ₗᵢ[𝕜] W) :
1320+
e.trans (α • f) = α • (e.trans f) := by ext; simp
1321+
1322+
end LinearIsometryEquiv

Mathlib/Topology/Algebra/Module/Equiv.lean

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,11 @@ theorem eq_comp_toContinuousLinearMap_symm (e₁₂ : M₁ ≃SL[σ₁₂] M₂)
651651
f = g.comp e₁₂.symm.toContinuousLinearMap ↔ f.comp e₁₂.toContinuousLinearMap = g := by
652652
aesop
653653

654+
theorem eq_toContinuousLinearMap_symm_comp {e₁₂ : M₁ ≃SL[σ₁₂] M₂} [RingHomCompTriple σ₃₁ σ₁₂ σ₃₂]
655+
(f : M₃ →SL[σ₃₁] M₁) (g : M₃ →SL[σ₃₂] M₂) :
656+
f = e₁₂.symm.toContinuousLinearMap.comp g ↔ e₁₂.toContinuousLinearMap.comp f = g := by
657+
aesop
658+
654659
variable (M₁)
655660

656661
/-- The continuous linear equivalences from `M` to itself form a group under composition. -/
@@ -1378,4 +1383,37 @@ def opContinuousLinearEquiv : M ≃L[R] Mᵐᵒᵖ where
13781383

13791384
end MulOpposite
13801385

1386+
namespace ContinuousLinearEquiv
1387+
variable {S R V W G : Type*} [Semiring R] [Semiring S]
1388+
[AddCommMonoid V] [Module R V] [TopologicalSpace V] [Module S V] [ContinuousConstSMul S V]
1389+
[AddCommMonoid W] [Module R W] [TopologicalSpace W] [Module S W] [ContinuousConstSMul S W]
1390+
[AddCommMonoid G] [Module R G] [TopologicalSpace G] [Module S G] [ContinuousConstSMul S G]
1391+
[SMulCommClass R S W] [SMul S R] [IsScalarTower S R V] [IsScalarTower S R W]
1392+
1393+
/-- Left scalar multiplication of a unit and a continuous linear equivalence,
1394+
as a continuous linear equivalence. -/
1395+
instance : SMul Sˣ (V ≃L[R] W) where smul α e :=
1396+
{ __ := α • e.toLinearEquiv
1397+
continuous_toFun := α.isUnit.continuous_const_smul_iff.mpr e.continuous
1398+
continuous_invFun := α⁻¹.isUnit.continuous_const_smul_iff.mpr e.symm.continuous }
1399+
1400+
@[simp] theorem smul_apply (α : Sˣ) (e : V ≃L[R] W) (x : V) : (α • e) x = (α : S) • e x := rfl
1401+
1402+
theorem symm_smul_apply (e : V ≃L[R] W) (α : Sˣ) (x : W) :
1403+
(α • e).symm x = (↑α⁻¹ : S) • e.symm x := rfl
1404+
1405+
@[simp] theorem symm_smul [SMulCommClass R S V]
1406+
(e : V ≃L[R] W) (α : Sˣ) : (α • e).symm = α⁻¹ • e.symm := rfl
1407+
1408+
@[simp] theorem toLinearEquiv_smul (e : V ≃L[R] W) (α : Sˣ) :
1409+
(α • e).toLinearEquiv = α • e.toLinearEquiv := rfl
1410+
1411+
theorem smul_trans [SMulCommClass R S V] [IsScalarTower S R G] (α : Sˣ) (e : G ≃L[R] V)
1412+
(f : V ≃L[R] W) : (α • e).trans f = α • (e.trans f) := by
1413+
ext; simp [LinearMapClass.map_smul_of_tower f]
1414+
1415+
theorem trans_smul [IsScalarTower S R G] (α : Sˣ) (e : G ≃L[R] V) (f : V ≃L[R] W) :
1416+
e.trans (α • f) = α • (e.trans f) := by ext; simp
1417+
1418+
end ContinuousLinearEquiv
13811419
end

0 commit comments

Comments
 (0)