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

tactic: rw [irreducible_iff_prime] at hp
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Irreducible p
hdp : p ∣ map i f
⊢ p.degree = 1
state_after: 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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ map i f
⊢ p.degree = 1

tactic: rw [hs, ← Multiset.prod_toList] at hdp
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ map i f
⊢ p.degree = 1
state_after: 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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
⊢ p.degree = 1

tactic: obtain hd | hd := hp.2.2 _ _ hdp
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
⊢ p.degree = 1
state_after: case inl
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ C (i f.leadingCoeff)
⊢ p.degree = 1

case inr
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
⊢ p.degree = 1

tactic: refine (hp.2.1 <| isUnit_of_dvd_unit hd ?_).elim
state_before: case inl
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ C (i f.leadingCoeff)
⊢ p.degree = 1
state_after: case inl
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ C (i f.leadingCoeff)
⊢ IsUnit (C (i f.leadingCoeff))

tactic: exact isUnit_C.2 ((leadingCoeff_ne_zero.2 hf0).isUnit.map i)
state_before: case inl
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ C (i f.leadingCoeff)
⊢ IsUnit (C (i f.leadingCoeff))
state_after: no goals

tactic: obtain ⟨q, hq, hd⟩ := hp.dvd_prod_iff.1 hd
state_before: case inr
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
⊢ p.degree = 1
state_after: case inr.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
q : L[X]
hq : q ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ q
⊢ p.degree = 1

tactic: obtain ⟨a, _, rfl⟩ := Multiset.mem_map.1 (Multiset.mem_toList.1 hq)
state_before: case inr.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
q : L[X]
hq : q ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ q
⊢ p.degree = 1
state_after: case inr.intro.intro.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
a : L
left✝ : a ∈ s
hq : X - C a ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ X - C a
⊢ p.degree = 1

tactic: rw [degree_eq_degree_of_associated ((hp.dvd_prime_iff_associated <| prime_X_sub_C a).1 hd)]
state_before: case inr.intro.intro.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
a : L
left✝ : a ∈ s
hq : X - C a ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ X - C a
⊢ p.degree = 1
state_after: case inr.intro.intro.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
a : L
left✝ : a ∈ s
hq : X - C a ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ X - C a
⊢ (X - C a).degree = 1

tactic: exact degree_X_sub_C a
state_before: case inr.intro.intro.intro.intro
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
f : K[X]
s : Multiset L
hs : map i f = C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).prod
this : DecidableEq K := Classical.decEq K
hf0 : ¬f = 0
p : L[X]
hp : Prime p
hdp : p ∣ C (i f.leadingCoeff) * (Multiset.map (fun a => X - C a) s).toList.prod
hd✝ : p ∣ (Multiset.map (fun a => X - C a) s).toList.prod
a : L
left✝ : a ∈ s
hq : X - C a ∈ (Multiset.map (fun a => X - C a) s).toList
hd : p ∣ X - C a
⊢ (X - C a).degree = 1
state_after: no goals