Theorem: isPurelyInseparable_iff_pow_mem
File: Mathlib/FieldTheory/PurelyInseparable.lean

tactic: rw [isPurelyInseparable_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
q : ℕ
inst✝ : ExpChar F q
⊢ IsPurelyInseparable F E ↔ ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
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
q : ℕ
inst✝ : ExpChar F q
⊢ (∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)) ↔
    ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range

tactic: refine ⟨fun h x ↦ ?_, fun h x ↦ ?_⟩
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
q : ℕ
inst✝ : ExpChar F q
⊢ (∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)) ↔
    ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
state_after: case refine_1
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
x : E
⊢ ∃ n, x ^ q ^ n ∈ (algebraMap F E).range

case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)

tactic: have hdeg := (minpoly.natSepDegree_eq_one_iff_pow_mem q).2 (h x)
state_before: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
state_after: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)

tactic: have halg : IsIntegral F x := by_contra fun h' ↦ by
  simp only [minpoly.eq_zero h', natSepDegree_zero, zero_ne_one] at hdeg
state_before: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
state_after: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
halg : IsIntegral F x
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)

tactic: refine ⟨halg, fun hsep ↦ ?_⟩
state_before: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
halg : IsIntegral F x
⊢ IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
state_after: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
halg : IsIntegral F x
hsep : (minpoly F x).Separable
⊢ x ∈ (algebraMap F E).range

tactic: rw [hsep.natSepDegree_eq_natDegree, ← adjoin.finrank halg,
  IntermediateField.finrank_eq_one_iff] at hdeg
state_before: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
halg : IsIntegral F x
hsep : (minpoly F x).Separable
⊢ x ∈ (algebraMap F E).range
state_after: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : F⟮x⟯ = ⊥
halg : IsIntegral F x
hsep : (minpoly F x).Separable
⊢ x ∈ (algebraMap F E).range

tactic: simpa only [hdeg] using mem_adjoin_simple_self F x
state_before: case refine_2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : F⟮x⟯ = ⊥
halg : IsIntegral F x
hsep : (minpoly F x).Separable
⊢ x ∈ (algebraMap F E).range
state_after: no goals

tactic: obtain ⟨g, h1, n, h2⟩ := (minpoly.irreducible (h x).1).hasSeparableContraction q
state_before: case refine_1
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
x : E
⊢ ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
state_after: case refine_1.intro.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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
x : E
g : F[X]
h1 : g.Separable
n : ℕ
h2 : (expand F (q ^ n)) g = minpoly F x
⊢ ∃ n, x ^ q ^ n ∈ (algebraMap F E).range

tactic: exact ⟨n, (h _).2 <| h1.of_dvd <| minpoly.dvd F _ <| by
  simpa only [expand_aeval, minpoly.aeval] using congr_arg (aeval x) h2⟩
state_before: case refine_1.intro.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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
x : E
g : F[X]
h1 : g.Separable
n : ℕ
h2 : (expand F (q ^ n)) g = minpoly F x
⊢ ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
state_after: no goals

tactic: simpa only [expand_aeval, minpoly.aeval] using congr_arg (aeval x) h2
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), IsIntegral F x ∧ ((minpoly F x).Separable → x ∈ (algebraMap F E).range)
x : E
g : F[X]
h1 : g.Separable
n : ℕ
h2 : (expand F (q ^ n)) g = minpoly F x
⊢ (aeval (x ^ q ^ n)) g = 0
state_after: no goals

tactic: simp only [minpoly.eq_zero h', natSepDegree_zero, zero_ne_one] at hdeg
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
q : ℕ
inst✝ : ExpChar F q
h : ∀ (x : E), ∃ n, x ^ q ^ n ∈ (algebraMap F E).range
x : E
hdeg : (minpoly F x).natSepDegree = 1
h' : ¬IsIntegral F x
⊢ False
state_after: no goals