Theorem: Polynomial.natDegree_hasseDeriv
File: Mathlib/Algebra/Polynomial/HasseDeriv.lean

tactic: cases' lt_or_le p.natDegree n with hn hn
state_before: R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
⊢ ((hasseDeriv n) p).natDegree = p.natDegree - n
state_after: case inl
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : p.natDegree < n
⊢ ((hasseDeriv n) p).natDegree = p.natDegree - n

case inr
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ((hasseDeriv n) p).natDegree = p.natDegree - n

tactic: simpa [hasseDeriv_eq_zero_of_lt_natDegree, hn] using (tsub_eq_zero_of_le hn.le).symm
state_before: case inl
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : p.natDegree < n
⊢ ((hasseDeriv n) p).natDegree = p.natDegree - n
state_after: no goals

tactic: refine map_natDegree_eq_sub ?_ ?_
state_before: case inr
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ((hasseDeriv n) p).natDegree = p.natDegree - n
state_after: case inr.refine_1
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (f : R[X]), f.natDegree < n → (hasseDeriv n) f = 0

case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (n_1 : ℕ) (c : R), c ≠ 0 → ((hasseDeriv n) ((monomial n_1) c)).natDegree = n_1 - n

tactic: exact fun h => hasseDeriv_eq_zero_of_lt_natDegree _ _
state_before: case inr.refine_1
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (f : R[X]), f.natDegree < n → (hasseDeriv n) f = 0
state_after: no goals

tactic: classical
  simp only [ite_eq_right_iff, Ne, natDegree_monomial, hasseDeriv_monomial]
  intro k c c0 hh
  rw [← nsmul_eq_mul, smul_eq_zero, Nat.choose_eq_zero_iff] at hh
  exact (tsub_eq_zero_of_le (Or.resolve_right hh c0).le).symm
state_before: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (n_1 : ℕ) (c : R), c ≠ 0 → ((hasseDeriv n) ((monomial n_1) c)).natDegree = n_1 - n
state_after: no goals

tactic: simp only [ite_eq_right_iff, Ne, natDegree_monomial, hasseDeriv_monomial]
state_before: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (n_1 : ℕ) (c : R), c ≠ 0 → ((hasseDeriv n) ((monomial n_1) c)).natDegree = n_1 - n
state_after: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (n_1 : ℕ) (c : R), ¬c = 0 → ↑(n_1.choose n) * c = 0 → 0 = n_1 - n

tactic: intro k c c0 hh
state_before: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
⊢ ∀ (n_1 : ℕ) (c : R), ¬c = 0 → ↑(n_1.choose n) * c = 0 → 0 = n_1 - n
state_after: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k✝ : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
k : ℕ
c : R
c0 : ¬c = 0
hh : ↑(k.choose n) * c = 0
⊢ 0 = k - n

tactic: rw [← nsmul_eq_mul, smul_eq_zero, Nat.choose_eq_zero_iff] at hh
state_before: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k✝ : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
k : ℕ
c : R
c0 : ¬c = 0
hh : ↑(k.choose n) * c = 0
⊢ 0 = k - n
state_after: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k✝ : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
k : ℕ
c : R
c0 : ¬c = 0
hh : k < n ∨ c = 0
⊢ 0 = k - n

tactic: exact (tsub_eq_zero_of_le (Or.resolve_right hh c0).le).symm
state_before: case inr.refine_2
R : Type u_1
inst✝¹ : Semiring R
k✝ : ℕ
f : R[X]
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
n : ℕ
hn : n ≤ p.natDegree
k : ℕ
c : R
c0 : ¬c = 0
hh : k < n ∨ c = 0
⊢ 0 = k - n
state_after: no goals