|
| 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