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

tactic: obtain ⟨r, hr⟩ := hdiv
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 rfl | hq := eq_or_ne q 0
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: 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
⊢ 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: 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
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: 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

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: rw [mul_comm, @eq_C_of_natDegree_eq_zero _ _ r] 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
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: simp
state_before: 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
state_after: no goals

tactic: simp [h, hq] at hr
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
hdeg : q.natDegree ≤ p.natDegree
r : R[X]
hr : q = p * r
hq : q ≠ 0
h : r = 0
⊢ False
state_after: no goals

tactic: rw [hp.leadingCoeff, one_mul, leadingCoeff_ne_zero]
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 * 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
⊢ r ≠ 0

tactic: exact rzero
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 * r).natDegree ≤ p.natDegree
hr : q = p * r
hq : q ≠ 0
rzero : r ≠ 0
⊢ r ≠ 0
state_after: no goals

tactic: convert 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
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
state_after: case h.e'_3.h.e'_5.h.e'_6
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.leadingCoeff = r.coeff 0

tactic: convert leadingCoeff_C (coeff r 0) using 1
state_before: case h.e'_3.h.e'_5.h.e'_6
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.leadingCoeff = r.coeff 0
state_after: case h.e'_2
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.leadingCoeff = (C (r.coeff 0)).leadingCoeff

tactic: rw [hr, leadingCoeff_mul_monic hp]
state_before: case h.e'_2
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.leadingCoeff = (C (r.coeff 0)).leadingCoeff
state_after: no goals

tactic: exact (add_right_inj _).1 (le_antisymm hdeg <| Nat.le.intro rfl)
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 = r * p
hq : q ≠ 0
rzero : r ≠ 0
⊢ r.natDegree = 0
state_after: no goals