linear_algebra.matrix.spectrum
⟷
Mathlib.LinearAlgebra.Matrix.Spectrum
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -25,7 +25,7 @@ spectral theorem, diagonalization theorem
namespace Matrix
-variable {𝕜 : Type _} [IsROrC 𝕜] [DecidableEq 𝕜] {n : Type _} [Fintype n] [DecidableEq n]
+variable {𝕜 : Type _} [RCLike 𝕜] [DecidableEq 𝕜] {n : Type _} [Fintype n] [DecidableEq n]
variable {A : Matrix n n 𝕜}
@@ -98,7 +98,7 @@ theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvector_matrix_inv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, WithLp.equiv_symm_single,
- EuclideanSpace.inner_single_right, one_mul, IsROrC.star_def]
+ EuclideanSpace.inner_single_right, one_mul, RCLike.star_def]
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
-/
@@ -145,12 +145,12 @@ theorem spectral_theorem :
#print Matrix.IsHermitian.eigenvalues_eq /-
theorem eigenvalues_eq (i : n) :
hA.Eigenvalues i =
- IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) :=
+ RCLike.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) :=
by
have := hA.spectral_theorem
rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
- have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
- rw [diagonal_apply_eq, IsROrC.ofReal_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
+ have := congr_arg RCLike.re (congr_fun (congr_fun this i) i)
+ rw [diagonal_apply_eq, RCLike.ofReal_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
conj_transpose_eigenvector_matrix, mul_mul_apply] at this
exact this.symm
#align matrix.is_hermitian.eigenvalues_eq Matrix.IsHermitian.eigenvalues_eq
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -148,10 +148,10 @@ theorem eigenvalues_eq (i : n) :
IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) :=
by
have := hA.spectral_theorem
- rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
+ rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
rw [diagonal_apply_eq, IsROrC.ofReal_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
- conj_transpose_eigenvector_matrix, mul_mul_apply] at this
+ conj_transpose_eigenvector_matrix, mul_mul_apply] at this
exact this.symm
#align matrix.is_hermitian.eigenvalues_eq Matrix.IsHermitian.eigenvalues_eq
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2022 Alexander Bentkamp. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
-/
-import Mathbin.Analysis.InnerProductSpace.Spectrum
-import Mathbin.LinearAlgebra.Matrix.Hermitian
+import Analysis.InnerProductSpace.Spectrum
+import LinearAlgebra.Matrix.Hermitian
#align_import linear_algebra.matrix.spectrum from "leanprover-community/mathlib"@"cff8231f04dfa33fd8f2f45792eebd862ef30cad"
mathlib commit https://github.com/leanprover-community/mathlib/commit/442a83d738cb208d3600056c489be16900ba701d
@@ -97,7 +97,7 @@ theorem eigenvectorMatrix_apply (i j : n) : hA.eigenvectorMatrix i j = hA.eigenv
theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvector_matrix_inv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
- OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, PiLp.equiv_symm_single,
+ OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, WithLp.equiv_symm_single,
EuclideanSpace.inner_single_right, one_mul, IsROrC.star_def]
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
-/
@@ -138,7 +138,7 @@ theorem spectral_theorem :
rfl
· simp only [diagonal_mul, (· ∘ ·), eigenvalues]
rw [eigenvector_basis, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
- OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, PiLp.equiv_symm_single]
+ OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, WithLp.equiv_symm_single]
#align matrix.is_hermitian.spectral_theorem Matrix.IsHermitian.spectral_theorem
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2022 Alexander Bentkamp. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
-
-! This file was ported from Lean 3 source module linear_algebra.matrix.spectrum
-! leanprover-community/mathlib commit cff8231f04dfa33fd8f2f45792eebd862ef30cad
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.InnerProductSpace.Spectrum
import Mathbin.LinearAlgebra.Matrix.Hermitian
+#align_import linear_algebra.matrix.spectrum from "leanprover-community/mathlib"@"cff8231f04dfa33fd8f2f45792eebd862ef30cad"
+
/-! # Spectral theory of hermitian matrices
> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -108,7 +108,7 @@ theorem eigenvectorMatrixInv_apply (i j : n) :
#print Matrix.IsHermitian.conjTranspose_eigenvectorMatrixInv /-
theorem conjTranspose_eigenvectorMatrixInv : hA.eigenvectorMatrixInvᴴ = hA.eigenvectorMatrix :=
by
- ext (i j)
+ ext i j
rw [conj_transpose_apply, eigenvector_matrix_inv_apply, eigenvector_matrix_apply, star_star]
#align matrix.is_hermitian.conj_transpose_eigenvector_matrix_inv Matrix.IsHermitian.conjTranspose_eigenvectorMatrixInv
-/
@@ -128,7 +128,7 @@ theorem spectral_theorem :
hA.eigenvectorMatrixInv ⬝ A = diagonal (coe ∘ hA.Eigenvalues) ⬝ hA.eigenvectorMatrixInv :=
by
rw [eigenvector_matrix_inv, PiLp.basis_toMatrix_basisFun_mul]
- ext (i j)
+ ext i j
have := is_hermitian_iff_is_symmetric.1 hA
convert
this.diagonalization_basis_apply_self_apply finrank_euclideanSpace (EuclideanSpace.single j 1)
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -40,36 +40,48 @@ namespace IsHermitian
variable (hA : A.IsHermitian)
+#print Matrix.IsHermitian.eigenvalues₀ /-
/-- The eigenvalues of a hermitian matrix, indexed by `fin (fintype.card n)` where `n` is the index
type of the matrix. -/
noncomputable def eigenvalues₀ : Fin (Fintype.card n) → ℝ :=
(isHermitian_iff_isSymmetric.1 hA).Eigenvalues finrank_euclideanSpace
#align matrix.is_hermitian.eigenvalues₀ Matrix.IsHermitian.eigenvalues₀
+-/
+#print Matrix.IsHermitian.eigenvalues /-
/-- The eigenvalues of a hermitian matrix, reusing the index `n` of the matrix entries. -/
noncomputable def eigenvalues : n → ℝ := fun i =>
hA.eigenvalues₀ <| (Fintype.equivOfCardEq (Fintype.card_fin _)).symm i
#align matrix.is_hermitian.eigenvalues Matrix.IsHermitian.eigenvalues
+-/
+#print Matrix.IsHermitian.eigenvectorBasis /-
/-- A choice of an orthonormal basis of eigenvectors of a hermitian matrix. -/
noncomputable def eigenvectorBasis : OrthonormalBasis n 𝕜 (EuclideanSpace 𝕜 n) :=
((isHermitian_iff_isSymmetric.1 hA).eigenvectorBasis finrank_euclideanSpace).reindex
(Fintype.equivOfCardEq (Fintype.card_fin _))
#align matrix.is_hermitian.eigenvector_basis Matrix.IsHermitian.eigenvectorBasis
+-/
+#print Matrix.IsHermitian.eigenvectorMatrix /-
/-- A matrix whose columns are an orthonormal basis of eigenvectors of a hermitian matrix. -/
noncomputable def eigenvectorMatrix : Matrix n n 𝕜 :=
(PiLp.basisFun _ 𝕜 n).toMatrix (eigenvectorBasis hA).toBasis
#align matrix.is_hermitian.eigenvector_matrix Matrix.IsHermitian.eigenvectorMatrix
+-/
+#print Matrix.IsHermitian.eigenvectorMatrixInv /-
/-- The inverse of `eigenvector_matrix` -/
noncomputable def eigenvectorMatrixInv : Matrix n n 𝕜 :=
(eigenvectorBasis hA).toBasis.toMatrix (PiLp.basisFun _ 𝕜 n)
#align matrix.is_hermitian.eigenvector_matrix_inv Matrix.IsHermitian.eigenvectorMatrixInv
+-/
+#print Matrix.IsHermitian.eigenvectorMatrix_mul_inv /-
theorem eigenvectorMatrix_mul_inv : hA.eigenvectorMatrix ⬝ hA.eigenvectorMatrixInv = 1 := by
apply Basis.toMatrix_mul_toMatrix_flip
#align matrix.is_hermitian.eigenvector_matrix_mul_inv Matrix.IsHermitian.eigenvectorMatrix_mul_inv
+-/
noncomputable instance : Invertible hA.eigenvectorMatrixInv :=
invertibleOfLeftInverse _ _ hA.eigenvectorMatrix_mul_inv
@@ -77,28 +89,37 @@ noncomputable instance : Invertible hA.eigenvectorMatrixInv :=
noncomputable instance : Invertible hA.eigenvectorMatrix :=
invertibleOfRightInverse _ _ hA.eigenvectorMatrix_mul_inv
+#print Matrix.IsHermitian.eigenvectorMatrix_apply /-
theorem eigenvectorMatrix_apply (i j : n) : hA.eigenvectorMatrix i j = hA.eigenvectorBasis j i := by
simp_rw [eigenvector_matrix, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis,
PiLp.basisFun_repr]
#align matrix.is_hermitian.eigenvector_matrix_apply Matrix.IsHermitian.eigenvectorMatrix_apply
+-/
+#print Matrix.IsHermitian.eigenvectorMatrixInv_apply /-
theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvector_matrix_inv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, PiLp.equiv_symm_single,
EuclideanSpace.inner_single_right, one_mul, IsROrC.star_def]
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
+-/
+#print Matrix.IsHermitian.conjTranspose_eigenvectorMatrixInv /-
theorem conjTranspose_eigenvectorMatrixInv : hA.eigenvectorMatrixInvᴴ = hA.eigenvectorMatrix :=
by
ext (i j)
rw [conj_transpose_apply, eigenvector_matrix_inv_apply, eigenvector_matrix_apply, star_star]
#align matrix.is_hermitian.conj_transpose_eigenvector_matrix_inv Matrix.IsHermitian.conjTranspose_eigenvectorMatrixInv
+-/
+#print Matrix.IsHermitian.conjTranspose_eigenvectorMatrix /-
theorem conjTranspose_eigenvectorMatrix : hA.eigenvectorMatrixᴴ = hA.eigenvectorMatrixInv := by
rw [← conj_transpose_eigenvector_matrix_inv, conj_transpose_conj_transpose]
#align matrix.is_hermitian.conj_transpose_eigenvector_matrix Matrix.IsHermitian.conjTranspose_eigenvectorMatrix
+-/
+#print Matrix.IsHermitian.spectral_theorem /-
/-- *Diagonalization theorem*, *spectral theorem* for matrices; A hermitian matrix can be
diagonalized by a change of basis.
@@ -122,7 +143,9 @@ theorem spectral_theorem :
rw [eigenvector_basis, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, PiLp.equiv_symm_single]
#align matrix.is_hermitian.spectral_theorem Matrix.IsHermitian.spectral_theorem
+-/
+#print Matrix.IsHermitian.eigenvalues_eq /-
theorem eigenvalues_eq (i : n) :
hA.Eigenvalues i =
IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) :=
@@ -134,13 +157,16 @@ theorem eigenvalues_eq (i : n) :
conj_transpose_eigenvector_matrix, mul_mul_apply] at this
exact this.symm
#align matrix.is_hermitian.eigenvalues_eq Matrix.IsHermitian.eigenvalues_eq
+-/
+#print Matrix.IsHermitian.det_eq_prod_eigenvalues /-
/-- The determinant of a hermitian matrix is the product of its eigenvalues. -/
theorem det_eq_prod_eigenvalues : det A = ∏ i, hA.Eigenvalues i :=
by
apply mul_left_cancel₀ (det_ne_zero_of_left_inverse (eigenvector_matrix_mul_inv hA))
rw [← det_mul, spectral_theorem, det_mul, mul_comm, det_diagonal]
#align matrix.is_hermitian.det_eq_prod_eigenvalues Matrix.IsHermitian.det_eq_prod_eigenvalues
+-/
end IsHermitian
mathlib commit https://github.com/leanprover-community/mathlib/commit/893964fc28cefbcffc7cb784ed00a2895b4e65cf
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
! This file was ported from Lean 3 source module linear_algebra.matrix.spectrum
-! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
+! leanprover-community/mathlib commit cff8231f04dfa33fd8f2f45792eebd862ef30cad
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -13,6 +13,9 @@ import Mathbin.LinearAlgebra.Matrix.Hermitian
/-! # Spectral theory of hermitian matrices
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file proves the spectral theorem for matrices. The proof of the spectral theorem is based on
the spectral theorem for linear maps (`diagonalization_basis_apply_self_apply`).
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -106,8 +106,9 @@ theorem spectral_theorem :
rw [eigenvector_matrix_inv, PiLp.basis_toMatrix_basisFun_mul]
ext (i j)
have := is_hermitian_iff_is_symmetric.1 hA
- convert this.diagonalization_basis_apply_self_apply finrank_euclideanSpace
- (EuclideanSpace.single j 1) ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i) using
+ convert
+ this.diagonalization_basis_apply_self_apply finrank_euclideanSpace (EuclideanSpace.single j 1)
+ ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i) using
1
· dsimp only [EuclideanSpace.single, to_euclidean_lin_pi_Lp_equiv_symm, to_lin'_apply,
Matrix.of_apply, is_hermitian.eigenvector_basis]
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -124,10 +124,10 @@ theorem eigenvalues_eq (i : n) :
IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) :=
by
have := hA.spectral_theorem
- rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
+ rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
rw [diagonal_apply_eq, IsROrC.ofReal_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
- conj_transpose_eigenvector_matrix, mul_mul_apply] at this
+ conj_transpose_eigenvector_matrix, mul_mul_apply] at this
exact this.symm
#align matrix.is_hermitian.eigenvalues_eq Matrix.IsHermitian.eigenvalues_eq
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -29,9 +29,9 @@ variable {𝕜 : Type _} [IsROrC 𝕜] [DecidableEq 𝕜] {n : Type _} [Fintype
variable {A : Matrix n n 𝕜}
-open Matrix
+open scoped Matrix
-open BigOperators
+open scoped BigOperators
namespace IsHermitian
mathlib commit https://github.com/leanprover-community/mathlib/commit/2f8347015b12b0864dfaf366ec4909eb70c78740
@@ -126,7 +126,7 @@ theorem eigenvalues_eq (i : n) :
have := hA.spectral_theorem
rw [← Matrix.mul_inv_eq_iff_eq_mul_of_invertible] at this
have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
- rw [diagonal_apply_eq, IsROrC.of_real_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
+ rw [diagonal_apply_eq, IsROrC.ofReal_re, inv_eq_left_inv hA.eigenvector_matrix_mul_inv, ←
conj_transpose_eigenvector_matrix, mul_mul_apply] at this
exact this.symm
#align matrix.is_hermitian.eigenvalues_eq Matrix.IsHermitian.eigenvalues_eq
mathlib commit https://github.com/leanprover-community/mathlib/commit/55d771df074d0dd020139ee1cd4b95521422df9f
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
! This file was ported from Lean 3 source module linear_algebra.matrix.spectrum
-! leanprover-community/mathlib commit 9f0d61b4475e3c3cba6636ab51cdb1f3949d2e1d
+! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -114,8 +114,8 @@ theorem spectral_theorem :
simp_rw [mul_vec_single, mul_one, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_reindex]
rfl
- · simp only [diagonal_mul, (· ∘ ·), eigenvalues, eigenvector_basis]
- rw [Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
+ · simp only [diagonal_mul, (· ∘ ·), eigenvalues]
+ rw [eigenvector_basis, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, PiLp.equiv_symm_single]
#align matrix.is_hermitian.spectral_theorem Matrix.IsHermitian.spectral_theorem
mathlib commit https://github.com/leanprover-community/mathlib/commit/02ba8949f486ebecf93fe7460f1ed0564b5e442c
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
! This file was ported from Lean 3 source module linear_algebra.matrix.spectrum
-! leanprover-community/mathlib commit 2f4cdce0c2f2f3b8cd58f05d556d03b468e1eb2e
+! leanprover-community/mathlib commit 9f0d61b4475e3c3cba6636ab51cdb1f3949d2e1d
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -105,15 +105,14 @@ theorem spectral_theorem :
by
rw [eigenvector_matrix_inv, PiLp.basis_toMatrix_basisFun_mul]
ext (i j)
- have : LinearMap.IsSymmetric _ := is_hermitian_iff_is_symmetric.1 hA
+ have := is_hermitian_iff_is_symmetric.1 hA
convert this.diagonalization_basis_apply_self_apply finrank_euclideanSpace
- (EuclideanSpace.single j 1) ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i)
- · dsimp only [LinearEquiv.conj_apply_apply, PiLp.linearEquiv_apply, PiLp.linearEquiv_symm_apply,
- PiLp.equiv_single, LinearMap.stdBasis, LinearMap.coe_single, PiLp.equiv_symm_single,
- LinearEquiv.symm_symm, eigenvector_basis, to_lin'_apply]
- simp only [Basis.toMatrix, Basis.coe_toOrthonormalBasis_repr, Basis.equivFun_apply]
- simp_rw [OrthonormalBasis.coe_toBasis_repr_apply, OrthonormalBasis.repr_reindex,
- LinearEquiv.symm_symm, PiLp.linearEquiv_apply, PiLp.equiv_single, mul_vec_single, mul_one]
+ (EuclideanSpace.single j 1) ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i) using
+ 1
+ · dsimp only [EuclideanSpace.single, to_euclidean_lin_pi_Lp_equiv_symm, to_lin'_apply,
+ Matrix.of_apply, is_hermitian.eigenvector_basis]
+ simp_rw [mul_vec_single, mul_one, OrthonormalBasis.coe_toBasis_repr_apply,
+ OrthonormalBasis.repr_reindex]
rfl
· simp only [diagonal_mul, (· ∘ ·), eigenvalues, eigenvector_basis]
rw [Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -106,9 +106,8 @@ theorem spectral_theorem :
rw [eigenvector_matrix_inv, PiLp.basis_toMatrix_basisFun_mul]
ext (i j)
have : LinearMap.IsSymmetric _ := is_hermitian_iff_is_symmetric.1 hA
- convert
- this.diagonalization_basis_apply_self_apply finrank_euclideanSpace (EuclideanSpace.single j 1)
- ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i)
+ convert this.diagonalization_basis_apply_self_apply finrank_euclideanSpace
+ (EuclideanSpace.single j 1) ((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i)
· dsimp only [LinearEquiv.conj_apply_apply, PiLp.linearEquiv_apply, PiLp.linearEquiv_symm_apply,
PiLp.equiv_single, LinearMap.stdBasis, LinearMap.coe_single, PiLp.equiv_symm_single,
LinearEquiv.symm_symm, eigenvector_basis, to_lin'_apply]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
IsROrC
to RCLike
(#10819)
IsROrC
contains data, which goes against the expectation that classes prefixed with Is
are prop-valued. People have been complaining about this on and off, so this PR renames IsROrC
to RCLike
.
@@ -24,7 +24,7 @@ spectral theorem, diagonalization theorem
namespace Matrix
-variable {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
+variable {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
variable {A : Matrix n n 𝕜}
open scoped BigOperators
@@ -87,7 +87,7 @@ theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvectorMatrixInv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, WithLp.equiv_symm_single,
- EuclideanSpace.inner_single_right, one_mul, IsROrC.star_def]
+ EuclideanSpace.inner_single_right, one_mul, RCLike.star_def]
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
theorem conjTranspose_eigenvectorMatrixInv : hA.eigenvectorMatrixInvᴴ = hA.eigenvectorMatrix := by
@@ -123,11 +123,11 @@ theorem spectral_theorem :
theorem eigenvalues_eq (i : n) :
hA.eigenvalues i =
- IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A *ᵥ hA.eigenvectorMatrixᵀ i) := by
+ RCLike.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A *ᵥ hA.eigenvectorMatrixᵀ i) := by
have := hA.spectral_theorem
rw [← @Matrix.mul_inv_eq_iff_eq_mul_of_invertible (A := hA.eigenvectorMatrixInv)] at this
- have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
- rw [diagonal_apply_eq, Function.comp_apply, IsROrC.ofReal_re,
+ have := congr_arg RCLike.re (congr_fun (congr_fun this i) i)
+ rw [diagonal_apply_eq, Function.comp_apply, RCLike.ofReal_re,
inv_eq_left_inv hA.eigenvectorMatrix_mul_inv, ← conjTranspose_eigenvectorMatrix, mul_mul_apply]
at this
exact this.symm
@@ -170,7 +170,7 @@ lemma mulVec_eigenvectorBasis (i : n) :
have := congr_fun (congr_fun this j) i
simp only [mul_diagonal, Function.comp_apply] at this
convert this using 1
- rw [mul_comm, Pi.smul_apply, IsROrC.real_smul_eq_coe_mul, hA.eigenvectorMatrix_apply]
+ rw [mul_comm, Pi.smul_apply, RCLike.real_smul_eq_coe_mul, hA.eigenvectorMatrix_apply]
end DecidableEq
@@ -181,7 +181,7 @@ lemma exists_eigenvector_of_ne_zero (hA : IsHermitian A) (h_ne : A ≠ 0) :
have : hA.eigenvalues ≠ 0 := by
contrapose! h_ne
have := hA.spectral_theorem'
- rwa [h_ne, Pi.comp_zero, IsROrC.ofReal_zero, (by rfl : Function.const n (0 : 𝕜) = fun _ ↦ 0),
+ rwa [h_ne, Pi.comp_zero, RCLike.ofReal_zero, (by rfl : Function.const n (0 : 𝕜) = fun _ ↦ 0),
diagonal_zero, mul_zero, zero_mul] at this
obtain ⟨i, hi⟩ := Function.ne_iff.mp this
exact ⟨_, _, hi, hA.eigenvectorBasis.orthonormal.ne_zero i, hA.mulVec_eigenvectorBasis i⟩
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -25,7 +25,6 @@ spectral theorem, diagonalization theorem
namespace Matrix
variable {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
-
variable {A : Matrix n n 𝕜}
open scoped BigOperators
@@ -35,7 +34,6 @@ namespace IsHermitian
section DecidableEq
variable [DecidableEq n]
-
variable (hA : A.IsHermitian)
/-- The eigenvalues of a hermitian matrix, indexed by `Fin (Fintype.card n)` where `n` is the index
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -180,8 +180,8 @@ end DecidableEq
lemma exists_eigenvector_of_ne_zero (hA : IsHermitian A) (h_ne : A ≠ 0) :
∃ (v : n → 𝕜) (t : ℝ), t ≠ 0 ∧ v ≠ 0 ∧ A *ᵥ v = t • v := by
classical
- have : hA.eigenvalues ≠ 0
- · contrapose! h_ne
+ have : hA.eigenvalues ≠ 0 := by
+ contrapose! h_ne
have := hA.spectral_theorem'
rwa [h_ne, Pi.comp_zero, IsROrC.ofReal_zero, (by rfl : Function.const n (0 : 𝕜) = fun _ ↦ 0),
diagonal_zero, mul_zero, zero_mul] at this
Matrix.mulVec
and Matrix.vecMul
get infix notation (#10297)
Zulip discussion: https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/Notation.20for.20mul_vec.20and.20vec_mul
Co-authored-by: Martin Dvorak <mdvorak@ista.ac.at>
@@ -125,7 +125,7 @@ theorem spectral_theorem :
theorem eigenvalues_eq (i : n) :
hA.eigenvalues i =
- IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A.mulVec (hA.eigenvectorMatrixᵀ i)) := by
+ IsROrC.re (star (hA.eigenvectorMatrixᵀ i) ⬝ᵥ A *ᵥ hA.eigenvectorMatrixᵀ i) := by
have := hA.spectral_theorem
rw [← @Matrix.mul_inv_eq_iff_eq_mul_of_invertible (A := hA.eigenvectorMatrixInv)] at this
have := congr_arg IsROrC.re (congr_fun (congr_fun this i) i)
@@ -165,7 +165,7 @@ lemma rank_eq_card_non_zero_eigs : A.rank = Fintype.card {i // hA.eigenvalues i
/-- The entries of `eigenvectorBasis` are eigenvectors. -/
lemma mulVec_eigenvectorBasis (i : n) :
- mulVec A (hA.eigenvectorBasis i) = hA.eigenvalues i • hA.eigenvectorBasis i := by
+ A *ᵥ hA.eigenvectorBasis i = hA.eigenvalues i • hA.eigenvectorBasis i := by
have := congr_arg (· * hA.eigenvectorMatrix) hA.spectral_theorem'
simp only [mul_assoc, mul_eq_one_comm.mp hA.eigenvectorMatrix_mul_inv, mul_one] at this
ext1 j
@@ -178,7 +178,7 @@ end DecidableEq
/-- A nonzero Hermitian matrix has an eigenvector with nonzero eigenvalue. -/
lemma exists_eigenvector_of_ne_zero (hA : IsHermitian A) (h_ne : A ≠ 0) :
- ∃ (v : n → 𝕜) (t : ℝ), t ≠ 0 ∧ v ≠ 0 ∧ mulVec A v = t • v := by
+ ∃ (v : n → 𝕜) (t : ℝ), t ≠ 0 ∧ v ≠ 0 ∧ A *ᵥ v = t • v := by
classical
have : hA.eigenvalues ≠ 0
· contrapose! h_ne
@@ -24,16 +24,18 @@ spectral theorem, diagonalization theorem
namespace Matrix
-variable {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n] [DecidableEq n]
+variable {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n]
variable {A : Matrix n n 𝕜}
-open scoped Matrix
-
open scoped BigOperators
namespace IsHermitian
+section DecidableEq
+
+variable [DecidableEq n]
+
variable (hA : A.IsHermitian)
/-- The eigenvalues of a hermitian matrix, indexed by `Fin (Fintype.card n)` where `n` is the index
@@ -172,9 +174,12 @@ lemma mulVec_eigenvectorBasis (i : n) :
convert this using 1
rw [mul_comm, Pi.smul_apply, IsROrC.real_smul_eq_coe_mul, hA.eigenvectorMatrix_apply]
+end DecidableEq
+
/-- A nonzero Hermitian matrix has an eigenvector with nonzero eigenvalue. -/
-lemma exists_eigenvector_of_ne_zero (h_ne : A ≠ 0) :
+lemma exists_eigenvector_of_ne_zero (hA : IsHermitian A) (h_ne : A ≠ 0) :
∃ (v : n → 𝕜) (t : ℝ), t ≠ 0 ∧ v ≠ 0 ∧ mulVec A v = t • v := by
+ classical
have : hA.eigenvalues ≠ 0
· contrapose! h_ne
have := hA.spectral_theorem'
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -142,7 +142,7 @@ theorem det_eq_prod_eigenvalues : det A = ∏ i, (hA.eigenvalues i : 𝕜) := by
/-- *spectral theorem* (Alternate form for convenience) A hermitian matrix can be can be
replaced by a diagonal matrix sandwiched between the eigenvector matrices. This alternate form
-allows direct rewriting of A since: $ A = V D V⁻¹$ -/
+allows direct rewriting of A since: <| A = V D V⁻¹$ -/
lemma spectral_theorem' :
A = hA.eigenvectorMatrix * diagonal ((↑) ∘ hA.eigenvalues) * hA.eigenvectorMatrixInv := by
simpa [ ← Matrix.mul_assoc, hA.eigenvectorMatrix_mul_inv, Matrix.one_mul] using
@@ -81,7 +81,7 @@ theorem eigenvectorMatrix_apply (i j : n) : hA.eigenvectorMatrix i j = hA.eigenv
/-- The columns of `Matrix.IsHermitian.eigenVectorMatrix` form the basis-/
theorem transpose_eigenvectorMatrix_apply (i : n) :
hA.eigenvectorMatrixᵀ i = hA.eigenvectorBasis i :=
- funext <| fun j => eigenvectorMatrix_apply hA j i
+ funext fun j => eigenvectorMatrix_apply hA j i
theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
This PR adds two main results about positive semidefinite matrices:
A
is positive semidefinite then x* A x = 0
implies A x = 0
(proof extracted from #8594).Co-authored-by: Adrian Wüthrich (@awueth)
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -161,6 +161,28 @@ lemma rank_eq_rank_diagonal : A.rank = (Matrix.diagonal hA.eigenvalues).rank :=
lemma rank_eq_card_non_zero_eigs : A.rank = Fintype.card {i // hA.eigenvalues i ≠ 0} := by
rw [rank_eq_rank_diagonal hA, Matrix.rank_diagonal]
+/-- The entries of `eigenvectorBasis` are eigenvectors. -/
+lemma mulVec_eigenvectorBasis (i : n) :
+ mulVec A (hA.eigenvectorBasis i) = hA.eigenvalues i • hA.eigenvectorBasis i := by
+ have := congr_arg (· * hA.eigenvectorMatrix) hA.spectral_theorem'
+ simp only [mul_assoc, mul_eq_one_comm.mp hA.eigenvectorMatrix_mul_inv, mul_one] at this
+ ext1 j
+ have := congr_fun (congr_fun this j) i
+ simp only [mul_diagonal, Function.comp_apply] at this
+ convert this using 1
+ rw [mul_comm, Pi.smul_apply, IsROrC.real_smul_eq_coe_mul, hA.eigenvectorMatrix_apply]
+
+/-- A nonzero Hermitian matrix has an eigenvector with nonzero eigenvalue. -/
+lemma exists_eigenvector_of_ne_zero (h_ne : A ≠ 0) :
+ ∃ (v : n → 𝕜) (t : ℝ), t ≠ 0 ∧ v ≠ 0 ∧ mulVec A v = t • v := by
+ have : hA.eigenvalues ≠ 0
+ · contrapose! h_ne
+ have := hA.spectral_theorem'
+ rwa [h_ne, Pi.comp_zero, IsROrC.ofReal_zero, (by rfl : Function.const n (0 : 𝕜) = fun _ ↦ 0),
+ diagonal_zero, mul_zero, zero_mul] at this
+ obtain ⟨i, hi⟩ := Function.ne_iff.mp this
+ exact ⟨_, _, hi, hA.eigenvectorBasis.orthonormal.ne_zero i, hA.mulVec_eigenvectorBasis i⟩
+
end IsHermitian
end Matrix
@@ -99,7 +99,7 @@ theorem conjTranspose_eigenvectorMatrix : hA.eigenvectorMatrixᴴ = hA.eigenvect
rw [← conjTranspose_eigenvectorMatrixInv, conjTranspose_conjTranspose]
#align matrix.is_hermitian.conj_transpose_eigenvector_matrix Matrix.IsHermitian.conjTranspose_eigenvectorMatrix
-/-- *Diagonalization theorem*, *spectral theorem* for matrices; A hermitian matrix can be
+/-- **Diagonalization theorem**, **spectral theorem** for matrices; A hermitian matrix can be
diagonalized by a change of basis.
For the spectral theorem on linear maps, see
We already have noncomputable DecidableEq
instances for Real
and Complex
; putting them here too reduces friction in code generalized to IsROrC K
.
@@ -24,7 +24,7 @@ spectral theorem, diagonalization theorem
namespace Matrix
-variable {𝕜 : Type*} [IsROrC 𝕜] [DecidableEq 𝕜] {n : Type*} [Fintype n] [DecidableEq n]
+variable {𝕜 : Type*} [IsROrC 𝕜] {n : Type*} [Fintype n] [DecidableEq n]
variable {A : Matrix n n 𝕜}
This removes the (PiLp.equiv 2 fun i => α i)
abbreviation, replacing it with its implementation (WithLp.equiv 2 (∀ i, α i))
. The same thing is done for PiLp.linearEquiv
.
@@ -86,7 +86,7 @@ theorem transpose_eigenvectorMatrix_apply (i : n) :
theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvectorMatrixInv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
- OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, PiLp.equiv_symm_single,
+ OrthonormalBasis.repr_apply_apply, PiLp.basisFun_apply, WithLp.equiv_symm_single,
EuclideanSpace.inner_single_right, one_mul, IsROrC.star_def]
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
@@ -118,7 +118,7 @@ theorem spectral_theorem :
rfl
· simp only [diagonal_mul, (· ∘ ·), eigenvalues]
rw [eigenvectorBasis, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
- OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, PiLp.equiv_symm_single]
+ OrthonormalBasis.repr_reindex, eigenvalues₀, PiLp.basisFun_apply, WithLp.equiv_symm_single]
#align matrix.is_hermitian.spectral_theorem Matrix.IsHermitian.spectral_theorem
theorem eigenvalues_eq (i : n) :
⬝
notation in favor of HMul
(#6487)
The main difficulty here is that *
has a slightly difference precedence to ⬝
. notably around smul
and neg
.
The other annoyance is that ↑U ⬝ A ⬝ ↑U⁻¹ : Matrix m m 𝔸
now has to be written U.val * A * (U⁻¹).val
in order to typecheck.
A downside of this change to consider: if you have a goal of A * (B * C) = (A * B) * C
, mul_assoc
now gives the illusion of matching, when in fact Matrix.mul_assoc
is needed. Previously the distinct symbol made it easy to avoid this mistake.
On the flipside, there is now no need to rewrite by Matrix.mul_eq_mul
all the time (indeed, the lemma is now removed).
@@ -63,7 +63,7 @@ noncomputable def eigenvectorMatrixInv : Matrix n n 𝕜 :=
(eigenvectorBasis hA).toBasis.toMatrix (PiLp.basisFun _ 𝕜 n)
#align matrix.is_hermitian.eigenvector_matrix_inv Matrix.IsHermitian.eigenvectorMatrixInv
-theorem eigenvectorMatrix_mul_inv : hA.eigenvectorMatrix ⬝ hA.eigenvectorMatrixInv = 1 := by
+theorem eigenvectorMatrix_mul_inv : hA.eigenvectorMatrix * hA.eigenvectorMatrixInv = 1 := by
apply Basis.toMatrix_mul_toMatrix_flip
#align matrix.is_hermitian.eigenvector_matrix_mul_inv Matrix.IsHermitian.eigenvectorMatrix_mul_inv
@@ -105,7 +105,7 @@ diagonalized by a change of basis.
For the spectral theorem on linear maps, see
`LinearMap.IsSymmetric.eigenvectorBasis_apply_self_apply`. -/
theorem spectral_theorem :
- hA.eigenvectorMatrixInv ⬝ A = diagonal ((↑) ∘ hA.eigenvalues) ⬝ hA.eigenvectorMatrixInv := by
+ hA.eigenvectorMatrixInv * A = diagonal ((↑) ∘ hA.eigenvalues) * hA.eigenvectorMatrixInv := by
rw [eigenvectorMatrixInv, PiLp.basis_toMatrix_basisFun_mul]
ext i j
have := isHermitian_iff_isSymmetric.1 hA
@@ -144,9 +144,9 @@ theorem det_eq_prod_eigenvalues : det A = ∏ i, (hA.eigenvalues i : 𝕜) := by
replaced by a diagonal matrix sandwiched between the eigenvector matrices. This alternate form
allows direct rewriting of A since: $ A = V D V⁻¹$ -/
lemma spectral_theorem' :
- A = hA.eigenvectorMatrix ⬝ diagonal ((↑) ∘ hA.eigenvalues) ⬝ hA.eigenvectorMatrixInv := by
+ A = hA.eigenvectorMatrix * diagonal ((↑) ∘ hA.eigenvalues) * hA.eigenvectorMatrixInv := by
simpa [ ← Matrix.mul_assoc, hA.eigenvectorMatrix_mul_inv, Matrix.one_mul] using
- congr_arg (hA.eigenvectorMatrix ⬝ ·) hA.spectral_theorem
+ congr_arg (hA.eigenvectorMatrix * ·) hA.spectral_theorem
/-- rank of a hermitian matrix is the rank of after diagonalization by the eigenvector matrix -/
lemma rank_eq_rank_diagonal : A.rank = (Matrix.diagonal hA.eigenvalues).rank := by
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -24,7 +24,7 @@ spectral theorem, diagonalization theorem
namespace Matrix
-variable {𝕜 : Type _} [IsROrC 𝕜] [DecidableEq 𝕜] {n : Type _} [Fintype n] [DecidableEq n]
+variable {𝕜 : Type*} [IsROrC 𝕜] [DecidableEq 𝕜] {n : Type*} [Fintype n] [DecidableEq n]
variable {A : Matrix n n 𝕜}
This PR provides the lemmas:
IsHermitian.spectral_theorem'
: a slightly modified spectral_theorem such that the hermitian matrix can be directly replaced.
$$A = VDV^{-1}\quad D = \text{diag}(d)$$IsHermitian.rank_eq_count_non_zero_eigs
: the rank of a hermitian matrix is the number of non-zero eigenvalues of that matrix
$$\text{rank}(A) = \text{card} \lbrace \quad i \quad | \quad d_i \neq 0 \rbrace$$IsHermitian.rank_eq_rank_diagonal
: the rank of a hermitian matrix is the same as its rank after diagonalization by the eigenvector matrix
$$\text{rank}(A) = \text{rank}(D)$$Matrix.rank_diagonal
: the rank of a diagonal matrix is the number of non-zero diagonal elements. Note that this was previously the name of a lemma about LinearMaps we take that name (but keep the align to avoid disrupting the tooling).
$$\text{rank}(V) = \text{Diag}(v) \implies \text{rank}(V) = \text{card} \lbrace \quad i \quad | \quad v_i \neq 0 \rbrace$$LinearMap.rank_diagonal
: the rank of a linear map that is formed from a diagonal matrix is the number of non-zero diagonal entries. This was previously called Matrix.rank_diagonal
.Co-authored-by: Mohanad Ahmed <m.a.m.elhassan@gmail.com>
@@ -4,6 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
-/
import Mathlib.Analysis.InnerProductSpace.Spectrum
+import Mathlib.Data.Matrix.Rank
+import Mathlib.LinearAlgebra.Matrix.Diagonal
import Mathlib.LinearAlgebra.Matrix.Hermitian
#align_import linear_algebra.matrix.spectrum from "leanprover-community/mathlib"@"46b633fd842bef9469441c0209906f6dddd2b4f5"
@@ -138,6 +140,27 @@ theorem det_eq_prod_eigenvalues : det A = ∏ i, (hA.eigenvalues i : 𝕜) := by
simp_rw [Function.comp_apply]
#align matrix.is_hermitian.det_eq_prod_eigenvalues Matrix.IsHermitian.det_eq_prod_eigenvalues
+/-- *spectral theorem* (Alternate form for convenience) A hermitian matrix can be can be
+replaced by a diagonal matrix sandwiched between the eigenvector matrices. This alternate form
+allows direct rewriting of A since: $ A = V D V⁻¹$ -/
+lemma spectral_theorem' :
+ A = hA.eigenvectorMatrix ⬝ diagonal ((↑) ∘ hA.eigenvalues) ⬝ hA.eigenvectorMatrixInv := by
+ simpa [ ← Matrix.mul_assoc, hA.eigenvectorMatrix_mul_inv, Matrix.one_mul] using
+ congr_arg (hA.eigenvectorMatrix ⬝ ·) hA.spectral_theorem
+
+/-- rank of a hermitian matrix is the rank of after diagonalization by the eigenvector matrix -/
+lemma rank_eq_rank_diagonal : A.rank = (Matrix.diagonal hA.eigenvalues).rank := by
+ conv_lhs => rw [hA.spectral_theorem']
+ have hE := isUnit_det_of_invertible (hA.eigenvectorMatrix)
+ have hiE := isUnit_det_of_invertible (hA.eigenvectorMatrixInv)
+ simp only [rank_mul_eq_right_of_isUnit_det hA.eigenvectorMatrix _ hE,
+ rank_mul_eq_left_of_isUnit_det hA.eigenvectorMatrixInv _ hiE,
+ rank_diagonal, Function.comp_apply, ne_eq, algebraMap.lift_map_eq_zero_iff]
+
+/-- rank of a hermitian matrix is the number of nonzero eigenvalues of the hermitian matrix -/
+lemma rank_eq_card_non_zero_eigs : A.rank = Fintype.card {i // hA.eigenvalues i ≠ 0} := by
+ rw [rank_eq_rank_diagonal hA, Matrix.rank_diagonal]
+
end IsHermitian
end Matrix
Two lemmas:
Matrix.PosDef.eigenvalues_pos
: $$A \in k^{n\times n}, A > 0 \implies \lambda (A) >0$$Matrix.PosSemidef.eigenvalues_nonneg
: $$A \in k^{n\times n}, A \geq 0 \implies \lambda (A) \geq 0$$Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -76,6 +76,11 @@ theorem eigenvectorMatrix_apply (i j : n) : hA.eigenvectorMatrix i j = hA.eigenv
PiLp.basisFun_repr]
#align matrix.is_hermitian.eigenvector_matrix_apply Matrix.IsHermitian.eigenvectorMatrix_apply
+/-- The columns of `Matrix.IsHermitian.eigenVectorMatrix` form the basis-/
+theorem transpose_eigenvectorMatrix_apply (i : n) :
+ hA.eigenvectorMatrixᵀ i = hA.eigenvectorBasis i :=
+ funext <| fun j => eigenvectorMatrix_apply hA j i
+
theorem eigenvectorMatrixInv_apply (i j : n) :
hA.eigenvectorMatrixInv i j = star (hA.eigenvectorBasis i j) := by
rw [eigenvectorMatrixInv, Basis.toMatrix_apply, OrthonormalBasis.coe_toBasis_repr_apply,
@@ -2,15 +2,12 @@
Copyright (c) 2022 Alexander Bentkamp. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Alexander Bentkamp
-
-! This file was ported from Lean 3 source module linear_algebra.matrix.spectrum
-! leanprover-community/mathlib commit 46b633fd842bef9469441c0209906f6dddd2b4f5
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.InnerProductSpace.Spectrum
import Mathlib.LinearAlgebra.Matrix.Hermitian
+#align_import linear_algebra.matrix.spectrum from "leanprover-community/mathlib"@"46b633fd842bef9469441c0209906f6dddd2b4f5"
+
/-! # Spectral theory of hermitian matrices
This file proves the spectral theorem for matrices. The proof of the spectral theorem is based on
ext
(#5258)
Co-authored-by: Xavier Roblot <46200072+xroblot@users.noreply.github.com> Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr> Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com> Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Pol'tta / Miyahara Kō <pol_tta@outlook.jp> Co-authored-by: Jason Yuen <jason_yuen2007@hotmail.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Jireh Loreaux <loreaujy@gmail.com> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Heather Macbeth <25316162+hrmacbeth@users.noreply.github.com> Co-authored-by: Jujian Zhang <jujian.zhang1998@outlook.com> Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
@@ -87,7 +87,7 @@ theorem eigenvectorMatrixInv_apply (i j : n) :
#align matrix.is_hermitian.eigenvector_matrix_inv_apply Matrix.IsHermitian.eigenvectorMatrixInv_apply
theorem conjTranspose_eigenvectorMatrixInv : hA.eigenvectorMatrixInvᴴ = hA.eigenvectorMatrix := by
- ext (i j)
+ ext i j
rw [conjTranspose_apply, eigenvectorMatrixInv_apply, eigenvectorMatrix_apply, star_star]
#align matrix.is_hermitian.conj_transpose_eigenvector_matrix_inv Matrix.IsHermitian.conjTranspose_eigenvectorMatrixInv
@@ -103,7 +103,7 @@ For the spectral theorem on linear maps, see
theorem spectral_theorem :
hA.eigenvectorMatrixInv ⬝ A = diagonal ((↑) ∘ hA.eigenvalues) ⬝ hA.eigenvectorMatrixInv := by
rw [eigenvectorMatrixInv, PiLp.basis_toMatrix_basisFun_mul]
- ext (i j)
+ ext i j
have := isHermitian_iff_isSymmetric.1 hA
convert this.eigenvectorBasis_apply_self_apply finrank_euclideanSpace (EuclideanSpace.single j 1)
((Fintype.equivOfCardEq (Fintype.card_fin _)).symm i) using 1
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file