Imports
module
public import Mathlib.LinearAlgebra.Eigenspace.Triangularizable
public import Mathlib.Analysis.InnerProductSpace.Adjoint
Schur triangulation
Schur triangulation is more commonly known as Schur decomposition or Schur triangularization, but
"triangulation" makes the API more readable. It states that a square matrix over an algebraically
closed field, e.g., ℂ, is unitarily similar to an upper triangular matrix.
Main definitions
Matrix.schur_triangulation : a matrix A : Matrix n n 𝕜 with 𝕜 being algebraically closed can
be decomposed as A = U * T * star U where U is unitary and T is upper triangular.
Matrix.schurTriangulationUnitary : the unitary matrix U as previously stated.
Matrix.schurTriangulation : the upper triangular matrix T as previously stated.
Some auxiliary definitions are not meant to be used directly, but
LinearMap.SchurTriangulationAux.of contains the main algorithm for the triangulation procedure.
@[ expose ] public section
subNat' i h subtracts m from i. This is an alternative form of Fin.subNat.
@[ inline ] def Fin.subNat' ( i : Fin ( m + n ) ) ( h : ¬ i < m ) : Fin n :=
subNat m ( Fin.cast ( m . add_comm n ) i ) ( Nat.ge_of_not_lt h )
An alternative form of Equiv.sumEquivSigmaBool where Bool.casesOn is replaced by cond.
def sumEquivSigmalCond : Fin m ⊕ Fin n ≃ Σ b , cond b ( Fin m ) ( Fin n ) :=
calc Fin m ⊕ Fin n
_ ≃ Fin n ⊕ Fin m := sumComm ..
_ ≃ Σ b , bif b then ( Fin m ) else ( Fin n ) := sumEquivSigmaBool ..
_ ≃ Σ b , cond b ( Fin m ) ( Fin n ) := sigmaCongrRight ( fun | true | false => Equiv.refl _ )
The composition of finSumFinEquiv and Equiv.sumEquivSigmalCond used by
LinearMap.SchurTriangulationAux.of.
def finAddEquivSigmaCond : Fin ( m + n ) ≃ Σ b , cond b ( Fin m ) ( Fin n ) :=
finSumFinEquiv . symm . trans sumEquivSigmalCond
The type family parameterized by Bool is finite if each type variant is finite.
instance [ M : Fintype m ] [ N : Fintype n ] ( b : Bool ) : Fintype ( cond b m n ) := b . rec N M
The type family parameterized by Bool has decidable equality if each type variant is
decidable.
set_option backward.isDefEq.respectTransparency false in instance [ DecidableEq m ] [ DecidableEq n ] : DecidableEq ( Σ b , cond b m n )
| ⟨ true , _ ⟩ , ⟨ false , _ ⟩
| ⟨ false , _ ⟩ , ⟨ true , _ ⟩ => isFalse nofun
| ⟨ false , i ⟩ , ⟨ false , j ⟩
| ⟨ true , i ⟩ , ⟨ true , j ⟩ =>
if h : i = j then isTrue ( Sigma.eq rfl h ) else isFalse fun | rfl => h rfl
The property of a matrix being upper triangular. See also Matrix.det_of_upperTriangular.
abbrev IsUpperTriangular [ LT n ] [ CommRing R ] ( A : Matrix n n R ) := A . BlockTriangular id
The subtype of upper triangular matrices.
Don't use this definition directly. Instead, use Matrix.schurTriangulationBasis,
Matrix.schurTriangulationUnitary, and Matrix.schurTriangulation. See also
LinearMap.SchurTriangulationAux.of and Matrix.schurTriangulationAux.
The dimension of the inner product space E.
An orthonormal basis of E that induces an upper triangular form for f.
structure SchurTriangulationAux ( f : Module.End 𝕜 E ) where dim : ℕ
hdim : Module.finrank 𝕜 E = dim basis : OrthonormalBasis ( Fin dim ) 𝕜 E
upperTriangular : ( toMatrix basis . toBasis basis . toBasis f ) . IsUpperTriangular
Schur's recursive triangulation procedure
Given a linear endomorphism f on a non-trivial finite-dimensional vector space E over an
algebraically closed field 𝕜, one can always pick an eigenvalue μ of f whose corresponding
eigenspace V is non-trivial. Given that E is also an inner product space, let bV and bW be
orthonormal bases for V and Vᗮ respectively. Then, the collection of vectors in bV and bW
forms an orthonormal basis bE for E, as the direct sum of V and Vᗮ is an internal
decomposition of E. The matrix representation of f with respect to bE satisfies
$$
\sideset{\mathrm{bE}}{ \mathrm{bE}}{[f]} =
\begin{bmatrix}
\sideset{\mathrm{bV}}{ \mathrm{bV}}{[f]} &
\sideset{\mathrm{bW}}{ \mathrm{bV}}{[f]} \
\sideset{\mathrm{bV}}{ \mathrm{bW}}{[f]} &
\sideset{\mathrm{bW}}{ \mathrm{bW}}{[f]}
\end{bmatrix} =
\begin{bmatrix} \mu I & □ \ 0 & \sideset{\mathrm{bW}}{ \mathrm{bW}}{[f]} \end{bmatrix},
$$
which is upper triangular as long as $\sideset{\mathrm{bW}}{ \mathrm{bW}}{[f]}$ is. Finally, one
observes that the recursion from $\sideset{\mathrm{bE}}{ \mathrm{bE}}{[f]}$ to
$\sideset{\mathrm{bW}}{ \mathrm{bW}}{[f]}$ is well-founded, as the dimension of bW is smaller
than that of bE because bV is non-trivial.
However, in order to leverage DirectSum.IsInternal.collectedOrthonormalBasis, the type
Σ b, cond b (Fin m) (Fin n) has to be used instead of the more natural Fin m ⊕ Fin n while their
equivalence is propositionally established by Equiv.sumEquivSigmalCond.
Don't use this definition directly. This is the key algorithm behind
Matrix.schur_triangulation.
set_option maxHeartbeats 800000 in
set_option maxRecDepth 2000 in
set_option backward.isDefEq.respectTransparency false in
protected noncomputable def SchurTriangulationAux.of
[ NormedAddCommGroup E ] [ InnerProductSpace 𝕜 E ] [ FiniteDimensional 𝕜 E ] ( f : Module.End 𝕜 E ) :
SchurTriangulationAux f :=
haveI : Decidable ( Nontrivial E ) := Classical.propDecidable _
if hE : Nontrivial E then
let μ : f . Eigenvalues := default
let V : Submodule 𝕜 E := f . eigenspace μ
let W : Submodule 𝕜 E := V ᗮ
let m := Module.finrank 𝕜 V
have hdim : m + Module.finrank 𝕜 W = Module.finrank 𝕜 E := V . finrank_add_finrank_orthogonal
let g : Module.End 𝕜 W := Submodule.orthogonalProjectionOnto W ∘ₗ f . domRestrict W
let ⟨ n , hn , bW , hg ⟩ := SchurTriangulationAux.of g
have bV : OrthonormalBasis ( Fin m ) 𝕜 V := stdOrthonormalBasis 𝕜 V
have hV := V . orthogonalFamily_self
have int : DirectSum.IsInternal ( cond · V W ) :=
suffices ⨆ b , cond b V W = ⊤ from ( hV . decomposition this ) . isInternal _
( sup_eq_iSup V W ) . symm . trans Submodule.sup_orthogonal_of_hasOrthogonalProjection
let B ( b : Bool ) : OrthonormalBasis ( cond b ( Fin m ) ( Fin n ) ) 𝕜 ↥ ( cond b V W ) := b . rec bW bV
let bE : OrthonormalBasis ( Σ b , cond b ( Fin m ) ( Fin n ) ) 𝕜 E :=
int . collectedOrthonormalBasis hV B
let e := Equiv.finAddEquivSigmaCond
let basis := bE . reindex e . symm
{
basis
dim := m + n
hdim := hn ▸ hdim . symm
upperTriangular := fun i j ( hji : j < i ) => show toMatrixOrthonormal basis f i j = 0 from
have hB : ∀ s , bE s = B s . 1 s . 2
| ⟨ true , i ⟩ => show bE ⟨ true , i ⟩ = bV i from
show ( int . collectedBasis fun b => ( B b ) . toBasis ) . toOrthonormalBasis _ ⟨ true , i ⟩ = bV i
by All goals completed! 🐙 simp only [ Basis.coe_toOrthonormalBasis , DirectSum.IsInternal.collectedBasis_coe ,
cond_true , OrthonormalBasis.coe_toBasis , B , V , W ] All goals completed! 🐙
| ⟨ false , j ⟩ => show bE ⟨ false , j ⟩ = bW j from
show ( int . collectedBasis fun b => ( B b ) . toBasis ) . toOrthonormalBasis _ ⟨ false , j ⟩ = bW j
by All goals completed! 🐙 simp only [ Basis.coe_toOrthonormalBasis , DirectSum.IsInternal.collectedBasis_coe ,
cond_false , OrthonormalBasis.coe_toBasis , B , V , W ] All goals completed! 🐙
have hf { bi i' bj j' } ( hi : e i = ⟨ bi , i' ⟩ ) ( hj : e j = ⟨ bj , j' ⟩ ) :=
calc toMatrixOrthonormal basis f i j
_ = toMatrixOrthonormal bE f ( e i ) ( e j ) := by 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ( toMatrixOrthonormal basis ) f i j = ( toMatrixOrthonormal bE ) f ( e i ) ( e j )
rw [ f . toMatrixOrthonormal_reindex 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ( Matrix.reindex e . symm e . symm ) ( ( toMatrixOrthonormal bE ) f ) i j = ( toMatrixOrthonormal bE ) f ( e i ) ( e j ) 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ( Matrix.reindex e . symm e . symm ) ( ( toMatrixOrthonormal bE ) f ) i j = ( toMatrixOrthonormal bE ) f ( e i ) ( e j ) ] 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ( Matrix.reindex e . symm e . symm ) ( ( toMatrixOrthonormal bE ) f ) i j = ( toMatrixOrthonormal bE ) f ( e i ) ( e j )
rfl All goals completed! 🐙
_ = ⟪ bE ( e i ) , f ( bE ( e j ) ) ⟫_ 𝕜 := f . toMatrixOrthonormal_apply_apply ..
_ = ⟪ ( B bi i' : E ) , f ( B bj j' ) ⟫_ 𝕜 := by 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ⟪ bE ( e i ) , f ( bE ( e j ) ) ⟫_ 𝕜 = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 rw [ hB , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ⟪ ↑ ( ( B ( e i ) . fst ) ( e i ) . snd ) , f ( bE ( e j ) ) ⟫_ 𝕜 = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 All goals completed! 🐙 hB , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ⟪ ↑ ( ( B ( e i ) . fst ) ( e i ) . snd ) , f ↑ ( ( B ( e j ) . fst ) ( e j ) . snd ) ⟫_ 𝕜 = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 All goals completed! 🐙 hi , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ⟪ ↑ ( ( B ⟨ bi , i' ⟩ . fst ) ⟨ bi , i' ⟩ . snd ) , f ↑ ( ( B ( e j ) . fst ) ( e j ) . snd ) ⟫_ 𝕜 = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 All goals completed! 🐙 hj 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) bi : Bool i' : bif bi then Fin m else Fin n bj : Bool j' : bif bj then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ hj : e j = ⟨ bj , j' ⟩ ⊢ ⟪ ↑ ( ( B ⟨ bi , i' ⟩ . fst ) ⟨ bi , i' ⟩ . snd ) , f ↑ ( ( B ⟨ bj , j' ⟩ . fst ) ⟨ bj , j' ⟩ . snd ) ⟫_ 𝕜 = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 All goals completed! 🐙 ] All goals completed! 🐙
if hj : j < m then
let j' : Fin m := ⟨ j , hj ⟩
have hf' { bi i' } ( hi : e i = ⟨ bi , i' ⟩ ) ( h0 : ⟪ ( B bi i' : E ) , bV j' ⟫_ 𝕜 = 0 ) :=
calc toMatrixOrthonormal basis f i j
_ = ⟪ ( B bi i' : E ) , f _ ⟫_ 𝕜 := hf hi ( Equiv.finAddEquivSigmaCond_true hj )
_ = ⟪ _ , f ( bV j' ) ⟫_ 𝕜 := rfl
_ = 0 :=
suffices f ( bV j' ) = μ . val • bV j' by 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this✝ : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ↑ j < m j' : Fin m := ⟨ ↑ j , hj ⟩ bi : Bool i' : bif bi then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ h0 : ⟪ ↑ ( ( B bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 this : f ↑ ( bV j' ) = ↑ f μ • ↑ ( bV j' ) ⊢ ⟪ ↑ ( ( (fun b => Bool.rec bW bV b ) bi ) i' ) , f ↑ ( bV j' ) ⟫_ 𝕜 = 0 rw [ this , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this✝ : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ↑ j < m j' : Fin m := ⟨ ↑ j , hj ⟩ bi : Bool i' : bif bi then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ h0 : ⟪ ↑ ( ( B bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 this : f ↑ ( bV j' ) = ↑ f μ • ↑ ( bV j' ) ⊢ ⟪ ↑ ( ( (fun b => Bool.rec bW bV b ) bi ) i' ) , ↑ f μ • ↑ ( bV j' ) ⟫_ 𝕜 = 0 All goals completed! 🐙 inner_smul_right , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this✝ : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ↑ j < m j' : Fin m := ⟨ ↑ j , hj ⟩ bi : Bool i' : bif bi then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ h0 : ⟪ ↑ ( ( B bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 this : f ↑ ( bV j' ) = ↑ f μ • ↑ ( bV j' ) ⊢ ↑ f μ * ⟪ ↑ ( ( (fun b => Bool.rec bW bV b ) bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 All goals completed! 🐙 h0 , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this✝ : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ↑ j < m j' : Fin m := ⟨ ↑ j , hj ⟩ bi : Bool i' : bif bi then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ h0 : ⟪ ↑ ( ( B bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 this : f ↑ ( bV j' ) = ↑ f μ • ↑ ( bV j' ) ⊢ ↑ f μ * 0 = 0 All goals completed! 🐙 mul_zero 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this✝ : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ↑ j < m j' : Fin m := ⟨ ↑ j , hj ⟩ bi : Bool i' : bif bi then Fin m else Fin n hi : e i = ⟨ bi , i' ⟩ h0 : ⟪ ↑ ( ( B bi ) i' ) , ↑ ( bV j' ) ⟫_ 𝕜 = 0 this : f ↑ ( bV j' ) = ↑ f μ • ↑ ( bV j' ) ⊢ 0 = 0 All goals completed! 🐙 ] All goals completed! 🐙
suffices f . HasEigenvector μ ( bV j' ) from this . apply_eq_smul
⟨ ( bV j' ) . property , fun h => bV . toBasis . ne_zero j' ( Subtype.ext h ) ⟩
if hi : i < m then
let i' : Fin m := ⟨ i , hi ⟩
suffices ⟪ ( bV i' : E ) , bV j' ⟫_ 𝕜 = 0 from hf' ( Equiv.finAddEquivSigmaCond_true hi ) this
bV . orthonormal . right ( Fin.ne_of_gt hji )
else
let i' : Fin n := i . subNat' hi
suffices ⟪ ( bW i' : E ) , bV j' ⟫_ 𝕜 = 0 from hf' ( Equiv.finAddEquivSigmaCond_false hi ) this
V . inner_left_of_mem_orthogonal ( bV j' ) . property ( bW i' ) . property
else
have hi ( h : i < m ) : False := hj ( Nat.lt_trans hji h )
let i' : Fin n := i . subNat' hi
let j' : Fin n := j . subNat' hj
calc toMatrixOrthonormal basis f i j
_ = ⟪ ( bW i' : E ) , f ( bW j' ) ⟫_ 𝕜 :=
hf ( Equiv.finAddEquivSigmaCond_false hi ) ( Equiv.finAddEquivSigmaCond_false hj )
_ = ⟪ bW i' , g ( bW j' ) ⟫_ 𝕜 := by 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ bW i' , g ( bW j' ) ⟫_ 𝕜
rw [ coe_comp , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ bW i' , ( ⇑ ↑ W . orthogonalProjectionOnto ∘ ⇑ ( domRestrict f W ) ) ( bW j' ) ⟫_ 𝕜 All goals completed! 🐙 ContinuousLinearMap.coe_coe , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ bW i' , ( ⇑ W . orthogonalProjectionOnto ∘ ⇑ ( domRestrict f W ) ) ( bW j' ) ⟫_ 𝕜 All goals completed! 🐙 Function.comp_apply , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ bW i' , W . orthogonalProjectionOnto ( ( domRestrict f W ) ( bW j' ) ) ⟫_ 𝕜 All goals completed! 🐙 domRestrict_apply , 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ bW i' , W . orthogonalProjectionOnto ( f ↑ ( bW j' ) ) ⟫_ 𝕜 All goals completed! 🐙
Submodule.inner_orthogonalProjectionOnto_eq_of_mem_left 𝕜 : Type ?u.3 inst✝⁴ : RCLike 𝕜 inst✝³ : IsAlgClosed 𝕜 E : Type ?u.113 inst✝² : NormedAddCommGroup E inst✝¹ : InnerProductSpace 𝕜 E inst✝ : FiniteDimensional 𝕜 E f : End 𝕜 E this : Decidable ( Nontrivial E ) hE : Nontrivial E μ : f . Eigenvalues := default V : Submodule 𝕜 E := f . eigenspace ( ↑ f 1 μ ) W : Submodule 𝕜 E := V ᗮ m : ℕ := finrank 𝕜 ↥ V hdim : m + finrank 𝕜 ↥ W = finrank 𝕜 E g : End 𝕜 ↥ W := ↑ W . orthogonalProjectionOnto ∘ₗ domRestrict f W n : ℕ hn : finrank 𝕜 ↥ W = n bW : OrthonormalBasis ( Fin n ) 𝕜 ↥ W hg : ( ( toMatrix bW . toBasis bW . toBasis ) g ) . IsUpperTriangular bV : OrthonormalBasis ( Fin m ) 𝕜 ↥ V hV : OrthogonalFamily 𝕜 (fun b => ↥ (bif b then V else V ᗮ ) ) fun b => (bif b then V else V ᗮ ) . subtypeₗᵢ int : DirectSum.IsInternal fun x => bif x then V else W B : ( b : Bool ) → OrthonormalBasis (bif b then Fin m else Fin n ) 𝕜 ↥ (bif b then V else W ) := fun b => Bool.rec bW bV b bE : OrthonormalBasis (( b : Bool ) × bif b then Fin m else Fin n ) 𝕜 E := DirectSum.IsInternal.collectedOrthonormalBasis hV int B e : Fin ( m + n ) ≃ ( b : Bool ) × bif b then Fin m else Fin n := Equiv.finAddEquivSigmaCond basis : OrthonormalBasis ( Fin ( m + n ) ) 𝕜 E := bE . reindex e . symm i : Fin ( m + n ) j : Fin ( m + n ) hji : j < i hB : ∀ ( s : ( b : Bool ) × bif b then Fin m else Fin n ), bE s = ↑ ( ( B s . fst ) s . snd ) hf : ∀ { bi : Bool } { i' : bif bi then Fin m else Fin n } { bj : Bool } { j' : bif bj then Fin m else Fin n },
e i = ⟨ bi , i' ⟩ → e j = ⟨ bj , j' ⟩ → ( toMatrixOrthonormal basis ) f i j = ⟪ ↑ ( ( B bi ) i' ) , f ↑ ( ( B bj ) j' ) ⟫_ 𝕜 hj : ¬ ↑ j < m hi : ↑ i < m → False i' : Fin n := i . subNat' hi j' : Fin n := j . subNat' hj ⊢ ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 = ⟪ ↑ ( bW i' ) , f ↑ ( bW j' ) ⟫_ 𝕜 All goals completed! 🐙 ] All goals completed! 🐙
_ = toMatrixOrthonormal bW g i' j' := ( g . toMatrixOrthonormal_apply_apply .. ) . symm
_ = 0 := hg ( Nat.sub_lt_sub_right ( Nat.le_of_not_lt hj ) hji )
}
else
haveI : Subsingleton E := not_nontrivial_iff_subsingleton . mp hE
{
dim := 0
hdim := Module.finrank_zero_of_subsingleton
basis := ( Basis.empty E ) . toOrthonormalBasis ⟨ nofun , nofun ⟩
upperTriangular := nofun
}
termination_by Module.finrank 𝕜 E
decreasing_by exact
calc Module.finrank 𝕜 W
_ < m + Module.finrank 𝕜 W :=
suffices 0 < m from Nat.lt_add_of_pos_left this
Submodule.one_le_finrank_iff . mpr μ . property
_ = Module.finrank 𝕜 E := hdim All goals completed! 🐙
Schur triangulation , Schur decomposition for matrices over an algebraically closed
field. In particular, a complex matrix can be converted to upper-triangular form by a change of
basis. In other words, any complex matrix is unitarily similar to an upper triangular matrix.