Theorem: Polynomial.mem_span_C_X_sub_C_X_sub_C_iff_eval_eval_eq_zero
File: Mathlib/Algebra/Polynomial/Div.lean

tactic: rw [Ideal.mem_span_pair]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
⊢ P ∈ Ideal.span {C (X - C a), X - C b} ↔ eval a (eval b P) = 0
state_after: R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
⊢ (∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P) ↔ eval a (eval b P) = 0

tactic: constructor <;> intro h
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
⊢ (∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P) ↔ eval a (eval b P) = 0
state_after: case mp
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
h : ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P
⊢ eval a (eval b P) = 0

case mpr
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P

tactic: rcases h with ⟨_, _, rfl⟩
state_before: case mp
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
h : ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P
⊢ eval a (eval b P) = 0
state_after: case mp.intro.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
w✝¹ w✝ : R[X][X]
⊢ eval a (eval b (w✝¹ * C (X - C a) + w✝ * (X - C b))) = 0

tactic: simp only [eval_C, eval_X, eval_add, eval_sub, eval_mul, add_zero, mul_zero, sub_self]
state_before: case mp.intro.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
w✝¹ w✝ : R[X][X]
⊢ eval a (eval b (w✝¹ * C (X - C a) + w✝ * (X - C b))) = 0
state_after: no goals

tactic: rcases dvd_iff_isRoot.mpr h with ⟨p, hp⟩
state_before: case mpr
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p q b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P
state_after: case mpr.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p✝ q b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
p : R[X]
hp : eval b P = (X - C a) * p
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P

tactic: rcases @X_sub_C_dvd_sub_C_eval _ b _ P with ⟨q, hq⟩
state_before: case mpr.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p✝ q b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
p : R[X]
hp : eval b P = (X - C a) * p
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P
state_after: case mpr.intro.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p✝ q✝ b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
p : R[X]
hp : eval b P = (X - C a) * p
q : R[X][X]
hq : P - C (eval b P) = (X - C b) * q
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P

tactic: exact ⟨C p, q, by rw [mul_comm, mul_comm q, eq_add_of_sub_eq' hq, hp, C_mul]⟩
state_before: case mpr.intro.intro
R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p✝ q✝ b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
p : R[X]
hp : eval b P = (X - C a) * p
q : R[X][X]
hq : P - C (eval b P) = (X - C b) * q
⊢ ∃ a_1 b_1, a_1 * C (X - C a) + b_1 * (X - C b) = P
state_after: no goals

tactic: rw [mul_comm, mul_comm q, eq_add_of_sub_eq' hq, hp, C_mul]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a b✝ : R
n : ℕ
inst✝ : CommRing R
p✝ q✝ b : R[X]
P : R[X][X]
h : eval a (eval b P) = 0
p : R[X]
hp : eval b P = (X - C a) * p
q : R[X][X]
hq : P - C (eval b P) = (X - C b) * q
⊢ C p * C (X - C a) + q * (X - C b) = P
state_after: no goals