Skip to content

Commit c6513d0

Browse files
committed
feat(Analysis/Normed/Operator): star-algebra equivalences between continuous endomorphisms are isometrically inner (leanprover-community#33066)
This is the star-algebra equivalence version of [AlgEquiv.eq_linearEquivConjAlgEquiv](https://leanprover-community.github.io/mathlib4_docs/Mathlib/LinearAlgebra/GeneralLinearGroup/AlgEquiv.html#AlgEquiv.eq_linearEquivConjAlgEquiv) and [ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Analysis/Normed/Operator/ContinuousAlgEquiv.html#ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv). So we now have a characterization of algebra, continuous algebra, and star-algebra equivalences between endomorphisms. The proof follows the same idea as the one in leanprover-community#28972.
1 parent 47ede36 commit c6513d0

4 files changed

Lines changed: 187 additions & 5 deletions

File tree

Mathlib/Analysis/InnerProductSpace/Adjoint.lean

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,10 +640,11 @@ section Unitary
640640

641641
variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace 𝕜 H] [CompleteSpace H]
642642

643-
namespace ContinuousLinearMap
644-
643+
section linearIsometryEquiv
645644
variable {K : Type*} [NormedAddCommGroup K] [InnerProductSpace 𝕜 K] [CompleteSpace K]
646645

646+
namespace ContinuousLinearMap
647+
647648
theorem inner_map_map_iff_adjoint_comp_self (u : H →L[𝕜] K) :
648649
(∀ x y : H, ⟪u x, u y⟫_𝕜 = ⟪x, y⟫_𝕜) ↔ adjoint u ∘L u = 1 := by
649650
refine ⟨fun h ↦ ext fun x ↦ ?_, fun h ↦ ?_⟩
@@ -682,6 +683,36 @@ theorem inner_map_map_of_mem_unitary {u : H →L[𝕜] H} (hu : u ∈ unitary (H
682683

683684
end ContinuousLinearMap
684685

686+
namespace LinearIsometryEquiv
687+
688+
open ContinuousLinearMap ContinuousLinearEquiv in
689+
/-- An isometric linear equivalence of two Hilbert spaces induces an equivalence of
690+
⋆-algebras of their endomorphisms. -/
691+
def conjStarAlgEquiv (e : H ≃ₗᵢ[𝕜] K) : (H →L[𝕜] H) ≃⋆ₐ[𝕜] (K →L[𝕜] K) :=
692+
.ofAlgEquiv e.toContinuousLinearEquiv.conjContinuousAlgEquiv fun x ↦ by
693+
simp [star_eq_adjoint, conjContinuousAlgEquiv_apply, ← toContinuousLinearEquiv_symm, comp_assoc]
694+
695+
@[simp] lemma conjStarAlgEquiv_apply_apply (e : H ≃ₗᵢ[𝕜] K) (x : H →L[𝕜] H) (y : K) :
696+
e.conjStarAlgEquiv x y = e (x (e.symm y)) := rfl
697+
698+
theorem symm_conjStarAlgEquiv_apply_apply (e : H ≃ₗᵢ[𝕜] K) (f : K →L[𝕜] K) (x : H) :
699+
e.conjStarAlgEquiv.symm f x = e.symm (f (e x)) := rfl
700+
701+
lemma conjStarAlgEquiv_apply (e : H ≃ₗᵢ[𝕜] K) (x : H →L[𝕜] H) :
702+
e.conjStarAlgEquiv x = e ∘L x ∘L e.symm := rfl
703+
704+
@[simp] lemma symm_conjStarAlgEquiv (e : H ≃ₗᵢ[𝕜] K) :
705+
e.conjStarAlgEquiv.symm = e.symm.conjStarAlgEquiv := rfl
706+
707+
@[simp] theorem conjStarAlgEquiv_refl : conjStarAlgEquiv (.refl 𝕜 H) = .refl := rfl
708+
709+
theorem conjStarAlgEquiv_trans {G : Type*} [NormedAddCommGroup G] [InnerProductSpace 𝕜 G]
710+
[CompleteSpace G] (e : H ≃ₗᵢ[𝕜] K) (f : K ≃ₗᵢ[𝕜] G) :
711+
(e.trans f).conjStarAlgEquiv = e.conjStarAlgEquiv.trans f.conjStarAlgEquiv := rfl
712+
713+
end LinearIsometryEquiv
714+
end linearIsometryEquiv
715+
685716
namespace Unitary
686717

687718
theorem norm_map (u : unitary (H →L[𝕜] H)) (x : H) : ‖(u : H →L[𝕜] H) x‖ = ‖x‖ :=

Mathlib/Analysis/Normed/Operator/ContinuousAlgEquiv.lean

Lines changed: 150 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,24 @@ Authors: Monica Omar
55
-/
66
module
77

8+
public import Mathlib.Analysis.InnerProductSpace.Adjoint
9+
public import Mathlib.Analysis.InnerProductSpace.Positive
810
public import Mathlib.Analysis.LocallyConvex.SeparatingDual
911
public import Mathlib.Analysis.Normed.Operator.Banach
1012
public import Mathlib.Topology.Algebra.Algebra.Equiv
1113

14+
import Mathlib.Algebra.Central.Basic
15+
import Mathlib.Analysis.SpecialFunctions.Pow.Real
16+
1217
/-!
13-
# Continuous algebra equivalences between continuous endomorphisms are inner
18+
# Continuous (star-)algebra equivalences between continuous endomorphisms are (isometrically) inner
1419
15-
This file shows that continuous algebra equivalences between continuous endomorphisms are inner.
20+
This file shows that continuous (star-)algebra equivalences between continuous endomorphisms are
21+
(isometrically) inner.
1622
See `Mathlib/LinearAlgebra/GeneralLinearGroup/AlgEquiv.lean` for the non-continuous version.
1723
The proof follows the same idea as the non-continuous version.
1824
19-
# TODO:
25+
### TODO:
2026
- when `V = W`, we can state that the group homomorphism
2127
`(V →L[𝕜] V)ˣ →* ((V →L[𝕜] V) ≃A[𝕜] (V →L[𝕜] V))` is surjective,
2228
see `Module.End.mulSemiringActionToAlgEquiv_conjAct_surjective` for the non-continuous
@@ -79,3 +85,144 @@ public theorem ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv
7985
suffices T'.toLinearMap = Tₗ.symm from this ▸ T'.continuous
8086
simp [LinearMap.ext_iff, ← Tₗ.injective.eq_iff, T', this, hT, hd, Tₗ] }
8187
exact ⟨TL, fun A ↦ (ContinuousLinearMap.ext <| this A).symm⟩
88+
89+
variable {𝕜 V W : Type*} [RCLike 𝕜] [NormedAddCommGroup V] [InnerProductSpace 𝕜 V] [CompleteSpace V]
90+
[NormedAddCommGroup W] [InnerProductSpace 𝕜 W] [CompleteSpace W]
91+
92+
section auxiliaryDefs
93+
94+
variable (e : V ≃L[𝕜] W) {α α' : 𝕜} (hα : α ≠ 0)
95+
(hα2 : α' * α' = α⁻¹) (he : e.toContinuousLinearMap.adjoint ∘L e = α • .id 𝕜 V)
96+
(he' : e ∘L e.toContinuousLinearMap.adjoint = α • .id 𝕜 W)
97+
include hα hα2 he he'
98+
99+
/-- Scalar multiple of a continuous linear equivalence (given certain properties are satisfied). -/
100+
noncomputable abbrev auxContinuousLinearEquiv :
101+
V ≃L[𝕜] W where
102+
toLinearMap := (α' • e.toContinuousLinearMap).toLinearMap
103+
invFun := (α' • e.toContinuousLinearMap.adjoint).toLinearMap
104+
left_inv x := by
105+
have := by simpa using congr($he x)
106+
simp [smul_smul, hα2, this, hα, ← mul_assoc]
107+
right_inv x := by
108+
have := by simpa using congr($he' x)
109+
simp [smul_smul, hα2, this, hα, ← mul_assoc]
110+
continuous_toFun := (α' • e.toContinuousLinearMap).continuous
111+
continuous_invFun := (α' • e.toContinuousLinearMap.adjoint).continuous
112+
113+
@[simp] theorem coe_auxContinuousLinearEquiv :
114+
(auxContinuousLinearEquiv e hα hα2 he he').toContinuousLinearMap =
115+
α' • e.toContinuousLinearMap := rfl
116+
117+
/-- Construct an isometry linear equivalence from a continuous linear equivalence
118+
and that its adjoint is a real-scalar multiple of its inverse. -/
119+
noncomputable abbrev auxIsometry (hαa : starRingEnd 𝕜 α' = α') :
120+
V ≃ₗᵢ[𝕜] W where
121+
__ := auxContinuousLinearEquiv e hα hα2 he he' |>.toLinearEquiv
122+
norm_map' := by
123+
rw [ContinuousLinearEquiv.coe_toLinearEquiv, ← ContinuousLinearEquiv.coe_coe,
124+
norm_map_iff_adjoint_comp_self, coe_auxContinuousLinearEquiv,
125+
MulActionSemiHomClass.map_smulₛₗ]
126+
simp only [hαa, comp_smulₛₗ, RingHom.id_apply, smul_comp, smul_smul, hα2]
127+
simp [he, smul_smul, hα, one_def]
128+
129+
@[simp] theorem coe_auxIsometry (hαa : starRingEnd 𝕜 α' = α') :
130+
(auxIsometry e hα hα2 he he' hαa).toContinuousLinearEquiv.toContinuousLinearMap =
131+
α' • e.toContinuousLinearMap := rfl
132+
133+
@[simp] theorem coe_symm_auxIsometry (hαa : starRingEnd 𝕜 α' = α') :
134+
(auxIsometry e hα hα2 he he' hαa).toContinuousLinearEquiv.symm.toContinuousLinearMap =
135+
α'⁻¹ • e.symm.toContinuousLinearMap := by
136+
ext y
137+
apply (auxIsometry e hα hα2 he he' hαa).toContinuousLinearEquiv.injective
138+
simp [smul_smul, inv_mul_cancel₀ (a := α') (by grind)]
139+
140+
end auxiliaryDefs
141+
142+
open ComplexOrder
143+
144+
/-- The ⋆-algebra equivalence version of
145+
`ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv`.
146+
147+
TODO: remove the hypothesis `Continuous f`, as star-algebra equivalences between endomorphisms are
148+
automatically continuous. -/
149+
public theorem StarAlgEquiv.eq_linearIsometryEquivConjStarAlgEquiv
150+
(f : (V →L[𝕜] V) ≃⋆ₐ[𝕜] (W →L[𝕜] W)) (hf : Continuous f) :
151+
∃ U : V ≃ₗᵢ[𝕜] W, f = U.conjStarAlgEquiv := by
152+
-- Assume nontriviality of `V`.
153+
by_cases! Subsingleton V
154+
· by_cases! Subsingleton W
155+
· use { toLinearEquiv := 0, norm_map' _ := by simp [Subsingleton.eq_zero] }
156+
exact ext fun _ ↦ Subsingleton.allEq _ _
157+
simpa using congr(f $(Subsingleton.allEq 0 1))
158+
/- By `ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv`,
159+
we know there exists a continuous linear equivalence `y : V ≃L[𝕜] W` such that
160+
`f = y.conjAlgEquiv`.
161+
Our goal will be to construct an isometry from `y`. We do this by first showing
162+
`adjoint y ∘ y` is in the center of the endormorphisms, and as the algebra of endomorphisms
163+
are central, `adjoint y ∘ y` is a scalar multiple of the identity. -/
164+
obtain ⟨y, hy⟩ := (ContinuousAlgEquiv.mk f.toAlgEquiv hf
165+
(f.toAlgEquiv.toLinearEquiv.continuous_symm hf)).eq_continuousLinearEquivConjContinuousAlgEquiv
166+
have (x : V →L[𝕜] V) : adjoint (f x) = f (adjoint x) := map_star _ _ |>.symm
167+
rw [ContinuousAlgEquiv.ext_iff] at hy
168+
simp_rw [← StarAlgEquiv.coe_toAlgEquiv, ContinuousAlgEquiv.coe_mk f.toAlgEquiv hf _ ▸ hy,
169+
conjContinuousAlgEquiv_apply, adjoint_comp] at this
170+
replace this (x : V →L[𝕜] V) : adjoint y.toContinuousLinearMap ∘L y ∘L adjoint x ∘L y.symm =
171+
adjoint x ∘L adjoint y.toContinuousLinearMap := by
172+
simp_rw [← this x, ← comp_assoc, ← adjoint_comp]
173+
simp
174+
replace this (x : V →L[𝕜] V) : Commute x (adjoint y.toContinuousLinearMap ∘L y) := by
175+
simp_rw [commute_iff_eq, mul_def, ← comp_assoc, ← (adjoint_adjoint x ▸ this _), comp_assoc]
176+
simp
177+
-- Let `α : 𝕜` be that scalar, i.e., `adjoint y ∘ y = α • id`. This scalar is clearly real.
178+
obtain ⟨α, hα⟩ := by simpa using (Subalgebra.mem_center_iff (R := 𝕜)).mpr fun _ ↦ this _
179+
simp only [AlgHom.toRingHom_eq_coe, Algebra.toRingHom_ofId, Algebra.algebraMap_eq_smul_one] at hα
180+
have : IsUnit (adjoint y.toContinuousLinearMap ∘L y) :=
181+
isUnit_iff_exists.mpr ⟨y.symm ∘L adjoint y.symm.toContinuousLinearMap, by
182+
simp [mul_def, ← comp_assoc, comp_assoc _ _ (adjoint y.toContinuousLinearMap),
183+
← adjoint_comp, one_def, comp_assoc _ y.toContinuousLinearMap]⟩
184+
have hα_re : α = RCLike.re α := by
185+
have := by simpa [IsSelfAdjoint, ← hα, one_def, star_eq_adjoint] using
186+
(IsSelfAdjoint.one (W →L[𝕜] W)).adjoint_conj y.toContinuousLinearMap
187+
rwa [← one_def, (smul_left_injective 𝕜 one_ne_zero).eq_iff, RCLike.conj_eq_iff_re,
188+
eq_comm] at this
189+
-- Also, as `adjoint y ∘ y` is invertible, we get `α ≠ 0`.
190+
have hα_ne_zero : α ≠ 0 := fun h ↦ by simp [h, ← hα] at this
191+
-- As `adjoint y ∘ y` is positive, we then get `0 < α`.
192+
have hα_nonneg : 0 ≤ α := by
193+
have := hα_re.symm ▸ (nonneg_iff_isPositive _ |>.mpr
194+
(hα_re ▸ hα ▸ isPositive_adjoint_comp_self y.toContinuousLinearMap))
195+
rw [← LinearMap.isPositive_one.isPositive_smul_iff (E := V) (one_ne_zero' (V →ₗ[𝕜] V))]
196+
exact (nonneg_iff_isPositive _).mp this
197+
have hα_pos := RCLike.ofReal_pos.mp <| hα_re ▸ (lt_of_le_of_ne' hα_nonneg hα_ne_zero)
198+
-- We also get `y ∘ adjoint y = α • id`.
199+
have h_comp_adjoint : y.toContinuousLinearMap ∘L adjoint y.toContinuousLinearMap =
200+
α • ContinuousLinearMap.id 𝕜 _ := by
201+
ext x
202+
simpa using congr(y (($hα ∘L y.symm.toContinuousLinearMap) x)).symm
203+
-- Finally, we construct our isometry `1/√(re α) • y`.
204+
set β := (((RCLike.re α : ℝ) ^ (-(1 / 2 : ℝ)) : ℝ) : 𝕜)
205+
have hβ : β * β = α⁻¹ := by
206+
rw [hα_re]
207+
norm_num [β, ← RCLike.ofReal_mul, ← Real.rpow_add hα_pos, Real.rpow_neg_one]
208+
set U := auxIsometry y hα_ne_zero hβ hα.symm h_comp_adjoint (by simp [β])
209+
use U
210+
have hβ₂ : β⁻¹ * β = 1 := by
211+
refine inv_mul_cancel₀ ?_
212+
simp only [β, ne_eq, map_eq_zero]
213+
rw [Real.rpow_eq_zero hα_pos.le (by simp)]
214+
exact ne_of_gt hα_pos
215+
ext
216+
simp [U.conjStarAlgEquiv_apply, U, smul_smul, hβ₂, ← conjContinuousAlgEquiv_apply, ← hy]
217+
218+
/- TODO: Remove instance when we have `StarOrderedRing (V →L[𝕜] V)` since
219+
this then becomes an instance from `StarRingEquivClass.instOrderIsoClass`. -/
220+
public instance (priority := 100) {F : Type*} [EquivLike F (V →L[𝕜] V) (W →L[𝕜] W)]
221+
[NonUnitalAlgEquivClass F 𝕜 _ _] [StarHomClass F _ _] [ContinuousMapClass F _ _] :
222+
OrderIsoClass F _ _ where
223+
map_le_map_iff f x y := by
224+
obtain ⟨U, hU⟩ := StarAlgEquiv.eq_linearIsometryEquivConjStarAlgEquiv
225+
(StarAlgEquivClass.toStarAlgEquiv f : _ ≃⋆ₐ[𝕜] _) (map_continuous f)
226+
have this a : f a = U.conjStarAlgEquiv a := by simpa using congr($hU a)
227+
simp_rw [le_def, ← _root_.map_sub, ← isPositive_toLinearMap_iff, this]
228+
exact LinearMap.isPositive_linearIsometryEquiv_conj_iff U

Mathlib/LinearAlgebra/GeneralLinearGroup/AlgEquiv.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ This file shows that given any algebra equivalence `f : End K V ≃ₐ[K] End K
1717
there exists a linear equivalence `T : V ≃ₗ[K] V` such that `f x = T ∘ₗ x ∘ₗ T.symm`.
1818
In other words, the map `MulSemiringAction.toAlgEquiv` from `GeneralLinearGroup K V` to
1919
`End K V ≃ₐ[K] End K V` is surjective.
20+
21+
For the continuous versions, see `Mathlib/Analysis/Normed/Operator/ContinuousAlgEquiv.lean`.
2022
-/
2123

2224
open Module LinearMap LinearEquiv

Mathlib/Topology/Algebra/Algebra/Equiv.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ instance continuousAlgEquivClass : ContinuousAlgEquivClass (A ≃A[R] B) R A B w
9797

9898
theorem coe_apply (e : A ≃A[R] B) (a : A) : (e : A →A[R] B) a = e a := rfl
9999

100+
@[simp] theorem coe_mk (e : A ≃ₐ[R] B) (he he') : ⇑(mk e he he') = e := rfl
101+
100102
@[simp]
101103
theorem coe_coe (e : A ≃A[R] B) : ⇑(e : A →A[R] B) = e := rfl
102104

0 commit comments

Comments
 (0)