Theorem: Polynomial.eq_leadingCoeff_mul_of_monic_of_dvd_of_natDegree_le
File: Mathlib/Algebra/Polynomial/RingDivision.lean

Proof steps:
state_before: R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdiv : p ∣ q
hdeg : q.natDegree ≤ p.natDegree
⊢ q = C q.leadingCoeff * p
state_after: case intro
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
⊢ q = C q.leadingCoeff * p
tactic: obtain ⟨r, hr⟩ := hdiv
state_before: case intro
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
⊢ q = C q.leadingCoeff * p
state_after: case intro.inl
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q : R✝[X]
R : Type u_1
inst✝ : CommRing R
p : R[X]
hp : p.Monic
r : R[X]
hdeg : natDegree 0 ≤ p.natDegree
hr : 0 = p * r
⊢ 0 = C (leadingCoeff 0) * p

case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
hq : q ≠ 0
⊢ q = C q.leadingCoeff * p
tactic: obtain rfl | hq := eq_or_ne q 0
state_before: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
hq : q ≠ 0
⊢ q = C q.leadingCoeff * p
state_after: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p
tactic: have rzero : r ≠ 0 := fun h => by simp [h, hq] at hr
state_before: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p
state_after: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p

case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : (p * r).natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ p.leadingCoeff * r.leadingCoeff ≠ 0
tactic: rw [hr, natDegree_mul'] at hdeg
state_before: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p

case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : (p * r).natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ p.leadingCoeff * r.leadingCoeff ≠ 0
state_after: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : (p * r).natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ p.leadingCoeff * r.leadingCoeff ≠ 0

case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p
tactic: swap
state_before: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p
state_after: case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = C (r.coeff 0) * p
hq : q ≠ 0
rzero : r ≠ 0
⊢ q = C q.leadingCoeff * p

case intro.inr
R✝ : Type u
S : Type v
T : Type w
a b : R✝
n : ℕ
inst✝² : CommRing R✝
inst✝¹ : IsDomain R✝
p✝ q✝ : R✝[X]
R : Type u_1
inst✝ : CommRing R
p q : R[X]
hp : p.Monic
r : R[X]
hdeg : p.natDegree + r.natDegree ≤ p.natDegree
hr : q = r * p
hq : q ≠ 0
rzero : r ≠ 0
⊢ r.natDegree = 0
tactic: rw [mul_comm, @eq_C_of_natDegree_eq_zero _ _ r] at hr