Theorem: Polynomial.Gal.splits_in_splittingField_of_comp
File: Mathlib/FieldTheory/PolynomialGaloisGroup.lean

tactic: let P : F[X] → Prop := fun r => r.Splits (algebraMap F (r.comp q).SplittingField)
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
⊢ Splits (algebraMap F (p.comp q).SplittingField) p
state_after: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
⊢ Splits (algebraMap F (p.comp q).SplittingField) p

tactic: induction p using WfDvdMonoid.induction_on_irreducible with
| h0 => exact splits_zero _
| hu u hu => exact splits_of_isUnit (algebraMap F (SplittingField (comp u q))) hu
| hi p₁ p₂ _ hp₂ hp₁ => apply key2 (key1 hp₂) hp₁
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
key2 : ∀ {p₁ p₂ : F[X]}, P p₁ → P p₂ → P (p₁ * p₂)
⊢ Splits (algebraMap F (p.comp q).SplittingField) p
state_after: no goals

tactic: intro r hr
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
⊢ ∀ {r : F[X]}, Irreducible r → P r
state_after: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
⊢ P r

tactic: by_cases hr' : natDegree r = 0
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
⊢ P r
state_after: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : r.natDegree = 0
⊢ P r

case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
⊢ P r

tactic: obtain ⟨x, hx⟩ :=
  exists_root_of_splits _ (SplittingField.splits (r.comp q)) fun h =>
    hr'
      ((mul_eq_zero.mp
            (natDegree_comp.symm.trans (natDegree_eq_of_degree_eq_some h))).resolve_right
        hq)
state_before: case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
⊢ P r
state_after: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : eval₂ (algebraMap F (r.comp q).SplittingField) x (r.comp q) = 0
⊢ P r

tactic: rw [← aeval_def, aeval_comp] at hx
state_before: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : eval₂ (algebraMap F (r.comp q).SplittingField) x (r.comp q) = 0
⊢ P r
state_after: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
⊢ P r

tactic: have h_normal : Normal F (r.comp q).SplittingField := SplittingField.instNormal (r.comp q)
state_before: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
⊢ P r
state_after: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
h_normal : Normal F (r.comp q).SplittingField
⊢ P r

tactic: have qx_int := Normal.isIntegral h_normal (aeval x q)
state_before: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
h_normal : Normal F (r.comp q).SplittingField
⊢ P r
state_after: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
h_normal : Normal F (r.comp q).SplittingField
qx_int : IsIntegral F ((aeval x) q)
⊢ P r

tactic: exact
  splits_of_splits_of_dvd _ (minpoly.ne_zero qx_int) (Normal.splits h_normal _)
    ((minpoly.irreducible qx_int).dvd_symm hr (minpoly.dvd F _ hx))
state_before: case neg.intro
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : ¬r.natDegree = 0
x : (r.comp q).SplittingField
hx : (aeval ((aeval x) q)) r = 0
h_normal : Normal F (r.comp q).SplittingField
qx_int : IsIntegral F ((aeval x) q)
⊢ P r
state_after: no goals

tactic: exact splits_of_natDegree_le_one _ (le_trans (le_of_eq hr') zero_le_one)
state_before: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
r : F[X]
hr : Irreducible r
hr' : r.natDegree = 0
⊢ P r
state_after: no goals

tactic: intro p₁ p₂ hp₁ hp₂
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
⊢ ∀ {p₁ p₂ : F[X]}, P p₁ → P p₂ → P (p₁ * p₂)
state_after: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
⊢ P (p₁ * p₂)

tactic: by_cases h₁ : p₁.comp q = 0
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
⊢ P (p₁ * p₂)
state_after: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
⊢ P (p₁ * p₂)

case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
⊢ P (p₁ * p₂)

tactic: by_cases h₂ : p₂.comp q = 0
state_before: case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
⊢ P (p₁ * p₂)
state_after: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
⊢ P (p₁ * p₂)

case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : ¬p₂.comp q = 0
⊢ P (p₁ * p₂)

tactic: have key := mul_splits_in_splittingField_of_mul h₁ h₂ hp₁ hp₂
state_before: case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : ¬p₂.comp q = 0
⊢ P (p₁ * p₂)
state_after: case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : ¬p₂.comp q = 0
key : Splits (algebraMap F (p₁.comp q * p₂.comp q).SplittingField) (p₁ * p₂)
⊢ P (p₁ * p₂)

tactic: rwa [← mul_comp] at key
state_before: case neg
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : ¬p₂.comp q = 0
key : Splits (algebraMap F (p₁.comp q * p₂.comp q).SplittingField) (p₁ * p₂)
⊢ P (p₁ * p₂)
state_after: no goals

tactic: cases' comp_eq_zero_iff.mp h₁ with h h
state_before: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
⊢ P (p₁ * p₂)
state_after: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : p₁ = 0
⊢ P (p₁ * p₂)

case pos.inr
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : eval (q.coeff 0) p₁ = 0 ∧ q = C (q.coeff 0)
⊢ P (p₁ * p₂)

tactic: rw [h, zero_mul]
state_before: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : p₁ = 0
⊢ P (p₁ * p₂)
state_after: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : p₁ = 0
⊢ P 0

tactic: exact splits_zero _
state_before: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : p₁ = 0
⊢ P 0
state_after: no goals

tactic: exact False.elim (hq (by rw [h.2, natDegree_C]))
state_before: case pos.inr
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : eval (q.coeff 0) p₁ = 0 ∧ q = C (q.coeff 0)
⊢ P (p₁ * p₂)
state_after: no goals

tactic: rw [h.2, natDegree_C]
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : p₁.comp q = 0
h : eval (q.coeff 0) p₁ = 0 ∧ q = C (q.coeff 0)
⊢ q.natDegree = 0
state_after: no goals

tactic: cases' comp_eq_zero_iff.mp h₂ with h h
state_before: case pos
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
⊢ P (p₁ * p₂)
state_after: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : p₂ = 0
⊢ P (p₁ * p₂)

case pos.inr
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : eval (q.coeff 0) p₂ = 0 ∧ q = C (q.coeff 0)
⊢ P (p₁ * p₂)

tactic: rw [h, mul_zero]
state_before: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : p₂ = 0
⊢ P (p₁ * p₂)
state_after: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : p₂ = 0
⊢ P 0

tactic: exact splits_zero _
state_before: case pos.inl
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : p₂ = 0
⊢ P 0
state_after: no goals

tactic: exact False.elim (hq (by rw [h.2, natDegree_C]))
state_before: case pos.inr
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : eval (q.coeff 0) p₂ = 0 ∧ q = C (q.coeff 0)
⊢ P (p₁ * p₂)
state_after: no goals

tactic: rw [h.2, natDegree_C]
state_before: F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
p₁ p₂ : F[X]
hp₁ : P p₁
hp₂ : P p₂
h₁ : ¬p₁.comp q = 0
h₂ : p₂.comp q = 0
h : eval (q.coeff 0) p₂ = 0 ∧ q = C (q.coeff 0)
⊢ q.natDegree = 0
state_after: no goals

tactic: exact splits_zero _
state_before: case h0
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
key2 : ∀ {p₁ p₂ : F[X]}, P p₁ → P p₂ → P (p₁ * p₂)
⊢ Splits (algebraMap F (comp 0 q).SplittingField) 0
state_after: no goals

tactic: exact splits_of_isUnit (algebraMap F (SplittingField (comp u q))) hu
state_before: case hu
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
key2 : ∀ {p₁ p₂ : F[X]}, P p₁ → P p₂ → P (p₁ * p₂)
u : F[X]
hu : IsUnit u
⊢ Splits (algebraMap F (u.comp q).SplittingField) u
state_after: no goals

tactic: apply key2 (key1 hp₂) hp₁
state_before: case hi
F : Type u_1
inst✝² : Field F
p q : F[X]
E : Type u_2
inst✝¹ : Field E
inst✝ : Algebra F E
hq : q.natDegree ≠ 0
P : F[X] → Prop := fun r => Splits (algebraMap F (r.comp q).SplittingField) r
key1 : ∀ {r : F[X]}, Irreducible r → P r
key2 : ∀ {p₁ p₂ : F[X]}, P p₁ → P p₂ → P (p₁ * p₂)
p₁ p₂ : F[X]
a✝ : p₁ ≠ 0
hp₂ : Irreducible p₂
hp₁ : Splits (algebraMap F (p₁.comp q).SplittingField) p₁
⊢ Splits (algebraMap F ((p₂ * p₁).comp q).SplittingField) (p₂ * p₁)
state_after: no goals