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

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
⊢ 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: 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
⊢ 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: 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
⊢ 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: 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
⊢ 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: 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 = ⊤
⊢ 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: 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
⊢ 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: apply IntermediateField.induction_on_adjoin_finset _ 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
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: 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 ∈ (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: 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 : 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: 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
⊢ 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⟯.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
⊢ 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: 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⟯
⊢ 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: 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 ↥(↥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: 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⟯
⊢ 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: rfl
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: apply IntermediateField.toSubalgebra_injective
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
⊢ IntermediateField.adjoin F s = ⊤
state_after: case a
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
⊢ (IntermediateField.adjoin F s).toSubalgebra = ⊤.toSubalgebra

tactic: rw [IntermediateField.top_toSubalgebra, ← top_le_iff, ← sp.adjoin_rootSet]
state_before: case a
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
⊢ (IntermediateField.adjoin F s).toSubalgebra = ⊤.toSubalgebra
state_after: case a
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
⊢ Algebra.adjoin F (p.rootSet E) ≤ (IntermediateField.adjoin F s).toSubalgebra

tactic: apply IntermediateField.algebra_adjoin_le_adjoin
state_before: case a
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
⊢ Algebra.adjoin F (p.rootSet E) ≤ (IntermediateField.adjoin F s).toSubalgebra
state_after: no goals

tactic: rw [adjoin_root] at this
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
this : P (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
this : P ⊤
⊢ IsGalois F E

tactic: apply of_card_aut_eq_finrank
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
this : P ⊤
⊢ IsGalois F E
state_after: case h
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
this : P ⊤
⊢ Fintype.card (E ≃ₐ[F] E) = finrank F E

tactic: rw [← Eq.trans this (LinearEquiv.finrank_eq IntermediateField.topEquiv.toLinearEquiv)]
state_before: case h
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
this : P ⊤
⊢ Fintype.card (E ≃ₐ[F] E) = finrank F E
state_after: case h
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
this : P ⊤
⊢ Fintype.card (E ≃ₐ[F] E) = Fintype.card (↥⊤ →ₐ[F] E)

tactic: exact Fintype.card_congr ((algEquivEquivAlgHom F E).toEquiv.trans
  (IntermediateField.topEquiv.symm.arrowCongr AlgEquiv.refl))
state_before: case h
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
this : P ⊤
⊢ Fintype.card (E ≃ₐ[F] E) = Fintype.card (↥⊤ →ₐ[F] E)
state_after: no goals

tactic: have key := IntermediateField.card_algHom_adjoin_integral F (K := E)
  (show IsIntegral F (0 : E) from isIntegral_zero)
state_before: 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 ⊥
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
key :
  (minpoly F 0).Separable →
    Polynomial.Splits (algebraMap F E) (minpoly F 0) → Fintype.card (↥F⟮0⟯ →ₐ[F] E) = (minpoly F 0).natDegree
⊢ P ⊥

tactic: rw [minpoly.zero, Polynomial.natDegree_X] at key
state_before: 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
key :
  (minpoly F 0).Separable →
    Polynomial.Splits (algebraMap F E) (minpoly F 0) → Fintype.card (↥F⟮0⟯ →ₐ[F] E) = (minpoly F 0).natDegree
⊢ P ⊥
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
key : Polynomial.X.Separable → Polynomial.Splits (algebraMap F E) Polynomial.X → Fintype.card (↥F⟮0⟯ →ₐ[F] E) = 1
⊢ P ⊥

tactic: specialize key Polynomial.separable_X (Polynomial.splits_X (algebraMap F E))
state_before: 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
key : Polynomial.X.Separable → Polynomial.Splits (algebraMap F E) Polynomial.X → Fintype.card (↥F⟮0⟯ →ₐ[F] E) = 1
⊢ P ⊥
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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = 1
⊢ P ⊥

tactic: rw [← @Subalgebra.finrank_bot F E _ _ _, ← IntermediateField.bot_toSubalgebra] at key
state_before: 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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = 1
⊢ P ⊥
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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ P ⊥

tactic: refine Eq.trans ?_ key
state_before: 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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ P ⊥
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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ Fintype.card (↥⊥ →ₐ[F] E) = Fintype.card (↥F⟮0⟯ →ₐ[F] E)

tactic: apply @Fintype.card_congr _ _ _ (_) _
state_before: 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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ Fintype.card (↥⊥ →ₐ[F] E) = Fintype.card (↥F⟮0⟯ →ₐ[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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ (↥⊥ →ₐ[F] E) ≃ (↥F⟮0⟯ →ₐ[F] E)

tactic: rw [IntermediateField.adjoin_zero]
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
key : Fintype.card (↥F⟮0⟯ →ₐ[F] E) = finrank F ↥⊥.toSubalgebra
⊢ (↥⊥ →ₐ[F] E) ≃ (↥F⟮0⟯ →ₐ[F] E)
state_after: no goals