Skip to content
Open
84 changes: 84 additions & 0 deletions Mathlib/Analysis/CStarAlgebra/GelfandDuality.lean
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ end ComplexBanachAlgebra

section ComplexCStarAlgebra

section Commutative

variable {A : Type*} [CommCStarAlgebra A]

theorem gelfandTransform_map_star (a : A) :
Expand Down Expand Up @@ -193,6 +195,88 @@ noncomputable def gelfandStarTransform : A ≃⋆ₐ[ℂ] C(characterSpace ℂ A
{ gelfandTransform ℂ A with map_star' := fun x => gelfandTransform_map_star x })
(gelfandTransform_bijective A)

end Commutative

section NonUnitalComm

variable {A : Type*} [NonUnitalCommCStarAlgebra A]

open scoped CStarAlgebra in
open Unitization in
lemma CommCStarAlgebra.norm_add_eq_max {a b : A} (h : a * b = 0) :
‖a + b‖ = max ‖a‖ ‖b‖ := by
let f := gelfandStarTransform A⁺¹ ∘ inrNonUnitalAlgHom ℂ A
have hf : Isometry f := gelfandTransform_isometry _ |>.comp isometry_inr
simp_rw [← hf.norm_map_of_map_zero (by simp [f]), show f (a + b) = f a + f b by simp [f]]
exact ContinuousMap.norm_add_eq_max <| by simpa [f] using congr(f $h)

lemma CommCStarAlgebra.nnnorm_add_eq_max {a b : A} (h : a * b = 0) :
‖a + b‖₊ = max ‖a‖₊ ‖b‖₊ :=
NNReal.eq <| CommCStarAlgebra.norm_add_eq_max h

lemma CommCStarAlgebra.norm_sub_eq_max {a b : A} (h : a * b = 0) :
‖a - b‖ = max ‖a‖ ‖b‖ := by
simpa [sub_eq_add_neg] using norm_add_eq_max (a := a) (b := -b) (by simpa)

lemma CommCStarAlgebra.nnnorm_sub_eq_max {a b : A} (h : a * b = 0) :
‖a - b‖₊ = max ‖a‖₊ ‖b‖₊ :=
NNReal.eq <| norm_sub_eq_max h

end NonUnitalComm

section NonUnital

variable {A : Type*} [NonUnitalCStarAlgebra A]

open NonUnitalStarAlgebra in
lemma IsSelfAdjoint.norm_add_eq_max {a b : A} (hab : a * b = 0)
(ha : IsSelfAdjoint a) (hb : IsSelfAdjoint b) :
‖a + b‖ = max ‖a‖ ‖b‖ := by
let S : NonUnitalStarSubalgebra ℂ A := (adjoin ℂ {a, b}).topologicalClosure
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment in the proof to explain the strategy might be helpful, "we show that the closed subalgebra generated by a and b is commutative and apply CommCStarAlgebra.norm_add_eq_max to this subalgebra" or something.

(By the way: I was slightly puzzled that this statement does not actually imply the commutative version, because you have IsSelfAdjoint. Perhaps one could split up the argument here into two lemmas, one assuming instead that a, b are normal and a * b = b * a = 0 – which would then imply the commutative lemma – and then showing separately that if a, b are selfadjoint then it suffices to assume just a * b = 0. Just a suggestion, I'm no expert in this theory so I can't really judge whether this additional generality is useful.)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@loefflerd thanks for the review! I have added a brief explanation.

Indeed, this does not imply the commutative version. The reason I didn't originally state it for IsStarNormal is that you need two commuting hypotheses (Commute a b and Commute a (star b)), and moreover, the IsSelfAdjoint version is the one that almost always appears in practice.

That being said, it's not unreasonable to have the IsStarNormal variants, so I have added them (except the Finset.sum version; at that point, I claim the user should just move to the commutative C⋆-subalgebra and work there, because the hypotheses get rather unwieldy). I have also added the lemma that selfadjoint elements whose product is zero commute, and then use it to prove the selfadjoint versions from the normal versions. This could of course generalize a bit further (e.g., selfadjoint elements whose product is selfadjoint and lies in the center of the algebra commute, but that's a rather uncommon scenario), but we opt not to add that since it isn't as useful.

Copy link
Copy Markdown
Contributor

@loefflerd loefflerd Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I didn't originally state it for IsStarNormal is that you need two commuting hypotheses (Commute a b and Commute a (star b)),

Doesn't the second Commute hypothesis follow from first by the Fuglede-Putnam theorem? (Maybe mathlib doesn't have this yet though.)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, we don't have it. I think we may have all the tools necessary though. I'll look into it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, I have a proof of Fuglede–Putnam–Rosenblum now. I'll create a PR for that first.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great! The statement of Fuglede–Putnam is pretty much the sole thing I remember from the Banach Algebras course I took decades ago as a masters student, so it's nice to see it make its way into mathlib :-)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

have hS : IsClosed (S : Set A) := (adjoin ℂ {a, b}).isClosed_topologicalClosure
have hab' : a * b = b * a := by
rw [hab, eq_comm]; simpa [ha.star_eq, hb.star_eq] using congr(star $hab)
let _ : NonUnitalCommRing (adjoin ℂ {a, b}) :=
adjoinNonUnitalCommRingOfComm ℂ (by grind) (by grind [IsSelfAdjoint.star_eq])
let _ : NonUnitalCommRing S := (adjoin ℂ {a, b}).nonUnitalCommRingTopologicalClosure mul_comm
let _ : NonUnitalCommCStarAlgebra S := { }
let c : S := ⟨a, subset_closure <| subset_adjoin _ _ <| by grind⟩
let d : S := ⟨b, subset_closure <| subset_adjoin _ _ <| by grind⟩
exact CommCStarAlgebra.norm_add_eq_max (a := c) (b := d) (by ext; simpa)

lemma IsSelfAdjoint.nnnorm_add_eq_max {a b : A} (hab : a * b = 0)
(ha : IsSelfAdjoint a) (hb : IsSelfAdjoint b) :
‖a + b‖₊ = max ‖a‖₊ ‖b‖₊ :=
NNReal.eq <| IsSelfAdjoint.norm_add_eq_max hab ha hb

lemma IsSelfAdjoint.norm_sub_eq_max {a b : A} (hab : a * b = 0)
(ha : IsSelfAdjoint a) (hb : IsSelfAdjoint b) :
‖a - b‖ = max ‖a‖ ‖b‖ := by
simpa [sub_eq_add_neg] using ha.norm_add_eq_max (by simpa) hb.neg

lemma IsSelfAdjoint.nnnorm_sub_eq_max {a b : A} (hab : a * b = 0)
(ha : IsSelfAdjoint a) (hb : IsSelfAdjoint b) :
‖a - b‖₊ = max ‖a‖₊ ‖b‖₊ :=
NNReal.eq <| IsSelfAdjoint.norm_sub_eq_max hab ha hb

attribute [aesop safe apply (rule_sets := [CStarAlgebra])] isSelfAdjoint_sum

open scoped Function in
lemma IsSelfAdjoint.nnnorm_sum_eq_sup {ι : Type*} {f : ι → A} (s : Finset ι)
(h0 : Pairwise ((· * · = 0) on f)) (h : ∀ i ∈ s, IsSelfAdjoint (f i)) :
‖∑ i ∈ s, f i‖₊ = s.sup (‖f ·‖₊) := by
classical
induction s using Finset.induction with
| empty => simp
| insert j s hj ih =>
suffices f j * ∑ i ∈ s, f i = 0 by
simp_all only [Finset.mem_insert, or_true, implies_true, forall_const, forall_eq_or_imp,
not_false_eq_true, Finset.sum_insert, Finset.sup_insert]
simpa [← ih] using h.1.nnnorm_add_eq_max this (by cfc_tac)
simpa [Finset.mul_sum] using Finset.sum_eq_zero fun i hi ↦ h0 (by grind)

end NonUnital

end ComplexCStarAlgebra

section Functoriality
Expand Down
Loading