Theorem: Polynomial.eval_mul_X_sub_C
File: Mathlib/Algebra/Polynomial/AlgebraMap.lean

Proof steps:
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
⊢ eval r (p * (X - C r)) = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
⊢ ((p * (X - C r)).sum fun e a => a * r ^ e) = 0
tactic: simp only [eval, eval₂_eq_sum, RingHom.id_apply]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
⊢ ((p * (X - C r)).sum fun e a => a * r ^ e) = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ((p * (X - C r)).sum fun e a => a * r ^ e) = 0
tactic: have bound :=
    calc
      (p * (X - C r)).natDegree ≤ p.natDegree + (X - C r).natDegree := natDegree_mul_le
      _ ≤ p.natDegree + 1 := add_le_add_left (natDegree_X_sub_C_le _) _
      _ < p.natDegree + 2 := lt_add_one _
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ((p * (X - C r)).sum fun e a => a * r ^ e) = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ a ∈ range (p.natDegree + 2), (p * (X - C r)).coeff a * r ^ a = 0

R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∀ (n : ℕ), 0 * r ^ n = 0
tactic: rw [sum_over_range' _ _ (p.natDegree + 2) bound]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ a ∈ range (p.natDegree + 2), (p * (X - C r)).coeff a * r ^ a = 0

R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∀ (n : ℕ), 0 * r ^ n = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∀ (n : ℕ), 0 * r ^ n = 0

R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ a ∈ range (p.natDegree + 2), (p * (X - C r)).coeff a * r ^ a = 0
tactic: swap
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ a ∈ range (p.natDegree + 2), (p * (X - C r)).coeff a * r ^ a = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ k ∈ range (p.natDegree + 1), (p * (X - C r)).coeff (k + 1) * r ^ (k + 1) + (p * (X - C r)).coeff 0 * r ^ 0 = 0
tactic: rw [sum_range_succ']
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ k ∈ range (p.natDegree + 1), (p * (X - C r)).coeff (k + 1) * r ^ (k + 1) + (p * (X - C r)).coeff 0 * r ^ 0 = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ k ∈ range (p.natDegree + 1), (p.coeff k * r ^ (k + 1) - p.coeff (k + 1) * r ^ (k + 1 + 1)) +
      (p * (X - C r)).coeff 0 * r ^ 0 =
    0
tactic: conv_lhs =>
    congr
    arg 2
    simp [coeff_mul_X_sub_C, sub_mul, mul_assoc, ← pow_succ']
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ ∑ k ∈ range (p.natDegree + 1), (p.coeff k * r ^ (k + 1) - p.coeff (k + 1) * r ^ (k + 1 + 1)) +
      (p * (X - C r)).coeff 0 * r ^ 0 =
    0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ p.coeff 0 * r ^ (0 + 1) - p.coeff (p.natDegree + 1) * r ^ (p.natDegree + 1 + 1) + (p * (X - C r)).coeff 0 * r ^ 0 = 0
tactic: rw [sum_range_sub']
state_before: R : Type u
S : Type v
T : Type w
A : Type z
A' : Type u_1
B : Type u_2
a b : R
n : ℕ
inst✝ : Ring R
p : R[X]
r : R
bound : (p * (X - C r)).natDegree < p.natDegree + 2
⊢ p.coeff 0 * r ^ (0 + 1) - p.coeff (p.natDegree + 1) * r ^ (p.natDegree + 1 + 1) + (p * (X - C r)).coeff 0 * r ^ 0 = 0
state_after: no goals
tactic: simp [coeff_monomial]