Theorem: Polynomial.degree_derivative_eq
File: Mathlib/Algebra/Polynomial/Derivative.lean

tactic: apply le_antisymm
state_before: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ (derivative p).degree = ↑(p.natDegree - 1)
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ (derivative p).degree ≤ ↑(p.natDegree - 1)

case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ↑(p.natDegree - 1) ≤ (derivative p).degree

tactic: rw [derivative_apply]
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ (derivative p).degree ≤ ↑(p.natDegree - 1)
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ (p.sum fun n a => C (a * ↑n) * X ^ (n - 1)).degree ≤ ↑(p.natDegree - 1)

tactic: apply le_trans (degree_sum_le _ _) (Finset.sup_le _)
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ (p.sum fun n a => C (a * ↑n) * X ^ (n - 1)).degree ≤ ↑(p.natDegree - 1)
state_after: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ∀ b ∈ p.support, ((fun n a => C (a * ↑n) * X ^ (n - 1)) b (p.coeff b)).degree ≤ ↑(p.natDegree - 1)

tactic: intro n hn
state_before: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ∀ b ∈ p.support, ((fun n a => C (a * ↑n) * X ^ (n - 1)) b (p.coeff b)).degree ≤ ↑(p.natDegree - 1)
state_after: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n✝ : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
n : ℕ
hn : n ∈ p.support
⊢ ((fun n a => C (a * ↑n) * X ^ (n - 1)) n (p.coeff n)).degree ≤ ↑(p.natDegree - 1)

tactic: apply le_trans (degree_C_mul_X_pow_le _ _) (WithBot.coe_le_coe.2 (tsub_le_tsub_right _ _))
state_before: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n✝ : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
n : ℕ
hn : n ∈ p.support
⊢ ((fun n a => C (a * ↑n) * X ^ (n - 1)) n (p.coeff n)).degree ≤ ↑(p.natDegree - 1)
state_after: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n✝ : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
n : ℕ
hn : n ∈ p.support
⊢ n ≤ p.natDegree

tactic: apply le_natDegree_of_mem_supp _ hn
state_before: R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n✝ : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
n : ℕ
hn : n ∈ p.support
⊢ n ≤ p.natDegree
state_after: no goals

tactic: refine le_sup ?_
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ↑(p.natDegree - 1) ≤ (derivative p).degree
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ p.natDegree - 1 ∈ (derivative p).support

tactic: rw [mem_support_derivative, tsub_add_cancel_of_le, mem_support_iff]
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ p.natDegree - 1 ∈ (derivative p).support
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ p.coeff p.natDegree ≠ 0

case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ 1 ≤ p.natDegree

tactic: exact hp
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ 1 ≤ p.natDegree
state_after: no goals

tactic: rw [coeff_natDegree, Ne, leadingCoeff_eq_zero]
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ p.coeff p.natDegree ≠ 0
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ¬p = 0

tactic: intro h
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
⊢ ¬p = 0
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
h : p = 0
⊢ False

tactic: rw [h, natDegree_zero] at hp
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < p.natDegree
h : p = 0
⊢ False
state_after: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < 0
h : p = 0
⊢ False

tactic: exact hp.false
state_before: case a
R : Type u
S : Type v
T : Type w
ι : Type y
A : Type z
a b : R
n : ℕ
inst✝¹ : Semiring R
inst✝ : NoZeroSMulDivisors ℕ R
p : R[X]
hp : 0 < 0
h : p = 0
⊢ False
state_after: no goals