@@ -5,18 +5,24 @@ Authors: Monica Omar
55-/
66module
77
8+ public import Mathlib.Analysis.InnerProductSpace.Adjoint
9+ public import Mathlib.Analysis.InnerProductSpace.Positive
810public import Mathlib.Analysis.LocallyConvex.SeparatingDual
911public import Mathlib.Analysis.Normed.Operator.Banach
1012public 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.
1622See `Mathlib/LinearAlgebra/GeneralLinearGroup/AlgEquiv.lean` for the non-continuous version.
1723The 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
0 commit comments