Theorem: Polynomial.natDegree_eq_card_roots'
File: Mathlib/Algebra/Polynomial/Splits.lean

tactic: by_cases hp : p.map i = 0
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case pos
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : map i p = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

case neg
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : ¬map i p = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

tactic: obtain ⟨q, he, hd, hr⟩ := exists_prod_multiset_X_sub_C_mul (p.map i)
state_before: case neg
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : ¬map i p = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : ¬map i p = 0
q : L[X]
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

tactic: rw [← splits_id_iff_splits, ← he] at hsplit
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : ¬map i p = 0
q : L[X]
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hp : ¬map i p = 0
q : L[X]
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

tactic: rw [← he] at hp
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hp : ¬map i p = 0
q : L[X]
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

tactic: have hq : q ≠ 0 := fun h => hp (by rw [h, mul_zero])
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots

tactic: rw [← hd, add_right_eq_self]
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
⊢ q.natDegree = 0

tactic: by_contra h
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
⊢ q.natDegree = 0
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
⊢ False

tactic: have h' : (map (RingHom.id L) q).natDegree ≠ 0 := by simp [h]
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
⊢ False
state_after: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ False

tactic: have := roots_ne_zero_of_splits' (RingHom.id L) (splits_of_splits_mul' _ ?_ hsplit).2 h'
state_before: case neg.intro.intro.intro
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ False
state_after: case neg.intro.intro.intro.refine_2
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
this : (map (RingHom.id L) q).roots ≠ 0
⊢ False

case neg.intro.intro.intro.refine_1
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ map (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q) ≠ 0

tactic: rw [hp, natDegree_zero, roots_zero, Multiset.card_zero]
state_before: case pos
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
hsplit : Splits i p
hp : map i p = 0
⊢ (map i p).natDegree = Multiset.card (map i p).roots
state_after: no goals

tactic: rw [h, mul_zero]
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
h : q = 0
⊢ (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
state_after: no goals

tactic: simp [h]
state_before: R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
⊢ (map (RingHom.id L) q).natDegree ≠ 0
state_after: no goals

tactic: rw [map_id] at this
state_before: case neg.intro.intro.intro.refine_2
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
this : (map (RingHom.id L) q).roots ≠ 0
⊢ False
state_after: case neg.intro.intro.intro.refine_2
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
this : q.roots ≠ 0
⊢ False

tactic: exact this hr
state_before: case neg.intro.intro.intro.refine_2
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
this : q.roots ≠ 0
⊢ False
state_after: no goals

tactic: rw [map_id]
state_before: case neg.intro.intro.intro.refine_1
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ map (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q) ≠ 0
state_after: case neg.intro.intro.intro.refine_1
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ (Multiset.map (fun a => X - C a) (map i p).roots).prod * q ≠ 0

tactic: exact mul_ne_zero monic_prod_multiset_X_sub_C.ne_zero hq
state_before: case neg.intro.intro.intro.refine_1
R : Type u_1
F : Type u
K : Type v
L : Type w
inst✝² : CommRing K
inst✝¹ : Field L
inst✝ : Field F
i✝ : K →+* L
p : K[X]
i : K →+* L
q : L[X]
hp : ¬(Multiset.map (fun a => X - C a) (map i p).roots).prod * q = 0
hsplit : Splits (RingHom.id L) ((Multiset.map (fun a => X - C a) (map i p).roots).prod * q)
he : (Multiset.map (fun a => X - C a) (map i p).roots).prod * q = map i p
hd : Multiset.card (map i p).roots + q.natDegree = (map i p).natDegree
hr : q.roots = 0
hq : q ≠ 0
h : ¬q.natDegree = 0
h' : (map (RingHom.id L) q).natDegree ≠ 0
⊢ (Multiset.map (fun a => X - C a) (map i p).roots).prod * q ≠ 0
state_after: no goals