Theorem: Module.End.apply_eq_of_mem_genEigenspace_of_comm_of_isSemisimple_of_isNilpotent_sub
File: Mathlib/LinearAlgebra/Eigenspace/Semisimple.lean

tactic: set p := f.genEigenspace μ k
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hm : m ∈ (f.genEigenspace μ) k
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
⊢ g m = μ • m

tactic: have h₁ : MapsTo g p p := mapsTo_genEigenspace_of_comm hfg μ k
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
⊢ g m = μ • m

tactic: have h₂ : MapsTo (g - algebraMap R (End R M) μ) p p :=
  mapsTo_genEigenspace_of_comm (hfg.sub_right <| Algebra.commute_algebraMap_right μ f) μ k
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
⊢ g m = μ • m

tactic: have h₃ : MapsTo (f - g) p p :=
  mapsTo_genEigenspace_of_comm (Commute.sub_right rfl hfg) μ k
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
⊢ g m = μ • m

tactic: have h₄ : MapsTo (f - algebraMap R (End R M) μ) p p :=
  mapsTo_genEigenspace_of_comm (Algebra.mul_sub_algebraMap_commutes f μ) μ k
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
⊢ g m = μ • m

tactic: replace hfg : Commute (f - algebraMap R (End R M) μ) (f - g) :=
  (Commute.sub_right rfl hfg).sub_left <| Algebra.commute_algebraMap_left μ (f - g)
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hfg : Commute f g
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
⊢ g m = μ • m

tactic: suffices IsNilpotent ((g - algebraMap R (End R M) μ).restrict h₂) by
  replace this : g.restrict h₁ - algebraMap R (End R p) μ = 0 :=
    eq_zero_of_isNilpotent_isSemisimple this (by simpa using hss.restrict)
  simpa [LinearMap.restrict_apply, sub_eq_zero] using LinearMap.congr_fun this ⟨m, hm⟩
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
⊢ IsNilpotent (LinearMap.restrict (g - (algebraMap R (End R M)) μ) h₂)

tactic: simpa [LinearMap.restrict_sub h₄ h₃] using (LinearMap.restrict_commute hfg h₄ h₃).isNilpotent_sub
  (f.isNilpotent_restrict_sub_algebraMap μ k) (Module.End.isNilpotent.restrict h₃ hnil)
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
⊢ IsNilpotent (LinearMap.restrict (g - (algebraMap R (End R M)) μ) h₂)
state_after: no goals

tactic: replace this : g.restrict h₁ - algebraMap R (End R p) μ = 0 :=
  eq_zero_of_isNilpotent_isSemisimple this (by simpa using hss.restrict)
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
this : IsNilpotent (LinearMap.restrict (g - (algebraMap R (End R M)) μ) h₂)
⊢ g m = μ • m
state_after: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
this : LinearMap.restrict g h₁ - (algebraMap R (End R ↥p)) μ = 0
⊢ g m = μ • m

tactic: simpa [LinearMap.restrict_apply, sub_eq_zero] using LinearMap.congr_fun this ⟨m, hm⟩
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
this : LinearMap.restrict g h₁ - (algebraMap R (End R ↥p)) μ = 0
⊢ g m = μ • m
state_after: no goals

tactic: simpa using hss.restrict
state_before: R : Type u_1
M : Type u_2
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f g : End R M
μ : R
k : ℕ
m : M
hss : g.IsSemisimple
hnil : IsNilpotent (f - g)
p : Submodule R M := (f.genEigenspace μ) k
hm : m ∈ p
h₁ : MapsTo ⇑g ↑p ↑p
h₂ : MapsTo ⇑(g - (algebraMap R (End R M)) μ) ↑p ↑p
h₃ : MapsTo ⇑(f - g) ↑p ↑p
h₄ : MapsTo ⇑(f - (algebraMap R (End R M)) μ) ↑p ↑p
hfg : Commute (f - (algebraMap R (End R M)) μ) (f - g)
this : IsNilpotent (LinearMap.restrict (g - (algebraMap R (End R M)) μ) h₂)
⊢ IsSemisimple (LinearMap.restrict g h₁ - (algebraMap R (End R ↥p)) μ)
state_after: no goals