Skip to content

Commit 95092b2

Browse files
committed
feat: port Analysis.NormedSpace.Star.GelfandDuality (#4972)
1 parent fe6b4e5 commit 95092b2

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ import Mathlib.Analysis.NormedSpace.RieszLemma
655655
import Mathlib.Analysis.NormedSpace.Spectrum
656656
import Mathlib.Analysis.NormedSpace.Star.Basic
657657
import Mathlib.Analysis.NormedSpace.Star.Exponential
658+
import Mathlib.Analysis.NormedSpace.Star.GelfandDuality
658659
import Mathlib.Analysis.NormedSpace.Star.Mul
659660
import Mathlib.Analysis.NormedSpace.Star.Multiplier
660661
import Mathlib.Analysis.NormedSpace.Star.Spectrum
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
/-
2+
Copyright (c) 2022 Jireh Loreaux. All rights reserved.
3+
Reeased under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jireh Loreaux
5+
6+
! This file was ported from Lean 3 source module analysis.normed_space.star.gelfand_duality
7+
! leanprover-community/mathlib commit e65771194f9e923a70dfb49b6ca7be6e400d8b6f
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Analysis.NormedSpace.Star.Spectrum
12+
import Mathlib.Analysis.Normed.Group.Quotient
13+
import Mathlib.Analysis.NormedSpace.Algebra
14+
import Mathlib.Topology.ContinuousFunction.Units
15+
import Mathlib.Topology.ContinuousFunction.Compact
16+
import Mathlib.Topology.Algebra.Algebra
17+
import Mathlib.Topology.ContinuousFunction.StoneWeierstrass
18+
19+
/-!
20+
# Gelfand Duality
21+
22+
The `gelfandTransform` is an algebra homomorphism from a topological `𝕜`-algebra `A` to
23+
`C(character_space 𝕜 A, 𝕜)`. In the case where `A` is a commutative complex Banach algebra, then
24+
the Gelfand transform is actually spectrum-preserving (`spectrum.gelfandTransform_eq`). Moreover,
25+
when `A` is a commutative C⋆-algebra over `ℂ`, then the Gelfand transform is a surjective isometry,
26+
and even an equivalence between C⋆-algebras.
27+
28+
## Main definitions
29+
30+
* `Ideal.toCharacterSpace` : constructs an element of the character space from a maximal ideal in
31+
a commutative complex Banach algebra
32+
* `WeakDual.CharacterSpace.compContinuousMap`: The functorial map taking `ψ : A →⋆ₐ[ℂ] B` to a
33+
continuous function `characterSpace ℂ B → characterSpace ℂ A` given by pre-composition with `ψ`.
34+
35+
## Main statements
36+
37+
* `spectrum.gelfandTransform_eq` : the Gelfand transform is spectrum-preserving when the algebra is
38+
a commutative complex Banach algebra.
39+
* `gelfandTransform_isometry` : the Gelfand transform is an isometry when the algebra is a
40+
commutative (unital) C⋆-algebra over `ℂ`.
41+
* `gelfandTransform_bijective` : the Gelfand transform is bijective when the algebra is a
42+
commutative (unital) C⋆-algebra over `ℂ`.
43+
44+
## TODO
45+
46+
* After `StarAlgEquiv` is defined, realize `gelfandTransform` as a `StarAlgEquiv`.
47+
* Prove that if `A` is the unital C⋆-algebra over `ℂ` generated by a fixed normal element `x` in
48+
a larger C⋆-algebra `B`, then `characterSpace ℂ A` is homeomorphic to `spectrum ℂ x`.
49+
* From the previous result, construct the **continuous functional calculus**.
50+
* Show that if `X` is a compact Hausdorff space, then `X` is (canonically) homeomorphic to
51+
`characterSpace ℂ C(X, ℂ)`.
52+
* Conclude using the previous fact that the functors `C(⬝, ℂ)` and `characterSpace ℂ ⬝` along with
53+
the canonical homeomorphisms described above constitute a natural contravariant equivalence of
54+
the categories of compact Hausdorff spaces (with continuous maps) and commutative unital
55+
C⋆-algebras (with unital ⋆-algebra homomoprhisms); this is known as **Gelfand duality**.
56+
57+
## Tags
58+
59+
Gelfand transform, character space, C⋆-algebra
60+
-/
61+
62+
63+
open WeakDual
64+
65+
open scoped NNReal
66+
67+
section ComplexBanachAlgebra
68+
69+
open Ideal
70+
71+
variable {A : Type _} [NormedCommRing A] [NormedAlgebra ℂ A] [CompleteSpace A] (I : Ideal A)
72+
[Ideal.IsMaximal I]
73+
74+
/-- Every maximal ideal in a commutative complex Banach algebra gives rise to a character on that
75+
algebra. In particular, the character, which may be identified as an algebra homomorphism due to
76+
`WeakDual.CharacterSpace.equivAlgHom`, is given by the composition of the quotient map and
77+
the Gelfand-Mazur isomorphism `NormedRing.algEquivComplexOfComplete`. -/
78+
noncomputable def Ideal.toCharacterSpace : characterSpace ℂ A :=
79+
CharacterSpace.equivAlgHom.symm <|
80+
((NormedRing.algEquivComplexOfComplete
81+
(letI := Quotient.field I; isUnit_iff_ne_zero (G₀ := A ⧸ I))).symm : A ⧸ I →ₐ[ℂ] ℂ).comp <|
82+
Quotient.mkₐ ℂ I
83+
#align ideal.to_character_space Ideal.toCharacterSpace
84+
85+
theorem Ideal.toCharacterSpace_apply_eq_zero_of_mem {a : A} (ha : a ∈ I) :
86+
I.toCharacterSpace a = 0 := by
87+
unfold Ideal.toCharacterSpace
88+
simp only [CharacterSpace.equivAlgHom_symm_coe, AlgHom.coe_comp, AlgHom.coe_coe,
89+
Quotient.mkₐ_eq_mk, Function.comp_apply, NormedRing.algEquivComplexOfComplete_symm_apply]
90+
simp_rw [Quotient.eq_zero_iff_mem.mpr ha, spectrum.zero_eq]
91+
exact Set.eq_of_mem_singleton (Set.singleton_nonempty (0 : ℂ)).some_mem
92+
#align ideal.to_character_space_apply_eq_zero_of_mem Ideal.toCharacterSpace_apply_eq_zero_of_mem
93+
94+
/-- If `a : A` is not a unit, then some character takes the value zero at `a`. This is equivlaent
95+
to `gelfandTransform ℂ A a` takes the value zero at some character. -/
96+
theorem WeakDual.CharacterSpace.exists_apply_eq_zero {a : A} (ha : ¬IsUnit a) :
97+
∃ f : characterSpace ℂ A, f a = 0 := by
98+
obtain ⟨M, hM, haM⟩ := (span {a}).exists_le_maximal (span_singleton_ne_top ha)
99+
exact
100+
⟨M.toCharacterSpace,
101+
M.toCharacterSpace_apply_eq_zero_of_mem
102+
(haM (mem_span_singleton.mpr ⟨1, (mul_one a).symm⟩))⟩
103+
#align weak_dual.character_space.exists_apply_eq_zero WeakDual.CharacterSpace.exists_apply_eq_zero
104+
105+
theorem WeakDual.CharacterSpace.mem_spectrum_iff_exists {a : A} {z : ℂ} :
106+
z ∈ spectrum ℂ a ↔ ∃ f : characterSpace ℂ A, f a = z := by
107+
refine' ⟨fun hz => _, _⟩
108+
· obtain ⟨f, hf⟩ := WeakDual.CharacterSpace.exists_apply_eq_zero hz
109+
simp only [map_sub, sub_eq_zero, AlgHomClass.commutes, Algebra.id.map_eq_id,
110+
RingHom.id_apply] at hf
111+
refine ⟨f, ?_⟩
112+
rw [AlgHomClass.commutes, Algebra.id.map_eq_id, RingHom.id_apply] at hf
113+
exact hf.symm
114+
· rintro ⟨f, rfl⟩
115+
exact AlgHom.apply_mem_spectrum f a
116+
#align weak_dual.character_space.mem_spectrum_iff_exists WeakDual.CharacterSpace.mem_spectrum_iff_exists
117+
118+
/-- The Gelfand transform is spectrum-preserving. -/
119+
theorem spectrum.gelfandTransform_eq (a : A) :
120+
spectrum ℂ (gelfandTransform ℂ A a) = spectrum ℂ a := by
121+
ext z
122+
rw [ContinuousMap.spectrum_eq_range, WeakDual.CharacterSpace.mem_spectrum_iff_exists]
123+
exact Iff.rfl
124+
#align spectrum.gelfand_transform_eq spectrum.gelfandTransform_eq
125+
126+
instance [Nontrivial A] : Nonempty (characterSpace ℂ A) :=
127+
⟨Classical.choose <|
128+
WeakDual.CharacterSpace.exists_apply_eq_zero <| zero_mem_nonunits.2 zero_ne_one⟩
129+
130+
end ComplexBanachAlgebra
131+
132+
section ComplexCstarAlgebra
133+
134+
variable {A : Type _} [NormedCommRing A] [NormedAlgebra ℂ A] [CompleteSpace A]
135+
136+
variable [StarRing A] [CstarRing A] [StarModule ℂ A]
137+
138+
theorem gelfandTransform_map_star (a : A) :
139+
gelfandTransform ℂ A (star a) = star (gelfandTransform ℂ A a) :=
140+
ContinuousMap.ext fun φ => map_star φ a
141+
#align gelfand_transform_map_star gelfandTransform_map_star
142+
143+
variable (A)
144+
145+
/-- The Gelfand transform is an isometry when the algebra is a C⋆-algebra over `ℂ`. -/
146+
theorem gelfandTransform_isometry : Isometry (gelfandTransform ℂ A) := by
147+
nontriviality A
148+
refine' AddMonoidHomClass.isometry_of_norm (gelfandTransform ℂ A) fun a => _
149+
/- By `spectrum.gelfandTransform_eq`, the spectra of `star a * a` and its
150+
`gelfandTransform` coincide. Therefore, so do their spectral radii, and since they are
151+
self-adjoint, so also do their norms. Applying the C⋆-property of the norm and taking square
152+
roots shows that the norm is preserved. -/
153+
have : spectralRadius ℂ (gelfandTransform ℂ A (star a * a)) = spectralRadius ℂ (star a * a) := by
154+
unfold spectralRadius; rw [spectrum.gelfandTransform_eq]
155+
rw [map_mul, (IsSelfAdjoint.star_mul_self _).spectralRadius_eq_nnnorm, gelfandTransform_map_star,
156+
(IsSelfAdjoint.star_mul_self (gelfandTransform ℂ A a)).spectralRadius_eq_nnnorm] at this
157+
simp only [ENNReal.coe_eq_coe, CstarRing.nnnorm_star_mul_self, ← sq] at this
158+
simpa only [Function.comp_apply, NNReal.sqrt_sq] using
159+
congr_arg (((↑) : ℝ≥0 → ℝ) ∘ ⇑NNReal.sqrt) this
160+
#align gelfand_transform_isometry gelfandTransform_isometry
161+
162+
/-- The Gelfand transform is bijective when the algebra is a C⋆-algebra over `ℂ`. -/
163+
theorem gelfandTransform_bijective : Function.Bijective (gelfandTransform ℂ A) := by
164+
refine' ⟨(gelfandTransform_isometry A).injective, _⟩
165+
suffices (gelfandTransform ℂ A).range = ⊤ by
166+
exact fun x => ((gelfandTransform ℂ A).mem_range).mp (this.symm ▸ Algebra.mem_top)
167+
/- Because the `gelfandTransform ℂ A` is an isometry, it has closed range, and so by the
168+
Stone-Weierstrass theorem, it suffices to show that the image of the Gelfand transform separates
169+
points in `C(characterSpace ℂ A, ℂ)` and is closed under `star`. -/
170+
have h : (gelfandTransform ℂ A).range.topologicalClosure = (gelfandTransform ℂ A).range :=
171+
le_antisymm
172+
(Subalgebra.topologicalClosure_minimal _ le_rfl
173+
(gelfandTransform_isometry A).closedEmbedding.closed_range)
174+
(Subalgebra.le_topologicalClosure _)
175+
refine' h ▸ ContinuousMap.subalgebra_isROrC_topologicalClosure_eq_top_of_separatesPoints
176+
_ (fun _ _ => _) fun f hf => _
177+
/- Separating points just means that elements of the `characterSpace` which agree at all points
178+
of `A` are the same functional, which is just extensionality. -/
179+
· contrapose!
180+
exact fun h => Subtype.ext (ContinuousLinearMap.ext fun a =>
181+
h (gelfandTransform ℂ A a) ⟨gelfandTransform ℂ A a, ⟨a, rfl⟩, rfl⟩)
182+
/- If `f = gelfandTransform ℂ A a`, then `star f` is also in the range of `gelfandTransform ℂ A`
183+
using the argument `star a`. The key lemma below may be hard to spot; it's `map_star` coming
184+
from `WeakDual.Complex.instStarHomClass`, which is a nontrivial result. -/
185+
· obtain ⟨f, ⟨a, rfl⟩, rfl⟩ := Subalgebra.mem_map.mp hf
186+
refine' ⟨star a, ContinuousMap.ext fun ψ => _⟩
187+
simp only [AlgHom.toRingHom_eq_coe, RingHom.coe_coe, gelfandTransform_apply_apply,
188+
AlgEquiv.toAlgHom_eq_coe, AlgHom.compLeftContinuous_apply_apply, AlgHom.coe_coe,
189+
IsROrC.conjAe_coe, map_star, starRingEnd_apply]
190+
#align gelfand_transform_bijective gelfandTransform_bijective
191+
192+
/-- The Gelfand transform as a `StarAlgEquiv` between a commutative unital C⋆-algebra over `ℂ`
193+
and the continuous functions on its `characterSpace`. -/
194+
@[simps!]
195+
noncomputable def gelfandStarTransform : A ≃⋆ₐ[ℂ] C(characterSpace ℂ A, ℂ) :=
196+
StarAlgEquiv.ofBijective
197+
(show A →⋆ₐ[ℂ] C(characterSpace ℂ A, ℂ) from
198+
{ gelfandTransform ℂ A with map_star' := fun x => gelfandTransform_map_star x })
199+
(gelfandTransform_bijective A)
200+
#align gelfand_star_transform gelfandStarTransform
201+
202+
end ComplexCstarAlgebra
203+
204+
section Functoriality
205+
206+
namespace WeakDual
207+
208+
namespace CharacterSpace
209+
210+
variable {A B C : Type _}
211+
212+
variable [NormedRing A] [NormedAlgebra ℂ A] [CompleteSpace A] [StarRing A]
213+
214+
variable [NormedRing B] [NormedAlgebra ℂ B] [CompleteSpace B] [StarRing B]
215+
216+
variable [NormedRing C] [NormedAlgebra ℂ C] [CompleteSpace C] [StarRing C]
217+
218+
/-- The functorial map taking `ψ : A →⋆ₐ[ℂ] B` to a continuous function
219+
`characterSpace ℂ B → characterSpace ℂ A` obtained by pre-composition with `ψ`. -/
220+
@[simps]
221+
noncomputable def compContinuousMap (ψ : A →⋆ₐ[ℂ] B) : C(characterSpace ℂ B, characterSpace ℂ A)
222+
where
223+
toFun φ := equivAlgHom.symm ((equivAlgHom φ).comp ψ.toAlgHom)
224+
continuous_toFun :=
225+
Continuous.subtype_mk
226+
(continuous_of_continuous_eval fun a => map_continuous <| gelfandTransform ℂ B (ψ a)) _
227+
#align weak_dual.character_space.comp_continuous_map WeakDual.CharacterSpace.compContinuousMap
228+
229+
variable (A)
230+
231+
/-- `WeakDual.CharacterSpace.compContinuousMap` sends the identity to the identity. -/
232+
@[simp]
233+
theorem compContinuousMap_id :
234+
compContinuousMap (StarAlgHom.id ℂ A) = ContinuousMap.id (characterSpace ℂ A) :=
235+
ContinuousMap.ext fun _a => ext fun _x => rfl
236+
#align weak_dual.character_space.comp_continuous_map_id WeakDual.CharacterSpace.compContinuousMap_id
237+
238+
variable {A}
239+
240+
/-- `WeakDual.CharacterSpace.compContinuousMap` is functorial. -/
241+
@[simp]
242+
theorem compContinuousMap_comp (ψ₂ : B →⋆ₐ[ℂ] C) (ψ₁ : A →⋆ₐ[ℂ] B) :
243+
compContinuousMap (ψ₂.comp ψ₁) = (compContinuousMap ψ₁).comp (compContinuousMap ψ₂) :=
244+
ContinuousMap.ext fun _a => ext fun _x => rfl
245+
#align weak_dual.character_space.comp_continuous_map_comp WeakDual.CharacterSpace.compContinuousMap_comp
246+
247+
end CharacterSpace
248+
249+
end WeakDual
250+
251+
end Functoriality

0 commit comments

Comments
 (0)