Theorem: Polynomial.natDegree_divByMonic
File: Mathlib/Data/Polynomial/Div.lean

tactic: nontriviality R
state_before: R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: by_cases hfg : f /ₘ g = 0
state_before: R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: have hgf := hfg
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: rw [divByMonic_eq_zero_iff hg] at hgf
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg hgf : ¬f /ₘ g = 0
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: push_neg  at hgf
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : ¬degree f < degree g
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: have := degree_add_divByMonic hg hgf
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: have hf : f ≠ 0 := by
  intro hf
  apply hfg
  rw [hf, zero_divByMonic]
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : degree g + degree (f /ₘ g) = degree f
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: rw [degree_eq_natDegree hf, degree_eq_natDegree hg.ne_zero, degree_eq_natDegree hfg,
  Nat.cast_withBot, Nat.cast_withBot, Nat.cast_withBot,
  ← WithBot.coe_add, WithBot.coe_eq_coe] at this
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : degree g + degree (f /ₘ g) = degree f
hf : f ≠ 0
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: rw [← this, add_tsub_cancel_left]
state_before: case neg
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : natDegree g + natDegree (f /ₘ g) = natDegree f
hf : f ≠ 0
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: rw [hfg, natDegree_zero]
state_before: case pos
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : f /ₘ g = 0
⊢ natDegree (f /ₘ g) = natDegree f - natDegree g

tactic: rw [divByMonic_eq_zero_iff hg] at hfg
state_before: case pos
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : f /ₘ g = 0
⊢ 0 = natDegree f - natDegree g

tactic: rw [tsub_eq_zero_iff_le.mpr (natDegree_le_natDegree <| le_of_lt hfg)]
state_before: case pos
R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : degree f < degree g
⊢ 0 = natDegree f - natDegree g

tactic: intro hf
state_before: R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : degree g + degree (f /ₘ g) = degree f
⊢ f ≠ 0

tactic: apply hfg
state_before: R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : degree g + degree (f /ₘ g) = degree f
hf : f = 0
⊢ False

tactic: rw [hf, zero_divByMonic]
state_before: R✝ : Type u
S : Type v
T : Type w
A : Type z
a b : R✝
n : ℕ
inst✝¹ : CommRing R✝
p q : R✝[X]
R : Type u
inst✝ : CommRing R
f g : R[X]
hg : Monic g
✝ : Nontrivial R
hfg : ¬f /ₘ g = 0
hgf : degree g ≤ degree f
this : degree g + degree (f /ₘ g) = degree f
hf : f = 0
⊢ f /ₘ g = 0