Theorem: Polynomial.eq_of_dvd_of_natDegree_le_of_leadingCoeff
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✝ 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: by_cases hq : q = 0
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: 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₂ : 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: obtain ⟨u, rfl⟩ := hpq
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: 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
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 [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₁ : 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₁, 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₂ : u.coeff 0 = 1
h₁ : u.natDegree = 0
hq : p ≠ 0 ∧ u ≠ 0
⊢ p = p * u
state_after: no goals
tactic: rw [eq_C_of_natDegree_eq_zero h₁, h₂, map_one, mul_one]