Theorem: Matrix.eval_matrixOfPolynomials_eq_vandermonde_mul_matrixOfPolynomials
File: Mathlib/LinearAlgebra/Vandermonde.lean

Proof steps:
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
⊢ (of fun i j => eval (v i) (p j)) = vandermonde v * of fun i j => (p j).coeff ↑i
state_after: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ of (fun i j => eval (v i) (p j)) i j = (vandermonde v * of fun i j => (p j).coeff ↑i) i j
tactic: ext i j
state_before: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ of (fun i j => eval (v i) (p j)) i j = (vandermonde v * of fun i j => (p j).coeff ↑i) i j
state_after: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) =
    ∑ j_1 : Fin n, vandermonde v i j_1 * of (fun i j => (p j).coeff ↑i) j_1 j
tactic: rw [Matrix.mul_apply, eval, Matrix.of_apply, eval₂]
state_before: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) =
    ∑ j_1 : Fin n, vandermonde v i j_1 * of (fun i j => (p j).coeff ↑i) j_1 j
state_after: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) = ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
tactic: simp only [eq_intCast, Int.cast_id, Matrix.vandermonde]
state_before: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) = ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
state_after: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) = ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
tactic: have : (p j).support ⊆ range n := supp_subset_range <| Nat.lt_of_le_of_lt (h_deg j) <| Fin.prop j
state_before: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ ((p j).sum fun e a => (RingHom.id R) a * v i ^ e) = ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
state_after: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ ∑ i_1 : Fin n, (RingHom.id R) ((p j).coeff ↑i_1) * v i ^ ↑i_1 =
    ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
tactic: rw [sum_eq_of_subset _ (fun j => zero_mul ((v i) ^ j)) this, ← Fin.sum_univ_eq_sum_range]
state_before: case a
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ ∑ i_1 : Fin n, (RingHom.id R) ((p j).coeff ↑i_1) * v i ^ ↑i_1 =
    ∑ x : Fin n, v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
state_after: case a.e_f
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ (fun i_1 => (RingHom.id R) ((p j).coeff ↑i_1) * v i ^ ↑i_1) = fun x => v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
tactic: congr
state_before: case a.e_f
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
⊢ (fun i_1 => (RingHom.id R) ((p j).coeff ↑i_1) * v i ^ ↑i_1) = fun x => v i ^ ↑x * of (fun i j => (p j).coeff ↑i) x j
state_after: case a.e_f.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
k : Fin n
⊢ (RingHom.id R) ((p j).coeff ↑k) * v i ^ ↑k = v i ^ ↑k * of (fun i j => (p j).coeff ↑i) k j
tactic: ext k
state_before: case a.e_f.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
p : Fin n → R[X]
h_deg : ∀ (i : Fin n), (p i).natDegree ≤ ↑i
i j : Fin n
this : (p j).support ⊆ range n
k : Fin n
⊢ (RingHom.id R) ((p j).coeff ↑k) * v i ^ ↑k = v i ^ ↑k * of (fun i j => (p j).coeff ↑i) k j
state_after: no goals
tactic: rw [mul_comm, Matrix.of_apply, RingHom.id_apply]