Theorem: Polynomial.eq_X_sub_C_of_separable_of_root_eq
File: Mathlib/FieldTheory/Separable.lean

tactic: have h_ne_zero : h ≠ 0 := by
  rintro rfl
  exact not_separable_zero h_sep
state_before: F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
⊢ h = ↑C (leadingCoeff h) * (X - ↑C x)

tactic: apply Polynomial.eq_X_sub_C_of_splits_of_single_root i h_splits
state_before: F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ h = ↑C (leadingCoeff h) * (X - ↑C x)

tactic: apply Finset.mk.inj
state_before: F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ roots (map i h) = {↑i x}

tactic: rintro rfl
state_before: F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
⊢ h ≠ 0

tactic: exact not_separable_zero h_sep
state_before: F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h_sep : Separable 0
h_root : eval x 0 = 0
h_splits : Splits i 0
h_roots : ∀ (y : K), y ∈ roots (map i 0) → y = ↑i x
⊢ False

tactic: change _ = {i x}
state_before: case x
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ { val := roots (map i h), nodup := ?nodup } = { val := {↑i x}, nodup := ?nodup }

tactic: rw [Finset.eq_singleton_iff_unique_mem]
state_before: case x
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ { val := roots (map i h), nodup := ?nodup } = {↑i x}

tactic: constructor
state_before: case x
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ ↑i x ∈ { val := roots (map i h), nodup := ?nodup } ∧
    ∀ (x_1 : K), x_1 ∈ { val := roots (map i h), nodup := ?nodup } → x_1 = ↑i x

case nodup
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ Multiset.Nodup (roots (map i h))

tactic: apply Finset.mem_mk.mpr
state_before: case x.left
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ ↑i x ∈ { val := roots (map i h), nodup := ?nodup }

tactic: rw [mem_roots (show h.map i ≠ 0 from map_ne_zero h_ne_zero)]
state_before: case x.left
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ ↑i x ∈ roots (map i h)

tactic: rw [IsRoot.def, ← eval₂_eq_eval_map, eval₂_hom, h_root]
state_before: case x.left
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ IsRoot (map i h) (↑i x)

tactic: exact RingHom.map_zero i
state_before: case x.left
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ ↑i 0 = 0

tactic: exact nodup_roots (Separable.map h_sep)
state_before: case nodup
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ Multiset.Nodup (roots (map i h))

tactic: exact h_roots
state_before: case x.right
F : Type u
inst✝¹ : Field F
K : Type v
inst✝ : Field K
i : F →+* K
x : F
h : F[X]
h_sep : Separable h
h_root : eval x h = 0
h_splits : Splits i h
h_roots : ∀ (y : K), y ∈ roots (map i h) → y = ↑i x
h_ne_zero : h ≠ 0
⊢ ∀ (x_1 : K), x_1 ∈ { val := roots (map i h), nodup := (_ : Multiset.Nodup (roots (map i h))) } → x_1 = ↑i x