Theorem: Polynomial.modByMonic_X_sub_C_eq_C_eval
File: Mathlib/Algebra/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 p : R[X]
a : R
⊢ p %ₘ (X - C a) = C (eval a p)
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
⊢ p %ₘ (X - C a) = C (eval a p)

tactic: have h : (p %ₘ (X - C a)).eval a = p.eval a := by
  rw [modByMonic_eq_sub_mul_div _ (monic_X_sub_C a), eval_sub, eval_mul, eval_sub, eval_X,
    eval_C, sub_self, zero_mul, sub_zero]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
⊢ p %ₘ (X - C a) = C (eval a p)
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ p %ₘ (X - C a) = C (eval a p)

tactic: have : degree (p %ₘ (X - C a)) < 1 :=
  degree_X_sub_C a ▸ degree_modByMonic_lt p (monic_X_sub_C a)
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ p %ₘ (X - C a) = C (eval a p)
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
this : (p %ₘ (X - C a)).degree < 1
⊢ p %ₘ (X - C a) = C (eval a p)

tactic: rw [eq_C_of_degree_le_zero this, eval_C] at h
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
this✝ : (p %ₘ (X - C a)).degree < 1
this : (p %ₘ (X - C a)).degree ≤ 0
⊢ p %ₘ (X - C a) = C (eval a p)
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : (p %ₘ (X - C a)).coeff 0 = eval a p
this✝ : (p %ₘ (X - C a)).degree < 1
this : (p %ₘ (X - C a)).degree ≤ 0
⊢ p %ₘ (X - C a) = C (eval a p)

tactic: rw [eq_C_of_degree_le_zero this, h]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : (p %ₘ (X - C a)).coeff 0 = eval a p
this✝ : (p %ₘ (X - C a)).degree < 1
this : (p %ₘ (X - C a)).degree ≤ 0
⊢ p %ₘ (X - C a) = C (eval a p)
state_after: no goals

tactic: rw [modByMonic_eq_sub_mul_div _ (monic_X_sub_C a), eval_sub, eval_mul, eval_sub, eval_X,
  eval_C, sub_self, zero_mul, sub_zero]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
⊢ eval a (p %ₘ (X - C a)) = eval a p
state_after: no goals

tactic: revert this
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
this : (p %ₘ (X - C a)).degree < 1
⊢ (p %ₘ (X - C a)).degree ≤ 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ (p %ₘ (X - C a)).degree < 1 → (p %ₘ (X - C a)).degree ≤ 0

tactic: cases degree (p %ₘ (X - C a))
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ (p %ₘ (X - C a)).degree < 1 → (p %ₘ (X - C a)).degree ≤ 0
state_after: case bot
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ ⊥ < 1 → ⊥ ≤ 0

case coe
R : Type u
S : Type v
T : Type w
A : Type z
a✝² b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝¹ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
a✝ : ℕ
⊢ ↑a✝ < 1 → ↑a✝ ≤ 0

tactic: exact fun _ => bot_le
state_before: case bot
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
⊢ ⊥ < 1 → ⊥ ≤ 0
state_after: no goals

tactic: exact fun h => WithBot.coe_le_coe.2 (Nat.le_of_lt_succ (WithBot.coe_lt_coe.1 h))
state_before: case coe
R : Type u
S : Type v
T : Type w
A : Type z
a✝² b : R
n : ℕ
inst✝ : CommRing R
p✝ q p : R[X]
a : R
a✝¹ : Nontrivial R
h : eval a (p %ₘ (X - C a)) = eval a p
a✝ : ℕ
⊢ ↑a✝ < 1 → ↑a✝ ≤ 0
state_after: no goals