Skip to content

Commit f1a20a0

Browse files
committed
feat(CstarRing): weaken the definition of CstarRing from an equality to an inequality (#14737)
This PR weakens the definition of `CstarRing` from `‖x⋆ * x‖ = ‖x‖ * ‖x‖` to `‖x‖ * ‖x‖ ≤ ‖x⋆ * x‖`. The "weaker" condition is then shown to be equivalent to the original one.
1 parent f6d581b commit f1a20a0

File tree

11 files changed

+50
-72
lines changed

11 files changed

+50
-72
lines changed

Mathlib/Analysis/InnerProductSpace/Adjoint.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ theorem norm_adjoint_comp_self (A : E →L[𝕜] F) :
240240
Real.sqrt_mul_self (norm_nonneg x)]
241241

242242
instance : CstarRing (E →L[𝕜] E) where
243-
norm_star_mul_self := norm_adjoint_comp_self _
243+
norm_mul_self_le x := le_of_eq <| Eq.symm <| norm_adjoint_comp_self x
244244

245245
theorem isAdjointPair_inner (A : E →L[𝕜] F) :
246246
LinearMap.IsAdjointPair (sesqFormOfInner : E →ₗ[𝕜] E →ₗ⋆[𝕜] 𝕜)

Mathlib/Analysis/NormedSpace/Star/Basic.lean

+26-26
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import Mathlib.Topology.Algebra.Module.Star
1919
A normed star group is a normed group with a compatible `star` which is isometric.
2020
2121
A C⋆-ring is a normed star group that is also a ring and that verifies the stronger
22-
condition `‖x⋆ * x‖ = ‖x‖^2` for all `x`. If a C⋆-ring is also a star algebra, then it is a
23-
C⋆-algebra.
22+
condition `‖x‖^2 ≤ ‖x⋆ * x‖` for all `x` (which actually implies equality). If a C⋆-ring is also
23+
a star algebra, then it is a C⋆-algebra.
2424
2525
To get a C⋆-algebra `E` over field `𝕜`, use
2626
`[NormedField 𝕜] [StarRing 𝕜] [NormedRing E] [StarRing E] [CstarRing E]
@@ -79,13 +79,16 @@ instance RingHomIsometric.starRingEnd [NormedCommRing E] [StarRing E] [NormedSta
7979
⟨@norm_star _ _ _ _⟩
8080
#align ring_hom_isometric.star_ring_end RingHomIsometric.starRingEnd
8181

82-
/-- A C*-ring is a normed star ring that satisfies the stronger condition `‖x⋆ * x‖ = ‖x‖^2`
83-
for every `x`. -/
82+
/-- A C*-ring is a normed star ring that satisfies the stronger condition `‖x‖ ^ 2 ≤ ‖x⋆ * x‖`
83+
for every `x`. Note that this condition actually implies equality, as is shown in
84+
`norm_star_mul_self` below. -/
8485
class CstarRing (E : Type*) [NonUnitalNormedRing E] [StarRing E] : Prop where
85-
norm_star_mul_self : ∀ {x : E}, ‖x * x‖ = ‖x * x‖
86+
norm_mul_self_le : ∀ x : E, ‖x * x‖ ‖x * x‖
8687
#align cstar_ring CstarRing
8788

88-
instance : CstarRing ℝ where norm_star_mul_self {x} := by simp only [star, id, norm_mul]
89+
instance : CstarRing ℝ where
90+
norm_mul_self_le x := by
91+
simp only [Real.norm_eq_abs, abs_mul_abs_self, star, id, norm_mul, le_refl]
8992

9093
namespace CstarRing
9194

@@ -101,19 +104,19 @@ instance (priority := 100) to_normedStarGroup : NormedStarGroup E :=
101104
by_cases htriv : x = 0
102105
· simp only [htriv, star_zero]
103106
· have hnt : 0 < ‖x‖ := norm_pos_iff.mpr htriv
104-
have hnt_star : 0 < ‖x⋆‖ :=
105-
norm_pos_iff.mpr ((AddEquiv.map_ne_zero_iff starAddEquiv (M := E)).mpr htriv)
106-
have h₁ :=
107-
calc
108-
‖x‖ * ‖x‖ = ‖x⋆ * x‖ := norm_star_mul_self.symm
109-
_ ≤ ‖x⋆‖ * ‖x‖ := norm_mul_le _ _
110-
have h₂ :=
111-
calc
112-
‖x⋆‖ * ‖x⋆‖ = ‖x * x⋆‖ := by rw [← norm_star_mul_self, star_star]
113-
_ ≤ ‖x‖ * ‖x⋆‖ := norm_mul_le _ _
114-
exact le_antisymm (le_of_mul_le_mul_right h₂ hnt_star) (le_of_mul_le_mul_right h₁ hnt)⟩
107+
have h₁ : ∀ z : E, ‖z⋆ * z‖ ≤ ‖z⋆‖ * ‖z‖ := fun z => norm_mul_le z⋆ z
108+
have h₂ : ∀ z : E, 0 < ‖z‖ → ‖z‖ ≤ ‖z⋆‖ := fun z hz => by
109+
rw [← mul_le_mul_right hz]; exact (CstarRing.norm_mul_self_le z).trans (h₁ z)
110+
have h₃ : ‖x⋆‖ ≤ ‖x‖ := by
111+
conv_rhs => rw [← star_star x]
112+
exact h₂ x⋆ (gt_of_ge_of_gt (h₂ x hnt) hnt)
113+
exact le_antisymm h₃ (h₂ x hnt)⟩
115114
#align cstar_ring.to_normed_star_group CstarRing.to_normedStarGroup
116115

116+
theorem norm_star_mul_self {x : E} : ‖x⋆ * x‖ = ‖x‖ * ‖x‖ :=
117+
le_antisymm ((norm_mul_le _ _).trans (by rw [norm_star])) (CstarRing.norm_mul_self_le x)
118+
#align cstar_ring.norm_star_mul_self CstarRing.norm_star_mul_self
119+
117120
theorem norm_self_mul_star {x : E} : ‖x * x⋆‖ = ‖x‖ * ‖x‖ := by
118121
nth_rw 1 [← star_star x]
119122
simp only [norm_star_mul_self, norm_star]
@@ -167,19 +170,16 @@ instance _root_.Pi.starRing' : StarRing (∀ i, R i) :=
167170
variable [Fintype ι] [∀ i, CstarRing (R i)]
168171

169172
instance _root_.Prod.cstarRing : CstarRing (R₁ × R₂) where
170-
norm_star_mul_self {x} := by
173+
norm_mul_self_le x := by
171174
dsimp only [norm]
172175
simp only [Prod.fst_mul, Prod.fst_star, Prod.snd_mul, Prod.snd_star, norm_star_mul_self, ← sq]
173-
refine le_antisymm ?_ ?_
174-
· refine max_le ?_ ?_ <;> rw [sq_le_sq, abs_of_nonneg (norm_nonneg _)]
175-
· exact (le_max_left _ _).trans (le_abs_self _)
176-
· exact (le_max_right _ _).trans (le_abs_self _)
177-
· rw [le_sup_iff]
178-
rcases le_total ‖x.fst‖ ‖x.snd‖ with (h | h) <;> simp [h]
176+
rw [le_sup_iff]
177+
rcases le_total ‖x.fst‖ ‖x.snd‖ with (h | h) <;> simp [h]
179178
#align prod.cstar_ring Prod.cstarRing
180179

181180
instance _root_.Pi.cstarRing : CstarRing (∀ i, R i) where
182-
norm_star_mul_self {x} := by
181+
norm_mul_self_le x := by
182+
refine le_of_eq (Eq.symm ?_)
183183
simp only [norm, Pi.mul_apply, Pi.star_apply, nnnorm_star_mul_self, ← sq]
184184
norm_cast
185185
exact
@@ -315,7 +315,7 @@ instance toNormedAlgebra {𝕜 A : Type*} [NormedField 𝕜] [StarRing 𝕜] [Se
315315

316316
instance to_cstarRing {R A} [CommRing R] [StarRing R] [NormedRing A] [StarRing A] [CstarRing A]
317317
[Algebra R A] [StarModule R A] (S : StarSubalgebra R A) : CstarRing S where
318-
norm_star_mul_self {x} := @CstarRing.norm_star_mul_self A _ _ _ x
318+
norm_mul_self_le x := @CstarRing.norm_mul_self_le A _ _ _ x
319319
#align star_subalgebra.to_cstar_ring StarSubalgebra.to_cstarRing
320320

321321
end StarSubalgebra

Mathlib/Analysis/NormedSpace/Star/Matrix.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ scoped[Matrix.L2OpNorm] attribute [instance] Matrix.instL2OpNormedAlgebra
272272
/-- The operator norm on `Matrix n n 𝕜` given by the identification with (continuous) linear
273273
endmorphisms of `EuclideanSpace 𝕜 n` makes it into a `L2OpRing`. -/
274274
lemma instCstarRing : CstarRing (Matrix n n 𝕜) where
275-
norm_star_mul_self := l2_opNorm_conjTranspose_mul_self _
275+
norm_mul_self_le M := le_of_eq <| Eq.symm <| l2_opNorm_conjTranspose_mul_self M
276276

277277
scoped[Matrix.L2OpNorm] attribute [instance] Matrix.instCstarRing
278278

Mathlib/Analysis/NormedSpace/Star/Multiplier.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ variable [NonUnitalNormedRing A] [StarRing A] [CstarRing A]
673673
variable [NormedSpace 𝕜 A] [SMulCommClass 𝕜 A A] [IsScalarTower 𝕜 A A] [StarModule 𝕜 A]
674674

675675
instance instCstarRing : CstarRing 𝓜(𝕜, A) where
676-
norm_star_mul_self := @fun (a : 𝓜(𝕜, A)) => congr_arg ((↑) : ℝ≥0 → ℝ) <|
676+
norm_mul_self_le := fun (a : 𝓜(𝕜, A)) => le_of_eq <| Eq.symm <| congr_arg ((↑) : ℝ≥0 → ℝ) <|
677677
show ‖star a * a‖₊ = ‖a‖₊ * ‖a‖₊ by
678678
/- The essence of the argument is this: let `a = (L,R)` and recall `‖a‖ = ‖L‖`.
679679
`star a = (star ∘ R ∘ star, star ∘ L ∘ star)`. Then for any `x y : A`, we have

Mathlib/Analysis/NormedSpace/Star/Unitization.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ variable {𝕜}
127127

128128
/-- The norm on `Unitization 𝕜 E` satisfies the C⋆-property -/
129129
instance Unitization.instCstarRing : CstarRing (Unitization 𝕜 E) where
130-
norm_star_mul_self {x} := by
130+
norm_mul_self_le x := by
131131
-- rewrite both sides as a `⊔`
132132
simp only [Unitization.norm_def, Prod.norm_def, ← sup_eq_max]
133133
-- Show that `(Unitization.splitMul 𝕜 E x).snd` satisifes the C⋆-property, in two stages:

Mathlib/Analysis/NormedSpace/lpSpace.lean

+5-12
Original file line numberDiff line numberDiff line change
@@ -829,18 +829,11 @@ instance inftyStarRing : StarRing (lp B ∞) :=
829829
#align lp.infty_star_ring lp.inftyStarRing
830830

831831
instance inftyCstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞) where
832-
norm_star_mul_self := by
833-
intro f
834-
apply le_antisymm
835-
· rw [← sq]
836-
refine lp.norm_le_of_forall_le (sq_nonneg ‖f‖) fun i => ?_
837-
simp only [lp.star_apply, CstarRing.norm_star_mul_self, ← sq, infty_coeFn_mul, Pi.mul_apply]
838-
refine sq_le_sq' ?_ (lp.norm_apply_le_norm ENNReal.top_ne_zero _ _)
839-
linarith [norm_nonneg (f i), norm_nonneg f]
840-
· rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _)]
841-
refine lp.norm_le_of_forall_le ‖star f * f‖.sqrt_nonneg fun i => ?_
842-
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
843-
exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
832+
norm_mul_self_le f := by
833+
rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _)]
834+
refine lp.norm_le_of_forall_le ‖star f * f‖.sqrt_nonneg fun i => ?_
835+
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
836+
exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
844837
#align lp.infty_cstar_ring lp.inftyCstarRing
845838

846839
end StarRing

Mathlib/Analysis/Quaternion.lean

+2-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ noncomputable instance : NormedAlgebra ℝ ℍ where
101101
toAlgebra := Quaternion.algebra
102102

103103
instance : CstarRing ℍ where
104-
norm_star_mul_self {x} := (norm_mul _ _).trans <| congr_arg (· * ‖x‖) (norm_star x)
104+
norm_mul_self_le x :=
105+
le_of_eq <| Eq.symm <| (norm_mul _ _).trans <| congr_arg (· * ‖x‖) (norm_star x)
105106

106107
/-- Coercion from `ℂ` to `ℍ`. -/
107108
@[coe] def coeComplex (z : ℂ) : ℍ := ⟨z.re, z.im, 0, 0

Mathlib/Analysis/RCLike/Basic.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ theorem norm_conj {z : K} : ‖conj z‖ = ‖z‖ := by simp only [← sqrt_nor
624624
#align is_R_or_C.norm_conj RCLike.norm_conj
625625

626626
instance (priority := 100) : CstarRing K where
627-
norm_star_mul_self {x} := (norm_mul _ _).trans <| congr_arg (· * ‖x‖) norm_conj
627+
norm_mul_self_le x := le_of_eq <| ((norm_mul _ _).trans <| congr_arg (· * ‖x‖) norm_conj).symm
628628

629629
/-! ### Cast lemmas -/
630630

Mathlib/Topology/ContinuousFunction/Bounded.lean

+5-13
Original file line numberDiff line numberDiff line change
@@ -1531,19 +1531,11 @@ instance instStarRing [NormedStarGroup β] : StarRing (α →ᵇ β) where
15311531
variable [CstarRing β]
15321532

15331533
instance instCstarRing : CstarRing (α →ᵇ β) where
1534-
norm_star_mul_self {f} := by
1535-
refine le_antisymm ?_ ?_
1536-
· rw [← sq, norm_le (sq_nonneg _)]
1537-
dsimp [star_apply]
1538-
intro x
1539-
rw [CstarRing.norm_star_mul_self, ← sq]
1540-
refine sq_le_sq' ?_ ?_
1541-
· linarith [norm_nonneg (f x), norm_nonneg f]
1542-
· exact norm_coe_le_norm f x
1543-
· rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _), norm_le (Real.sqrt_nonneg _)]
1544-
intro x
1545-
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
1546-
exact norm_coe_le_norm (star f * f) x
1534+
norm_mul_self_le f := by
1535+
rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _), norm_le (Real.sqrt_nonneg _)]
1536+
intro x
1537+
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
1538+
exact norm_coe_le_norm (star f * f) x
15471539

15481540
end CstarRing
15491541

Mathlib/Topology/ContinuousFunction/Compact.lean

+6-14
Original file line numberDiff line numberDiff line change
@@ -530,20 +530,12 @@ variable {α : Type*} {β : Type*}
530530
variable [TopologicalSpace α] [NormedRing β] [StarRing β]
531531

532532
instance [CompactSpace α] [CstarRing β] : CstarRing C(α, β) where
533-
norm_star_mul_self {f} := by
534-
refine le_antisymm ?_ ?_
535-
· rw [← sq, ContinuousMap.norm_le _ (sq_nonneg _)]
536-
intro x
537-
simp only [ContinuousMap.coe_mul, coe_star, Pi.mul_apply, Pi.star_apply,
538-
CstarRing.norm_star_mul_self, ← sq]
539-
refine sq_le_sq' ?_ ?_
540-
· linarith [norm_nonneg (f x), norm_nonneg f]
541-
· exact ContinuousMap.norm_coe_le_norm f x
542-
· rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _),
543-
ContinuousMap.norm_le _ (Real.sqrt_nonneg _)]
544-
intro x
545-
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
546-
exact ContinuousMap.norm_coe_le_norm (star f * f) x
533+
norm_mul_self_le f := by
534+
rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _),
535+
ContinuousMap.norm_le _ (Real.sqrt_nonneg _)]
536+
intro x
537+
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
538+
exact ContinuousMap.norm_coe_le_norm (star f * f) x
547539

548540
end CstarRing
549541

Mathlib/Topology/ContinuousFunction/ZeroAtInfty.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ end StarRing
597597
section CstarRing
598598

599599
instance instCstarRing [NonUnitalNormedRing β] [StarRing β] [CstarRing β] : CstarRing C₀(α, β) where
600-
norm_star_mul_self {f} := CstarRing.norm_star_mul_self (x := f.toBCF)
600+
norm_mul_self_le f := CstarRing.norm_mul_self_le (x := f.toBCF)
601601

602602
end CstarRing
603603

0 commit comments

Comments
 (0)