Theorem: Module.End.hasEigenvalue_of_isRoot
File: Mathlib/LinearAlgebra/Eigenspace/Minpoly.lean

tactic: cases' dvd_iff_isRoot.2 h with p hp
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
⊢ f.HasEigenvalue μ
state_after: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
⊢ f.HasEigenvalue μ

tactic: rw [HasEigenvalue, eigenspace]
state_before: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
⊢ f.HasEigenvalue μ
state_after: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
⊢ LinearMap.ker (f - (algebraMap K (End K V)) μ) ≠ ⊥

tactic: intro con
state_before: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
⊢ LinearMap.ker (f - (algebraMap K (End K V)) μ) ≠ ⊥
state_after: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
⊢ False

tactic: cases' (LinearMap.isUnit_iff_ker_eq_bot _).2 con with u hu
state_before: case intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
⊢ False

tactic: have p_ne_0 : p ≠ 0 := by
  intro con
  apply minpoly.ne_zero (Algebra.IsIntegral.isIntegral (R := K) f)
  rw [hp, con, mul_zero]
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
⊢ False

tactic: have : (aeval f) p = 0 := by
  have h_aeval := minpoly.aeval K f
  revert h_aeval
  simp [hp, ← hu]
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
⊢ False

tactic: have h_deg := minpoly.degree_le_of_ne_zero K f p_ne_0 this
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : (minpoly K f).degree ≤ p.degree
⊢ False

tactic: rw [hp, degree_mul, degree_X_sub_C, Polynomial.degree_eq_natDegree p_ne_0] at h_deg
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : (minpoly K f).degree ≤ p.degree
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : 1 + ↑p.natDegree ≤ ↑p.natDegree
⊢ False

tactic: norm_cast at h_deg
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : 1 + ↑p.natDegree ≤ ↑p.natDegree
⊢ False
state_after: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : 1 + p.natDegree ≤ p.natDegree
⊢ False

tactic: omega
state_before: case intro.intro
K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
this : (aeval f) p = 0
h_deg : 1 + p.natDegree ≤ p.natDegree
⊢ False
state_after: no goals

tactic: intro con
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
⊢ p ≠ 0
state_after: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con✝ : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
con : p = 0
⊢ False

tactic: apply minpoly.ne_zero (Algebra.IsIntegral.isIntegral (R := K) f)
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con✝ : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
con : p = 0
⊢ False
state_after: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con✝ : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
con : p = 0
⊢ minpoly K f = 0

tactic: rw [hp, con, mul_zero]
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con✝ : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
con : p = 0
⊢ minpoly K f = 0
state_after: no goals

tactic: have h_aeval := minpoly.aeval K f
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
⊢ (aeval f) p = 0
state_after: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
h_aeval : (aeval f) (minpoly K f) = 0
⊢ (aeval f) p = 0

tactic: revert h_aeval
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
h_aeval : (aeval f) (minpoly K f) = 0
⊢ (aeval f) p = 0
state_after: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
⊢ (aeval f) (minpoly K f) = 0 → (aeval f) p = 0

tactic: simp [hp, ← hu]
state_before: K : Type v
V : Type w
inst✝³ : Field K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : FiniteDimensional K V
f : End K V
μ : K
h : (minpoly K f).IsRoot μ
p : K[X]
hp : minpoly K f = (X - C μ) * p
con : LinearMap.ker (f - (algebraMap K (End K V)) μ) = ⊥
u : (V →ₗ[K] V)ˣ
hu : ↑u = f - (algebraMap K (End K V)) μ
p_ne_0 : p ≠ 0
⊢ (aeval f) (minpoly K f) = 0 → (aeval f) p = 0
state_after: no goals