Skip to content
Closed
Show file tree
Hide file tree
Changes from 20 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -1992,6 +1992,7 @@ public import Mathlib.Analysis.Normed.Operator.Compact
public import Mathlib.Analysis.Normed.Operator.CompleteCodomain
public import Mathlib.Analysis.Normed.Operator.Completeness
public import Mathlib.Analysis.Normed.Operator.Conformal
public import Mathlib.Analysis.Normed.Operator.ContinuousAlgEquiv
public import Mathlib.Analysis.Normed.Operator.ContinuousLinearMap
public import Mathlib.Analysis.Normed.Operator.Extend
public import Mathlib.Analysis.Normed.Operator.LinearIsometry
Expand Down
67 changes: 67 additions & 0 deletions Mathlib/Analysis/Normed/Operator/ContinuousAlgEquiv.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/-
Copyright (c) 2025 Monica Omar. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Monica Omar
-/
module

public import Mathlib.Analysis.LocallyConvex.SeparatingDual
public import Mathlib.Analysis.Normed.Operator.Banach
public import Mathlib.Topology.Algebra.Algebra.Equiv

/-!
# Continuous algebra equivalences between continuous endomorphisms are inner

This file shows that continuous algebra equivalences between continuous endomorphisms are inner.
See `Mathlib/LinearAlgebra/GeneralLinearGroup/AlgEquiv.lean` for the non-continuous version.
The proof follows the same idea as the non-continuous version.

# TODO:
- when `V = W`, we can state that the group homomorphism
`(V →L[𝕜] V)ˣ →* ((V →L[𝕜] V) ≃A[𝕜] (V →L[𝕜] V))` is surjective,
see `Module.End.mulSemiringActionToAlgEquiv_conjAct_surjective` for the non-continuous
version of this.
-/

open ContinuousLinearMap ContinuousLinearEquiv

/-- This is the continuous version of `AlgEquiv.eq_linearEquivConjAlgEquiv`. -/
public theorem ContinuousAlgEquiv.eq_continuousLinearEquivConjContinuousAlgEquiv {𝕜 V W : Type*}
[NontriviallyNormedField 𝕜] [SeminormedAddCommGroup V] [SeminormedAddCommGroup W]
[NormedSpace 𝕜 V] [NormedSpace 𝕜 W] [SeparatingDual 𝕜 V] [SeparatingDual 𝕜 W]
(f : (V →L[𝕜] V) ≃A[𝕜] (W →L[𝕜] W)) :
∃ U : V ≃L[𝕜] W, f = U.conjContinuousAlgEquiv := by
by_cases! hV : Subsingleton V
Comment thread
themathqueen marked this conversation as resolved.
· by_cases! hV : Subsingleton W
· exact ⟨{ toLinearEquiv := 0 }, ext <| Subsingleton.allEq _ _⟩
simpa using congr(f $(Subsingleton.allEq 0 1))
simp_rw [ContinuousAlgEquiv.ext_iff, funext_iff, conjContinuousAlgEquiv_apply, ← comp_assoc,
eq_comp_toContinuousLinearMap_symm]
obtain ⟨u, hu⟩ := exists_ne (0 : V)
obtain ⟨v, huv⟩ := SeparatingDual.exists_ne_zero (R := 𝕜) hu
obtain ⟨z, hz⟩ : ∃ z : W, ¬ f (smulRight v u) z = (0 : W →L[𝕜] W) z := by
rw [← not_forall, ← ContinuousLinearMap.ext_iff, map_eq_zero_iff, ContinuousLinearMap.ext_iff]
exact not_forall.mpr ⟨u, huv.isUnit.smul_eq_zero.not.mpr hu⟩
set T := apply' _ (.id 𝕜) z ∘L f.toContinuousAlgHom.toContinuousLinearMap ∘L smulRightL 𝕜 _ _ v
have hT x : T x = f (smulRight v x) z := rfl
have this A x : T (A x) = f A (T x) := by
simp only [hT, ← mul_apply, ← map_mul]
congr; ext; simp
have ⟨d, hd⟩ := SeparatingDual.exists_eq_one (R := 𝕜) hz
have surj : Function.Surjective T := fun w ↦ ⟨f.symm (smulRight d w) u, by simp [T, this, hd]⟩
have inj : Function.Injective T := fun x y hxy ↦ by
have h_smul : smulRight v x = smulRight v y := by
apply f.injective <| ContinuousLinearMap.ext fun z ↦ ?_
obtain ⟨w, rfl⟩ := surj z
simp [← this, hxy]
simpa [huv.isUnit.smul_left_cancel] using congr((fun f ↦ f u) $h_smul)
set Tₗ : V ≃ₗ[𝕜] W := .ofBijective T.toLinearMap ⟨inj, surj⟩
set T' := apply' _ (.id 𝕜) u ∘L f.symm.toContinuousAlgHom.toContinuousLinearMap ∘L
smulRightL 𝕜 _ _ d
set TL : V ≃L[𝕜] W := { Tₗ with
continuous_toFun := T.continuous
continuous_invFun := by
change Continuous Tₗ.symm.toLinearMap
suffices T'.toLinearMap = Tₗ.symm from this ▸ T'.continuous
simp [LinearMap.ext_iff, ← Tₗ.injective.eq_iff, T', this, hT, hd, Tₗ] }
exact ⟨TL, fun A ↦ (ContinuousLinearMap.ext <| this A).symm⟩
5 changes: 5 additions & 0 deletions Mathlib/Topology/Algebra/Algebra.lean
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ theorem ext_on [T2Space B] {s : Set A} (hs : Dense (Algebra.adjoin R s : Set A))
{f g : A →A[R] B} (h : Set.EqOn f g s) : f = g :=
ext fun x => eqOn_closure_adjoin h (hs x)

/-- Interpret a `ContinuousAlgHom` as a `ContinuousLinearMap`. -/
def toContinuousLinearMap (e : A →A[R] B) : A →L[R] B where toLinearMap := e.toAlgHom.toLinearMap

@[simp] theorem coe_toContinuousLinearMap (e : A →A[R] B) : ⇑e.toContinuousLinearMap = e := rfl

variable [IsTopologicalSemiring A]

/-- The topological closure of a subalgebra -/
Expand Down
21 changes: 9 additions & 12 deletions Mathlib/Topology/Algebra/Module/Equiv.lean
Original file line number Diff line number Diff line change
Expand Up @@ -660,25 +660,22 @@ theorem symm_equivOfInverse' (f₁ : M₁ →SL[σ₁₂] M₂) (f₂ h₁ h₂)
(equivOfInverse' f₁ f₂ h₁ h₂).symm = equivOfInverse' f₂ f₁ h₂ h₁ :=
rfl

theorem eq_comp_toContinuousLinearMap_symm (e₁₂ : M₁ ≃SL[σ₁₂] M₂) [RingHomCompTriple σ₂₁ σ₁₃ σ₂₃]
(f : M₂ →SL[σ₂₃] M₃) (g : M₁ →SL[σ₁₃] M₃) :
f = g.comp e₁₂.symm.toContinuousLinearMap ↔ f.comp e₁₂.toContinuousLinearMap = g := by
aesop

variable (M₁)

/-- The continuous linear equivalences from `M` to itself form a group under composition. -/
instance automorphismGroup : Group (M₁ ≃L[R₁] M₁) where
mul f g := g.trans f
one := ContinuousLinearEquiv.refl R₁ M₁
inv f := f.symm
mul_assoc f g h := by
ext
rfl
mul_one f := by
ext
rfl
one_mul f := by
ext
rfl
inv_mul_cancel f := by
ext x
exact f.left_inv x
mul_assoc f g h := rfl
mul_one f := rfl
one_mul f := rfl
inv_mul_cancel f := ext <| funext fun _ ↦ f.left_inv _

variable {M₁} {R₄ : Type*} [Semiring R₄] [Module R₄ M₄] {σ₃₄ : R₃ →+* R₄} {σ₄₃ : R₄ →+* R₃}
[RingHomInvPair σ₃₄ σ₄₃] [RingHomInvPair σ₄₃ σ₃₄] {σ₂₄ : R₂ →+* R₄} {σ₁₄ : R₁ →+* R₄}
Expand Down
27 changes: 27 additions & 0 deletions Mathlib/Topology/Algebra/Module/StrongTopology.lean
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Authors: Anatole Dedecker, Yury Kudryashov
-/
module

public import Mathlib.Topology.Algebra.Algebra.Equiv
public import Mathlib.Topology.Algebra.Module.Equiv
public import Mathlib.Topology.Algebra.Module.UniformConvergence
public import Mathlib.Topology.Algebra.SeparationQuotient.Section
Expand Down Expand Up @@ -801,6 +802,32 @@ def arrowCongr (e₁ : E ≃L[𝕜] F) (e₂ : H ≃L[𝕜] G) : (E →L[𝕜] H
@[simp] lemma arrowCongr_symm (e₁ : E ≃L[𝕜] F) (e₂ : H ≃L[𝕜] G) :
(e₁.arrowCongr e₂).symm = e₁.symm.arrowCongr e₂.symm := rfl

/-- A continuous linear equivalence of two spaces induces a continuous equivalence of algebras of
their endomorphisms. -/
def conjContinuousAlgEquiv (e : G ≃L[𝕜] H) : (G →L[𝕜] G) ≃A[𝕜] (H →L[𝕜] H) :=
{ e.arrowCongr e with
map_mul' _ _ := by ext; simp
commutes' _ := by ext; simp }

@[simp] theorem conjContinuousAlgEquiv_apply_apply (e : G ≃L[𝕜] H) (f : G →L[𝕜] G) (x : H) :
e.conjContinuousAlgEquiv f x = e (f (e.symm x)) := rfl

theorem symm_conjContinuousAlgEquiv_apply_apply (e : G ≃L[𝕜] H) (f : H →L[𝕜] H) (x : G) :
e.conjContinuousAlgEquiv.symm f x = e.symm (f (e x)) := rfl
Comment thread
themathqueen marked this conversation as resolved.

theorem conjContinuousAlgEquiv_apply (e : G ≃L[𝕜] H) (f : G →L[𝕜] G) :
e.conjContinuousAlgEquiv f = e ∘L f ∘L e.symm := rfl

@[simp] theorem symm_conjContinuousAlgEquiv (e : G ≃L[𝕜] H) :
e.conjContinuousAlgEquiv.symm = e.symm.conjContinuousAlgEquiv := rfl

@[simp] theorem conjContinuousAlgEquiv_refl : conjContinuousAlgEquiv (.refl 𝕜 G) = .refl 𝕜 _ := rfl

theorem conjContinuousAlgEquiv_trans [IsTopologicalAddGroup E] [ContinuousConstSMul 𝕜 E]
(e : E ≃L[𝕜] G) (f : G ≃L[𝕜] H) :
(e.trans f).conjContinuousAlgEquiv = e.conjContinuousAlgEquiv.trans f.conjContinuousAlgEquiv :=
rfl

end Linear

end ContinuousLinearEquiv
Expand Down