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

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
inst✝¹ : 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✝ : IsSeparable F ↥L
⊢ L = adjoin F ((fun x => x ^ q ^ n) '' S)

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✝ : 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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
hi : M ≤ L
⊢ 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✝ : 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✝ : 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: haveI : IsSeparable M (extendScalars hi) := 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✝ : 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✝ : 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 : IsSeparable ↥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✝ : 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 : 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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : IsPurelyInseparable ↥M ↥(extendScalars hi)
⊢ L = M

tactic: simpa only [extendScalars_restrictScalars, restrictScalars_bot_eq_self] using congr_arg
  (restrictScalars F) (extendScalars hi).eq_bot_of_isPurelyInseparable_of_isSeparable
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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : IsPurelyInseparable ↥M ↥(extendScalars hi)
⊢ L = M
state_after: no goals

tactic: rw [adjoin_le_iff]
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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
⊢ M ≤ L
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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
⊢ (fun x => x ^ q ^ n) '' S ≤ ↑L

tactic: rintro _ ⟨y, hy, 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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
⊢ (fun x => x ^ q ^ n) '' S ≤ ↑L
state_after: case intro.intro
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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
y : E
hy : y ∈ S
⊢ (fun x => x ^ q ^ n) y ∈ ↑L

tactic: exact pow_mem (subset_adjoin F S hy) _
state_before: case intro.intro
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✝ : IsSeparable F ↥L
M : IntermediateField F E := adjoin F ((fun x => x ^ q ^ n) '' S)
y : E
hy : y ∈ S
⊢ (fun x => x ^ q ^ n) y ∈ ↑L
state_after: no goals

tactic: haveI := expChar_of_injective_algebraMap (algebraMap F M).injective q
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✝ : 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 : IsSeparable ↥M ↥(extendScalars hi)
⊢ IsPurelyInseparable ↥M ↥(extendScalars hi)
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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : ExpChar (↥M) q
⊢ IsPurelyInseparable ↥M ↥(extendScalars hi)

tactic: rw [extendScalars_adjoin hi, isPurelyInseparable_adjoin_iff_pow_mem M _ q]
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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : ExpChar (↥M) q
⊢ IsPurelyInseparable ↥M ↥(extendScalars hi)
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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : ExpChar (↥M) q
⊢ ∀ x ∈ S, ∃ n, x ^ q ^ n ∈ (algebraMap (↥M) E).range

tactic: 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✝ : 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✝ : IsSeparable ↥M ↥(extendScalars hi)
this : ExpChar (↥M) q
⊢ ∀ x ∈ S, ∃ n, x ^ q ^ n ∈ (algebraMap (↥M) E).range
state_after: no goals