@@ -4,7 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Alexander Bentkamp, Mohanad Ahmed
55-/
66import Mathlib.Algebra.Order.Ring.Star
7- import Mathlib.LinearAlgebra.Matrix.Spectrum
7+ import Mathlib.LinearAlgebra.Matrix.DotProduct
8+ import Mathlib.LinearAlgebra.Matrix.Hermitian
89import Mathlib.LinearAlgebra.Matrix.Vec
910import Mathlib.LinearAlgebra.QuadraticForm.Basic
1011
@@ -32,6 +33,10 @@ order on matrices on `β` or `β`.
3233* `Matrix.PosDef.isUnit`: A positive definite matrix in a field is invertible.
3334 -/
3435
36+ -- TODO:
37+ -- assert_not_exists MonoidAlgebra
38+ assert_not_exists Matrix.IsHermitian.eigenvalues
39+
3540open WithLp
3641
3742open scoped ComplexOrder
@@ -178,20 +183,11 @@ protected theorem smul {Ξ± : Type*} [CommSemiring Ξ±] [PartialOrder Ξ±] [StarRin
178183 simp only [smul_mulVec, dotProduct_smul]
179184 exact smul_nonneg ha (hx.2 _)
180185
181- /-- The eigenvalues of a positive semi-definite matrix are non-negative -/
182- lemma eigenvalues_nonneg [DecidableEq n] {A : Matrix n n π}
183- (hA : Matrix.PosSemidef A) (i : n) : 0 β€ hA.1 .eigenvalues i :=
184- (hA.re_dotProduct_nonneg _).trans_eq (hA.1 .eigenvalues_eq _).symm
185-
186- theorem trace_nonneg {A : Matrix n n π} (hA : A.PosSemidef) : 0 β€ A.trace := by
187- classical
188- simp [hA.isHermitian.trace_eq_sum_eigenvalues, β map_sum,
189- Finset.sum_nonneg (fun _ _ => hA.eigenvalues_nonneg _)]
186+ lemma diag_nonneg {A : Matrix n n R} (hA : A.PosSemidef) {i : n} : 0 β€ A i i := by
187+ classical simpa [trace] using hA.2 <| Pi.single i 1
190188
191- theorem det_nonneg [DecidableEq n] {M : Matrix n n π} (hM : M.PosSemidef) :
192- 0 β€ M.det := by
193- rw [hM.isHermitian.det_eq_prod_eigenvalues]
194- exact Finset.prod_nonneg fun i _ β¦ by simpa using hM.eigenvalues_nonneg i
189+ lemma trace_nonneg [AddLeftMono R] {A : Matrix n n R} (hA : A.PosSemidef) : 0 β€ A.trace :=
190+ Fintype.sum_nonneg fun _ β¦ hA.diag_nonneg
195191
196192end PosSemidef
197193
@@ -234,34 +230,6 @@ theorem trace_mul_conjTranspose_self_eq_zero_iff {A : Matrix m n R} :
234230
235231end trace
236232
237- lemma eigenvalues_conjTranspose_mul_self_nonneg (A : Matrix m n π) [DecidableEq n] (i : n) :
238- 0 β€ (isHermitian_conjTranspose_mul_self A).eigenvalues i :=
239- (posSemidef_conjTranspose_mul_self _).eigenvalues_nonneg _
240-
241- lemma eigenvalues_self_mul_conjTranspose_nonneg (A : Matrix m n π) [DecidableEq m] (i : m) :
242- 0 β€ (isHermitian_mul_conjTranspose_self A).eigenvalues i :=
243- (posSemidef_self_mul_conjTranspose _).eigenvalues_nonneg _
244-
245- /-- A Hermitian matrix is positive semi-definite if and only if its eigenvalues are non-negative. -/
246- lemma IsHermitian.posSemidef_iff_eigenvalues_nonneg [DecidableEq n] {A : Matrix n n π}
247- (hA : IsHermitian A) : PosSemidef A β 0 β€ hA.eigenvalues := by
248- refine β¨fun h => h.eigenvalues_nonneg, fun h => ?_β©
249- rw [hA.spectral_theorem]
250- refine (posSemidef_diagonal_iff.mpr ?_).mul_mul_conjTranspose_same _
251- simpa using h
252-
253- @[deprecated (since := "2025-08-17")] alias β¨_, IsHermitian.posSemidef_of_eigenvalues_nonnegβ© :=
254- IsHermitian.posSemidef_iff_eigenvalues_nonneg
255-
256- theorem PosSemidef.trace_eq_zero_iff {A : Matrix n n π} (hA : A.PosSemidef) :
257- A.trace = 0 β A = 0 := by
258- refine β¨fun h => ?_, fun h => h βΈ trace_zero n πβ©
259- classical
260- simp_rw [hA.isHermitian.trace_eq_sum_eigenvalues, β RCLike.ofReal_sum,
261- RCLike.ofReal_eq_zero, Finset.sum_eq_zero_iff_of_nonneg (s := Finset.univ)
262- (by simpa using hA.eigenvalues_nonneg), Finset.mem_univ, true_imp_iff] at h
263- exact funext_iff.eq βΈ hA.isHermitian.eigenvalues_eq_zero_iff.mp <| h
264-
265233section conjugate
266234variable [DecidableEq n] {U x : Matrix n n R}
267235
@@ -470,32 +438,12 @@ theorem toQuadraticForm' [DecidableEq n] {M : Matrix n n β} (hM : M.PosDef) :
470438 toLinearMapβ'_apply']
471439 apply hM.2 x hx
472440
473- /-- The eigenvalues of a positive definite matrix are positive. -/
474- lemma eigenvalues_pos [DecidableEq n] {A : Matrix n n π}
475- (hA : Matrix.PosDef A) (i : n) : 0 < hA.1 .eigenvalues i := by
476- simp only [hA.1 .eigenvalues_eq]
477- exact hA.re_dotProduct_pos <| (ofLp_eq_zero 2 ).ne.2 <|
478- hA.1 .eigenvectorBasis.orthonormal.ne_zero i
479-
480- /-- A Hermitian matrix is positive-definite if and only if its eigenvalues are positive. -/
481- lemma _root_.Matrix.IsHermitian.posDef_iff_eigenvalues_pos [DecidableEq n] {A : Matrix n n π}
482- (hA : A.IsHermitian) : A.PosDef β β i, 0 < hA.eigenvalues i := by
483- refine β¨fun h => h.eigenvalues_pos, fun h => ?_β©
484- rw [hA.spectral_theorem]
485- refine (posDef_diagonal_iff.mpr <| by simpa using h).mul_mul_conjTranspose_same ?_
486- rw [vecMul_injective_iff_isUnit, β Unitary.val_toUnits_apply]
487- exact Units.isUnit _
488-
489- theorem trace_pos [Nonempty n] {A : Matrix n n π} (hA : A.PosDef) : 0 < A.trace := by
490- classical
491- simp [hA.isHermitian.trace_eq_sum_eigenvalues, β map_sum,
492- Finset.sum_pos (fun _ _ => hA.eigenvalues_pos _)]
493-
494- theorem det_pos [DecidableEq n] {M : Matrix n n π} (hM : M.PosDef) : 0 < det M := by
495- rw [hM.isHermitian.det_eq_prod_eigenvalues]
496- apply Finset.prod_pos
497- intro i _
498- simpa using hM.eigenvalues_pos i
441+ lemma diag_pos [Nontrivial R] {A : Matrix n n R} (hA : A.PosDef) {i : n} : 0 < A i i := by
442+ classical simpa [trace] using hA.2 <| Pi.single i 1
443+
444+ lemma trace_pos [Nontrivial R] [IsOrderedCancelAddMonoid R] [Nonempty n] {A : Matrix n n R}
445+ (hA : A.PosDef) : 0 < A.trace :=
446+ Finset.sum_pos (fun _ _ β¦ hA.diag_pos) Finset.univ_nonempty
499447
500448section Field
501449variable {K : Type *} [Field K] [PartialOrder K] [StarRing K]
0 commit comments