Theorem: Polynomial.coeff_eq_esymm_roots_of_card
File: Mathlib/RingTheory/Polynomial/Vieta.lean

tactic: conv_lhs => rw [← C_leadingCoeff_mul_prod_multiset_X_sub_C hroots]
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ p.coeff k = p.leadingCoeff * (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ (C p.leadingCoeff * (map (fun a => X - C a) p.roots).prod).coeff k =
    p.leadingCoeff * (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)

tactic: rw [coeff_C_mul, mul_assoc]
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ (C p.leadingCoeff * (map (fun a => X - C a) p.roots).prod).coeff k =
    p.leadingCoeff * (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ p.leadingCoeff * (map (fun a => X - C a) p.roots).prod.coeff k =
    p.leadingCoeff * ((-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k))

tactic: congr
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ p.leadingCoeff * (map (fun a => X - C a) p.roots).prod.coeff k =
    p.leadingCoeff * ((-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k))
state_after: case e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ (map (fun a => X - C a) p.roots).prod.coeff k = (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)

tactic: have : k ≤ card (roots p) := by rw [hroots]; exact h
state_before: case e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ (map (fun a => X - C a) p.roots).prod.coeff k = (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)
state_after: case e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
this : k ≤ card p.roots
⊢ (map (fun a => X - C a) p.roots).prod.coeff k = (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)

tactic: convert p.roots.prod_X_sub_C_coeff this using 3 <;> rw [hroots]
state_before: case e_a
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
this : k ≤ card p.roots
⊢ (map (fun a => X - C a) p.roots).prod.coeff k = (-1) ^ (p.natDegree - k) * p.roots.esymm (p.natDegree - k)
state_after: no goals

tactic: rw [hroots]
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ k ≤ card p.roots
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ k ≤ p.natDegree

tactic: exact h
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsDomain R
p : R[X]
hroots : card p.roots = p.natDegree
k : ℕ
h : k ≤ p.natDegree
⊢ k ≤ p.natDegree
state_after: no goals