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

tactic: by_cases hq : q = 0
state_before: R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₁ : q.natDegree ≤ p.natDegree
h₂ : p.leadingCoeff = q.leadingCoeff
⊢ p = q
state_after: case pos
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₁ : q.natDegree ≤ p.natDegree
h₂ : p.leadingCoeff = q.leadingCoeff
hq : q = 0
⊢ p = q

case neg
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₁ : q.natDegree ≤ p.natDegree
h₂ : p.leadingCoeff = q.leadingCoeff
hq : ¬q = 0
⊢ p = q

tactic: replace h₁ := (natDegree_le_of_dvd hpq hq).antisymm h₁
state_before: case neg
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₁ : q.natDegree ≤ p.natDegree
h₂ : p.leadingCoeff = q.leadingCoeff
hq : ¬q = 0
⊢ p = q
state_after: case neg
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₂ : p.leadingCoeff = q.leadingCoeff
hq : ¬q = 0
h₁ : p.natDegree = q.natDegree
⊢ p = q

tactic: obtain ⟨u, rfl⟩ := hpq
state_before: case neg
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₂ : p.leadingCoeff = q.leadingCoeff
hq : ¬q = 0
h₁ : p.natDegree = q.natDegree
⊢ p = q
state_after: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
hq : ¬p * u = 0
h₁ : p.natDegree = (p * u).natDegree
⊢ p = p * u

tactic: replace hq := mul_ne_zero_iff.mp hq
state_before: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
hq : ¬p * u = 0
h₁ : p.natDegree = (p * u).natDegree
⊢ p = p * u
state_after: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
h₁ : p.natDegree = (p * u).natDegree
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u

tactic: rw [natDegree_mul hq.1 hq.2, self_eq_add_right] at h₁
state_before: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
h₁ : p.natDegree = (p * u).natDegree
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u
state_after: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
h₁ : u.natDegree = 0
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u

tactic: rw [eq_C_of_natDegree_eq_zero h₁, leadingCoeff_mul, leadingCoeff_C,
  eq_comm, mul_eq_left₀ (leadingCoeff_ne_zero.mpr hq.1)] at h₂
state_before: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : p.leadingCoeff = (p * u).leadingCoeff
h₁ : u.natDegree = 0
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u
state_after: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : u.coeff 0 = 1
h₁ : u.natDegree = 0
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u

tactic: rw [eq_C_of_natDegree_eq_zero h₁, h₂, map_one, mul_one]
state_before: case neg.intro
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q p u : R[X]
h₂ : u.coeff 0 = 1
h₁ : u.natDegree = 0
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u
state_after: no goals

tactic: rwa [hq, leadingCoeff_zero, leadingCoeff_eq_zero, ← hq] at h₂
state_before: case pos
R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝¹ : CommRing R
inst✝ : IsDomain R
p✝ q✝ p q : R[X]
hpq : p ∣ q
h₁ : q.natDegree ≤ p.natDegree
h₂ : p.leadingCoeff = q.leadingCoeff
hq : q = 0
⊢ p = q
state_after: no goals