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

tactic: unfold vandermonde
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
⊢ (vandermonde v).det = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
state_after: R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)

tactic: induction' n with n ih
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
v : Fin n → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
state_after: case zero
R : Type u_1
inst✝ : CommRing R
v : Fin 0 → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin 0, ∏ j ∈ Ioi i, (v j - v i)

case succ
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin (n + 1), ∏ j ∈ Ioi i, (v j - v i)

tactic: calc
  det (of fun i j : Fin n.succ => v i ^ (j : ℕ)) =
      det
        (of fun i j : Fin n.succ =>
          Matrix.vecCons (v 0 ^ (j : ℕ)) (fun i => v (Fin.succ i) ^ (j : ℕ) - v 0 ^ (j : ℕ)) i) :=
    det_eq_of_forall_row_eq_smul_add_const (Matrix.vecCons 0 1) 0 (Fin.cons_zero _ _) ?_
  _ =
      det
        (of fun i j : Fin n =>
          Matrix.vecCons (v 0 ^ (j.succ : ℕ))
            (fun i : Fin n => v (Fin.succ i) ^ (j.succ : ℕ) - v 0 ^ (j.succ : ℕ))
            (Fin.succAbove 0 i)) := by
    simp_rw [det_succ_column_zero, Fin.sum_univ_succ, of_apply, Matrix.cons_val_zero, submatrix,
      of_apply, Matrix.cons_val_succ, Fin.val_zero, pow_zero, one_mul, sub_self,
      mul_zero, zero_mul, Finset.sum_const_zero, add_zero]
  _ =
      det
        (of fun i j : Fin n =>
            (v (Fin.succ i) - v 0) *
              ∑ k ∈ Finset.range (j + 1 : ℕ), v i.succ ^ k * v 0 ^ (j - k : ℕ) :
          Matrix _ _ R) := by
    congr
    ext i j
    rw [Fin.succAbove_zero, Matrix.cons_val_succ, Fin.val_succ, mul_comm]
    exact (geom_sum₂_mul (v i.succ) (v 0) (j + 1 : ℕ)).symm
  _ =
      (∏ i ∈ Finset.univ, (v (Fin.succ i) - v 0)) *
        det fun i j : Fin n =>
          ∑ k ∈ Finset.range (j + 1 : ℕ), v i.succ ^ k * v 0 ^ (j - k : ℕ) :=
    (det_mul_column (fun i => v (Fin.succ i) - v 0) _)
  _ = (∏ i ∈ Finset.univ, (v (Fin.succ i) - v 0)) *
  det fun i j : Fin n => v (Fin.succ i) ^ (j : ℕ) := congr_arg _ ?_
  _ = ∏ i : Fin n.succ, ∏ j ∈ Ioi i, (v j - v i) := by
    simp_rw [Fin.prod_univ_succ, Fin.prod_Ioi_zero, Fin.prod_Ioi_succ]
    have h := ih (v ∘ Fin.succ)
    unfold Function.comp at h
    rw [h]
state_before: case succ
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin (n + 1), ∏ j ∈ Ioi i, (v j - v i)
state_after: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ ∀ (i j : Fin n.succ),
    of (fun i j => v i ^ ↑j) i j =
      of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) i j +
        vecCons 0 1 i * of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) 0 j

case succ.calc_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j

tactic: exact det_eq_one_of_card_eq_zero (Fintype.card_fin 0)
state_before: case zero
R : Type u_1
inst✝ : CommRing R
v : Fin 0 → R
⊢ (det fun i j => v i ^ ↑j) = ∏ i : Fin 0, ∏ j ∈ Ioi i, (v j - v i)
state_after: no goals

tactic: simp_rw [det_succ_column_zero, Fin.sum_univ_succ, of_apply, Matrix.cons_val_zero, submatrix,
  of_apply, Matrix.cons_val_succ, Fin.val_zero, pow_zero, one_mul, sub_self,
  mul_zero, zero_mul, Finset.sum_const_zero, add_zero]
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (of fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i).det =
    (of fun i j => vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i)).det
state_after: no goals

tactic: congr
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (of fun i j => vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i)).det =
    (of fun i j => (v i.succ - v 0) * ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)).det
state_after: case e_M.h.e_6.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (fun i j => vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i)) = fun i j =>
    (v i.succ - v 0) * ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)

tactic: ext i j
state_before: case e_M.h.e_6.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (fun i j => vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i)) = fun i j =>
    (v i.succ - v 0) * ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)
state_after: case e_M.h.e_6.h.h.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n
⊢ vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i) =
    (v i.succ - v 0) * ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)

tactic: rw [Fin.succAbove_zero, Matrix.cons_val_succ, Fin.val_succ, mul_comm]
state_before: case e_M.h.e_6.h.h.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n
⊢ vecCons (v 0 ^ ↑j.succ) (fun i => v i.succ ^ ↑j.succ - v 0 ^ ↑j.succ) (Fin.succAbove 0 i) =
    (v i.succ - v 0) * ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)
state_after: case e_M.h.e_6.h.h.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n
⊢ v i.succ ^ (↑j + 1) - v 0 ^ (↑j + 1) = (∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) * (v i.succ - v 0)

tactic: exact (geom_sum₂_mul (v i.succ) (v 0) (j + 1 : ℕ)).symm
state_before: case e_M.h.e_6.h.h.h
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n
⊢ v i.succ ^ (↑j + 1) - v 0 ^ (↑j + 1) = (∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) * (v i.succ - v 0)
state_after: no goals

tactic: simp_rw [Fin.prod_univ_succ, Fin.prod_Ioi_zero, Fin.prod_Ioi_succ]
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) = ∏ i : Fin n.succ, ∏ j ∈ Ioi i, (v j - v i)
state_after: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)

tactic: have h := ih (v ∘ Fin.succ)
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)
state_after: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
h : (det fun i j => (v ∘ Fin.succ) i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, ((v ∘ Fin.succ) j - (v ∘ Fin.succ) i)
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)

tactic: unfold Function.comp at h
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
h : (det fun i j => (v ∘ Fin.succ) i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, ((v ∘ Fin.succ) j - (v ∘ Fin.succ) i)
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)
state_after: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
h : (det fun i j => v i.succ ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j.succ - v i.succ)
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)

tactic: rw [h]
state_before: R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
h : (det fun i j => v i.succ ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j.succ - v i.succ)
⊢ ((∏ i : Fin n, (v i.succ - v 0)) * det fun i j => v i.succ ^ ↑j) =
    (∏ i : Fin n, (v i.succ - v 0)) * ∏ x : Fin n, ∏ j ∈ Ioi x, (v j.succ - v x.succ)
state_after: no goals

tactic: intro i j
state_before: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ ∀ (i j : Fin n.succ),
    of (fun i j => v i ^ ↑j) i j =
      of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) i j +
        vecCons 0 1 i * of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) 0 j
state_after: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ of (fun i j => v i ^ ↑j) i j =
    of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) i j +
      vecCons 0 1 i * of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) 0 j

tactic: simp_rw [of_apply]
state_before: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ of (fun i j => v i ^ ↑j) i j =
    of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) i j +
      vecCons 0 1 i * of (fun i j => vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i) 0 j
state_after: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v i ^ ↑j =
    vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i +
      vecCons 0 1 i * vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) 0

tactic: rw [Matrix.cons_val_zero]
state_before: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v i ^ ↑j =
    vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i +
      vecCons 0 1 i * vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) 0
state_after: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v i ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i + vecCons 0 1 i * v 0 ^ ↑j

tactic: refine Fin.cases ?_ (fun i => ?_) i
state_before: case succ.calc_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v i ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i + vecCons 0 1 i * v 0 ^ ↑j
state_after: case succ.calc_1.refine_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v 0 ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) 0 + vecCons 0 1 0 * v 0 ^ ↑j

case succ.calc_1.refine_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i✝ j : Fin n.succ
i : Fin n
⊢ v i.succ ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i.succ + vecCons 0 1 i.succ * v 0 ^ ↑j

tactic: rw [Matrix.cons_val_succ, Matrix.cons_val_succ, Pi.one_apply]
state_before: case succ.calc_1.refine_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i✝ j : Fin n.succ
i : Fin n
⊢ v i.succ ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) i.succ + vecCons 0 1 i.succ * v 0 ^ ↑j
state_after: case succ.calc_1.refine_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i✝ j : Fin n.succ
i : Fin n
⊢ v i.succ ^ ↑j = v i.succ ^ ↑j - v 0 ^ ↑j + 1 * v 0 ^ ↑j

tactic: ring
state_before: case succ.calc_1.refine_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i✝ j : Fin n.succ
i : Fin n
⊢ v i.succ ^ ↑j = v i.succ ^ ↑j - v 0 ^ ↑j + 1 * v 0 ^ ↑j
state_after: no goals

tactic: simp
state_before: case succ.calc_1.refine_1
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
i j : Fin n.succ
⊢ v 0 ^ ↑j = vecCons (v 0 ^ ↑j) (fun i => v i.succ ^ ↑j - v 0 ^ ↑j) 0 + vecCons 0 1 0 * v 0 ^ ↑j
state_after: no goals

tactic: cases n
state_before: case succ.calc_2
R : Type u_1
inst✝ : CommRing R
n : ℕ
ih : ∀ (v : Fin n → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin n, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j
state_after: case succ.calc_2.zero
R : Type u_1
inst✝ : CommRing R
ih : ∀ (v : Fin 0 → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin 0, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (0 + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j

case succ.calc_2.succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j

tactic: apply det_eq_of_forall_col_eq_smul_add_pred fun _ => v 0
state_before: case succ.calc_2.succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j
state_after: case succ.calc_2.succ.A_zero
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ ∀ (i : Fin (n✝ + 1)), ∑ k ∈ range (↑0 + 1), v i.succ ^ k * v 0 ^ (↑0 - k) = v i.succ ^ ↑0

case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ ∀ (i : Fin (n✝ + 1)) (j : Fin n✝),
    ∑ k ∈ range (↑j.succ + 1), v i.succ ^ k * v 0 ^ (↑j.succ - k) =
      v i.succ ^ ↑j.succ + v 0 * ∑ k ∈ range (↑j.castSucc + 1), v i.succ ^ k * v 0 ^ (↑j.castSucc - k)

tactic: rw [det_eq_one_of_card_eq_zero (Fintype.card_fin 0),
det_eq_one_of_card_eq_zero (Fintype.card_fin 0)]
state_before: case succ.calc_2.zero
R : Type u_1
inst✝ : CommRing R
ih : ∀ (v : Fin 0 → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin 0, ∏ j ∈ Ioi i, (v j - v i)
v : Fin (0 + 1) → R
⊢ (det fun i j => ∑ k ∈ range (↑j + 1), v i.succ ^ k * v 0 ^ (↑j - k)) = det fun i j => v i.succ ^ ↑j
state_after: no goals

tactic: intro j
state_before: case succ.calc_2.succ.A_zero
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ ∀ (i : Fin (n✝ + 1)), ∑ k ∈ range (↑0 + 1), v i.succ ^ k * v 0 ^ (↑0 - k) = v i.succ ^ ↑0
state_after: case succ.calc_2.succ.A_zero
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
j : Fin (n✝ + 1)
⊢ ∑ k ∈ range (↑0 + 1), v j.succ ^ k * v 0 ^ (↑0 - k) = v j.succ ^ ↑0

tactic: simp
state_before: case succ.calc_2.succ.A_zero
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
j : Fin (n✝ + 1)
⊢ ∑ k ∈ range (↑0 + 1), v j.succ ^ k * v 0 ^ (↑0 - k) = v j.succ ^ ↑0
state_after: no goals

tactic: intro i j
state_before: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
⊢ ∀ (i : Fin (n✝ + 1)) (j : Fin n✝),
    ∑ k ∈ range (↑j.succ + 1), v i.succ ^ k * v 0 ^ (↑j.succ - k) =
      v i.succ ^ ↑j.succ + v 0 * ∑ k ∈ range (↑j.castSucc + 1), v i.succ ^ k * v 0 ^ (↑j.castSucc - k)
state_after: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ k ∈ range (↑j.succ + 1), v i.succ ^ k * v 0 ^ (↑j.succ - k) =
    v i.succ ^ ↑j.succ + v 0 * ∑ k ∈ range (↑j.castSucc + 1), v i.succ ^ k * v 0 ^ (↑j.castSucc - k)

tactic: simp only [smul_eq_mul, Pi.add_apply, Fin.val_succ, Fin.coe_castSucc, Pi.smul_apply]
state_before: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ k ∈ range (↑j.succ + 1), v i.succ ^ k * v 0 ^ (↑j.succ - k) =
    v i.succ ^ ↑j.succ + v 0 * ∑ k ∈ range (↑j.castSucc + 1), v i.succ ^ k * v 0 ^ (↑j.castSucc - k)
state_after: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ x ∈ range (↑j + 1 + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    v i.succ ^ (↑j + 1) + v 0 * ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j - x)

tactic: rw [Finset.sum_range_succ, add_comm, tsub_self, pow_zero, mul_one, Finset.mul_sum]
state_before: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ x ∈ range (↑j + 1 + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    v i.succ ^ (↑j + 1) + v 0 * ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j - x)
state_after: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ v i.succ ^ (↑j + 1) + ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    v i.succ ^ (↑j + 1) + ∑ i_1 ∈ range (↑j + 1), v 0 * (v i.succ ^ i_1 * v 0 ^ (↑j - i_1))

tactic: congr 1
state_before: case succ.calc_2.succ.A_succ
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ v i.succ ^ (↑j + 1) + ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    v i.succ ^ (↑j + 1) + ∑ i_1 ∈ range (↑j + 1), v 0 * (v i.succ ^ i_1 * v 0 ^ (↑j - i_1))
state_after: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    ∑ i_1 ∈ range (↑j + 1), v 0 * (v i.succ ^ i_1 * v 0 ^ (↑j - i_1))

tactic: refine Finset.sum_congr rfl fun i' hi' => ?_
state_before: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
⊢ ∑ x ∈ range (↑j + 1), v i.succ ^ x * v 0 ^ (↑j + 1 - x) =
    ∑ i_1 ∈ range (↑j + 1), v 0 * (v i.succ ^ i_1 * v 0 ^ (↑j - i_1))
state_after: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
i' : ℕ
hi' : i' ∈ range (↑j + 1)
⊢ v i.succ ^ i' * v 0 ^ (↑j + 1 - i') = v 0 * (v i.succ ^ i' * v 0 ^ (↑j - i'))

tactic: rw [mul_left_comm (v 0), Nat.succ_sub, pow_succ']
state_before: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
i' : ℕ
hi' : i' ∈ range (↑j + 1)
⊢ v i.succ ^ i' * v 0 ^ (↑j + 1 - i') = v 0 * (v i.succ ^ i' * v 0 ^ (↑j - i'))
state_after: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
i' : ℕ
hi' : i' ∈ range (↑j + 1)
⊢ i' ≤ ↑j

tactic: exact Nat.lt_succ_iff.mp (Finset.mem_range.mp hi')
state_before: case succ.calc_2.succ.A_succ.e_a
R : Type u_1
inst✝ : CommRing R
n✝ : ℕ
ih : ∀ (v : Fin (n✝ + 1) → R), (det fun i j => v i ^ ↑j) = ∏ i : Fin (n✝ + 1), ∏ j ∈ Ioi i, (v j - v i)
v : Fin (n✝ + 1 + 1) → R
i : Fin (n✝ + 1)
j : Fin n✝
i' : ℕ
hi' : i' ∈ range (↑j + 1)
⊢ i' ≤ ↑j
state_after: no goals