Theorem: IsGalois.of_separable_splitting_field
File: Mathlib/FieldTheory/Galois.lean

Proof steps:
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
⊢ IsGalois F E
tactic: haveI hFE : FiniteDimensional F E := Polynomial.IsSplittingField.finiteDimensional E p
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
⊢ IsGalois F E
tactic: letI := Classical.decEq E
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
⊢ IsGalois F E
tactic: let s := p.rootSet E
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
⊢ IsGalois F E
tactic: have adjoin_root : IntermediateField.adjoin F s = ⊤ := by
    apply IntermediateField.toSubalgebra_injective
    rw [IntermediateField.top_toSubalgebra, ← top_le_iff, ← sp.adjoin_rootSet]
    apply IntermediateField.algebra_adjoin_le_adjoin
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ IsGalois F E
tactic: let P : IntermediateField F E → Prop := fun K => Fintype.card (K →ₐ[F] E) = finrank F K
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ IsGalois F E
state_after: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ P (IntermediateField.adjoin F s)
tactic: suffices P (IntermediateField.adjoin F s) by
    rw [adjoin_root] at this
    apply of_card_aut_eq_finrank
    rw [← Eq.trans this (LinearEquiv.finrank_eq IntermediateField.topEquiv.toLinearEquiv)]
    exact Fintype.card_congr ((algEquivEquivAlgHom F E).toEquiv.trans
      (IntermediateField.topEquiv.symm.arrowCongr AlgEquiv.refl))
state_before: F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ P (IntermediateField.adjoin F s)
state_after: case base
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ P ⊥

case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ ∀ (K : IntermediateField F E), ∀ x ∈ (p.aroots E).toFinset, P K → P (IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: apply IntermediateField.induction_on_adjoin_finset _ P
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ ∀ (K : IntermediateField F E), ∀ x ∈ (p.aroots E).toFinset, P K → P (IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : P K
⊢ P (IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: intro K x hx hK
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : P K
⊢ P (IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: simp only [P] at *
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: letI := K⟮x⟯.module
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: letI := K⟮x⟯.isScalarTower (R := F)
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ Fintype.card (↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) →ₐ[F] E) =
    finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ finrank F ↥(↥K)⟮x⟯ = finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
tactic: rw [of_separable_splitting_field_aux hp K (Multiset.mem_toFinset.mp hx), hK, finrank_mul_finrank]
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ finrank F ↥(↥K)⟮x⟯ = finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯)
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) = finrank F ↥(↥K)⟮x⟯
tactic: symm
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ finrank F ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) = finrank F ↥(↥K)⟮x⟯
state_after: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) ≃ₗ[F] ↥(↥K)⟮x⟯
tactic: refine LinearEquiv.finrank_eq ?_
state_before: case ih
F : Type u_1
inst✝² : Field F
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
p : F[X]
sp : Polynomial.IsSplittingField F E p
hp : p.Separable
hFE : FiniteDimensional F E
this✝¹ : DecidableEq E := Classical.decEq E
s : Set E := p.rootSet E
adjoin_root : IntermediateField.adjoin F s = ⊤
P : IntermediateField F E → Prop := fun K => Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
K : IntermediateField F E
x : E
hx : x ∈ (p.aroots E).toFinset
hK : Fintype.card (↥K →ₐ[F] E) = finrank F ↥K
this✝ : Module ↥K ↥(↥K)⟮x⟯ := (↥K)⟮x⟯.module
this : IsScalarTower F ↥K ↥(↥K)⟮x⟯ := IntermediateField.isScalarTower (↥K)⟮x⟯
⊢ ↥(IntermediateField.restrictScalars F (↥K)⟮x⟯) ≃ₗ[F] ↥(↥K)⟮x⟯
state_after: no goals
tactic: rfl