Theorem: Module.End.IsSemisimple.of_mem_adjoin_pair
File: Mathlib/LinearAlgebra/Semisimple.lean

Proof steps:
state_before: R : Type u_1
M : Type u_2
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
⊢ a.IsSemisimple
tactic: let R := K[X] ⧸ Ideal.span {minpoly K f}
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
⊢ a.IsSemisimple
tactic: let S := AdjoinRoot ((minpoly K g).map <| algebraMap K R)
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this : Finite K R
⊢ a.IsSemisimple
tactic: have : Finite K R :=
    (AdjoinRoot.powerBasis' <| minpoly.monic <| Algebra.IsIntegral.isIntegral f).finite
state_before: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this : Finite K R
⊢ a.IsSemisimple
state_after: R✝ : Type u_1
M : Type u_2
inst✝⁶ : CommRing R✝
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R✝ M
K : Type u_3
inst✝³ : Field K
inst✝² : Module K M
f g : End K M
inst✝¹ : FiniteDimensional K M
inst✝ : PerfectField K
comm : Commute f g
hf : f.IsSemisimple
hg : g.IsSemisimple
a : End K M
ha : a ∈ Algebra.adjoin K {f, g}
R : Type u_3 := K[X] ⧸ Ideal.span {minpoly K f}
S : Type u_3 := AdjoinRoot (map (algebraMap K R) (minpoly K g))
this✝ : Finite K R
this : Finite R S
⊢ a.IsSemisimple
tactic: have : Finite R S :=
    (AdjoinRoot.powerBasis' <| (minpoly.monic <| Algebra.IsIntegral.isIntegral g).map _).finite