Theorem: Polynomial.splits_iff_card_roots
File: Mathlib/Algebra/Polynomial/Splits.lean

tactic: constructor
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
⊢ Splits (RingHom.id K) p ↔ Multiset.card p.roots = p.natDegree
state_after: case mp
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
⊢ Splits (RingHom.id K) p → Multiset.card p.roots = p.natDegree

case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
⊢ Multiset.card p.roots = p.natDegree → Splits (RingHom.id K) p

tactic: intro H
state_before: case mp
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
⊢ Splits (RingHom.id K) p → Multiset.card p.roots = p.natDegree
state_after: case mp
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
H : Splits (RingHom.id K) p
⊢ Multiset.card p.roots = p.natDegree

tactic: rw [natDegree_eq_card_roots H, map_id]
state_before: case mp
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
H : Splits (RingHom.id K) p
⊢ Multiset.card p.roots = p.natDegree
state_after: no goals

tactic: intro hroots
state_before: case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
⊢ Multiset.card p.roots = p.natDegree → Splits (RingHom.id K) p
state_after: case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ Splits (RingHom.id K) p

tactic: rw [splits_iff_exists_multiset (RingHom.id K)]
state_before: case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ Splits (RingHom.id K) p
state_after: case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ ∃ s, map (RingHom.id K) p = C ((RingHom.id K) p.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod

tactic: use p.roots
state_before: case mpr
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ ∃ s, map (RingHom.id K) p = C ((RingHom.id K) p.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
state_after: case h
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ map (RingHom.id K) p = C ((RingHom.id K) p.leadingCoeff) * (Multiset.map (fun a => X - C a) p.roots).prod

tactic: simp only [RingHom.id_apply, map_id]
state_before: case h
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ map (RingHom.id K) p = C ((RingHom.id K) p.leadingCoeff) * (Multiset.map (fun a => X - C a) p.roots).prod
state_after: case h
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ p = C p.leadingCoeff * (Multiset.map (fun a => X - C a) p.roots).prod

tactic: exact (C_leadingCoeff_mul_prod_multiset_X_sub_C hroots).symm
state_before: case h
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝⁵ : CommRing R
inst✝⁴ : Field K
inst✝³ : Field L
inst✝² : Field F
i : K →+* L
inst✝¹ : Algebra R K
inst✝ : Algebra R L
p : K[X]
hroots : Multiset.card p.roots = p.natDegree
⊢ p = C p.leadingCoeff * (Multiset.map (fun a => X - C a) p.roots).prod
state_after: no goals