-rw-r--r-- 2364 leangoppa-20230726/Goppadecoding/interpolator.lean raw
import Mathlib.RingTheory.Polynomial.Basic
import Goppadecoding.sum
import Goppadecoding.vanishing
open Polynomial BigOperators
namespace Goppadecoding
section interpolator
variable {k: Type _} [Field k]
variable {U: Type _} [DecidableEq U]
theorem interpolator_eval {α: U → k} {S: Finset U} {r: U → k} {t: U}
(injective: Set.InjOn α S)
(tinS: t ∈ S)
: (interpolator α S r).eval (α t) = r t :=
by
calc
(interpolator α S r).eval (α t)
= (∑ s in S, C (r s) * vanishing_at_except_1_at α S s).eval (α t) := by rw[interpolator]
_ = ∑ s in S, (C (r s) * vanishing_at_except_1_at α S s).eval (α t) := by rw[eval_finset_sum]
_ = ∑ s in S, (C (r s)).eval (α t) * (vanishing_at_except_1_at α S s).eval (α t) := by simp only[eval_mul]
_ = ∑ s in S, r s * (vanishing_at_except_1_at α S s).eval (α t) := by simp only[eval_C]
_ = ∑ s in S, r s * (if t = s then (1: k) else 0) := by
apply Finset.sum_congr
simp only
intro s sinS
rw[vanishing_at_except_1_at_eval injective sinS tinS]
_ = ∑ s in S, (if t = s then r t else 0) := by simp only [mul_ite, mul_one, mul_zero, Finset.sum_ite_eq]
_ = r t := sum_singleton_ite (r t) tinS
theorem interpolator_unique {α: U → k} {S: Finset U} {r: U → k} {f: k[X]}
(injective: Set.InjOn α S)
(froots: (∀ s, (s ∈ S → f.eval (α s) = r s)))
(fdeg: degree f < S.card)
: f = interpolator α S r :=
by
let g := f - interpolator α S r
have gdeg: degree g < S.card := by
calc
degree g = degree (f - interpolator α S r) := by trivial
_ ≤ max (degree f) (degree (interpolator α S r)) := by apply degree_sub_le
_ < S.card := by simp only [ge_iff_le, max_lt_iff, fdeg, degree_interpolator_lt, and_self]
have groots: ∀ s, (s ∈ S → g.eval (α s) = 0) := by
intro s sinS
calc
g.eval (α s)
= (f - interpolator α S r).eval (α s) := by rfl
_ = f.eval (α s) - (interpolator α S r).eval (α s) := by rw[eval_sub]
_ = r s - r s := by rw[froots s sinS,interpolator_eval injective sinS]
_ = 0 := by group
have gzero: g = 0 := degree_below_vanishing α S g injective groots gdeg
calc
f = g + interpolator α S r := by group
_ = 0 + interpolator α S r := by rw[gzero]
_ = interpolator α S r := by group
end interpolator