Theorem: gal_isSolvable_tower
File: Mathlib/FieldTheory/AbelRuffini.lean

Proof steps:
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
⊢ IsSolvable q.Gal
tactic: let K := p.SplittingField
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
⊢ IsSolvable q.Gal
tactic: let L := q.SplittingField
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
⊢ IsSolvable q.Gal
tactic: haveI : Fact (p.Splits (algebraMap F L)) := ⟨hpq⟩
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
⊢ IsSolvable q.Gal
tactic: let ϕ : (L ≃ₐ[K] L) ≃* (q.map (algebraMap F K)).Gal :=
    (IsSplittingField.algEquiv L (q.map (algebraMap F K))).autCongr
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
⊢ IsSolvable q.Gal
tactic: have ϕ_inj : Function.Injective ϕ.toMonoidHom := ϕ.injective
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this✝ : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
this : IsSolvable (K ≃ₐ[F] K)
⊢ IsSolvable q.Gal
tactic: haveI : IsSolvable (K ≃ₐ[F] K) := hp
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this✝ : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
this : IsSolvable (K ≃ₐ[F] K)
⊢ IsSolvable q.Gal
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this✝¹ : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
this✝ : IsSolvable (K ≃ₐ[F] K)
this : IsSolvable (L ≃ₐ[K] L)
⊢ IsSolvable q.Gal
tactic: haveI : IsSolvable (L ≃ₐ[K] L) := solvable_of_solvable_injective ϕ_inj
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p q : F[X]
hpq : Splits (algebraMap F q.SplittingField) p
hp : IsSolvable p.Gal
hq : IsSolvable (Polynomial.map (algebraMap F p.SplittingField) q).Gal
K : Type u_1 := p.SplittingField
L : Type u_1 := q.SplittingField
this✝¹ : Fact (Splits (algebraMap F L) p)
ϕ : (L ≃ₐ[K] L) ≃* (Polynomial.map (algebraMap F K) q).Gal :=
  (IsSplittingField.algEquiv L (Polynomial.map (algebraMap F K) q)).autCongr
ϕ_inj : Function.Injective ⇑ϕ.toMonoidHom
this✝ : IsSolvable (K ≃ₐ[F] K)
this : IsSolvable (L ≃ₐ[K] L)
⊢ IsSolvable q.Gal
state_after: no goals
tactic: exact isSolvable_of_isScalarTower F p.SplittingField q.SplittingField