Theorem: IntermediateField.adjoin_eq_adjoin_pow_expChar_pow_of_isSeparable
File: Mathlib/FieldTheory/PurelyInseparable.lean

Proof steps:
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
inst✝¹ : Algebra.IsSeparable F ↥(adjoin F S)
q : ℕ
inst✝ : ExpChar F q
n : ℕ
⊢ adjoin F S = adjoin F ((fun x => x ^ q ^ n) '' S)
state_after: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
⊢ L = adjoin F ((fun x => x ^ q ^ n) '' S)
tactic: set L := adjoin F S
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
⊢ L = M
state_after: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
⊢ L = M
tactic: have hi : M ≤ L := by
    rw [adjoin_le_iff]
    rintro _ ⟨y, hy, rfl⟩
    exact pow_mem (subset_adjoin F S hy) _
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
⊢ L = M
state_after: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this : Algebra ↥M ↥L := (inclusion hi).toAlgebra
⊢ L = M
tactic: letI := (inclusion hi).toAlgebra
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this : Algebra ↥M ↥L := (inclusion hi).toAlgebra
⊢ L = M
state_after: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this✝ : Algebra ↥M ↥L := (inclusion hi).toAlgebra
this : Algebra.IsSeparable ↥M ↥(extendScalars hi)
⊢ L = M
tactic: haveI : Algebra.IsSeparable M (extendScalars hi) :=
    Algebra.isSeparable_tower_top_of_isSeparable F M L
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this✝ : Algebra ↥M ↥L := (inclusion hi).toAlgebra
this : Algebra.IsSeparable ↥M ↥(extendScalars hi)
⊢ L = M
state_after: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this✝¹ : Algebra ↥M ↥L := (inclusion hi).toAlgebra
this✝ : Algebra.IsSeparable ↥M ↥(extendScalars hi)
this : IsPurelyInseparable ↥M ↥(extendScalars hi)
⊢ L = M
tactic: haveI : IsPurelyInseparable M (extendScalars hi) := by
    haveI := expChar_of_injective_algebraMap (algebraMap F M).injective q
    rw [extendScalars_adjoin hi, isPurelyInseparable_adjoin_iff_pow_mem M _ q]
    exact fun x hx ↦ ⟨n, ⟨x ^ q ^ n, subset_adjoin F _ ⟨x, hx, rfl⟩⟩, rfl⟩
state_before: F : Type u
E : Type v
inst✝⁶ : Field F
inst✝⁵ : Field E
inst✝⁴ : Algebra F E
K : Type w
inst✝³ : Field K
inst✝² : Algebra F K
S : Set E
q : ℕ
inst✝¹ : ExpChar F q
n : ℕ
L : IntermediateField F E := adjoin F S
inst✝ : Algebra.IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
this✝¹ : Algebra ↥M ↥L := (inclusion hi).toAlgebra
this✝ : Algebra.IsSeparable ↥M ↥(extendScalars hi)
this : IsPurelyInseparable ↥M ↥(extendScalars hi)
⊢ L = M
state_after: no goals
tactic: simpa only [extendScalars_restrictScalars, restrictScalars_bot_eq_self] using congr_arg
    (restrictScalars F) (extendScalars hi).eq_bot_of_isPurelyInseparable_of_isSeparable