-- Mathlib/LinearAlgebra/Eigenspace/Matrix.lean
/-- Eigenvalues of a diagonal linear operator are the diagonal entries. -/
lemma hasEigenvalue_toLin_diagonal_iff (d : n → R) {μ : R} [NoZeroSMulDivisors R M]
    (b : Basis n R M) : HasEigenvalue (toLin b b (diagonal d)) μ ↔ ∃ i, d i = μ

Proof state:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
⊢ False

Tactic:
have h_iSup : ⨆ μ ∈ Set.range d, eigenspace (toLin b b (diagonal d)) μ = ⊤ := by
  rw [eq_top_iff, ← b.span_eq, Submodule.span_le]
  rintro - ⟨i, rfl⟩
  simp only [SetLike.mem_coe]
  apply Submodule.mem_iSup_of_mem (d i)
  apply Submodule.mem_iSup_of_mem ⟨i, rfl⟩
  rw [mem_eigenspace_iff]
  exact (hasEigenvector_toLin_diagonal d i b).apply_eq_smul

Result:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
h_iSup : ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ = ⊤
⊢ False

Proof state:
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
⊢ Set.range ⇑b ⊆ ↑(⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ)

Tactic:
rintro - ⟨i, rfl⟩

Result:
case intro
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
i : n
⊢ b i ∈ ↑(⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ)

Proof state:
case mpr.intro
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
i : n
⊢ HasEigenvalue ((toLin b b) (diagonal d)) (d i)

Tactic:
exact this i

Result:
no goals

Proof state:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
⊢ (∀ (i : n), d i ≠ μ) → ¬HasEigenvalue ((toLin b b) (diagonal d)) μ

Tactic:
intro hμ h_eig

Result:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
⊢ False

Proof state:
case intro
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
i : n
⊢ b i ∈ ↑(⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ)

Tactic:
simp only [SetLike.mem_coe]

Result:
case intro
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
i : n
⊢ b i ∈ ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ

Proof state:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
h_iSup : ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ = ⊤
hμ_not_mem : μ ∉ Set.range d
⊢ False

Tactic:
have := eigenspaces_iSupIndep (toLin b b (diagonal d)) |>.disjoint_biSup hμ_not_mem

Result:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this✝ : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
h_iSup : ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ = ⊤
hμ_not_mem : μ ∉ Set.range d
this : Disjoint (eigenspace ((toLin b b) (diagonal d)) μ) (⨆ i ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) i)
⊢ False

Proof state:
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
⊢ HasEigenvalue ((toLin b b) (diagonal d)) μ ↔ ∃ i, d i = μ

Tactic:
have (i : n) : HasEigenvalue (toLin b b (diagonal d)) (d i) :=
  hasEigenvalue_of_hasEigenvector <| hasEigenvector_toLin_diagonal d i b

Result:
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
⊢ HasEigenvalue ((toLin b b) (diagonal d)) μ ↔ ∃ i, d i = μ

Proof state:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
h_iSup : ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ = ⊤
⊢ False

Tactic:
have hμ_not_mem : μ ∉ Set.range d := by simpa using fun i ↦ (hμ i)

Result:
case mp
R : Type u_1
n : Type u_2
M : Type u_3
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : CommRing R
inst✝³ : Nontrivial R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
d : n → R
μ : R
inst✝ : NoZeroSMulDivisors R M
b : Basis n R M
this : ∀ (i : n), HasEigenvalue ((toLin b b) (diagonal d)) (d i)
hμ : ∀ (i : n), d i ≠ μ
h_eig : HasEigenvalue ((toLin b b) (diagonal d)) μ
h_iSup : ⨆ μ ∈ Set.range d, eigenspace ((toLin b b) (diagonal d)) μ = ⊤
hμ_not_mem : μ ∉ Set.range d
⊢ False