跳转至

多项式多点求值|快速插值

多项式的多点求值

描述

给出一个多项式 f(x)n 个点 x1,x2,,xn,求

f(x1),f(x2),,f(xn)

解法

考虑使用分治来将问题规模减半。

将给定的点分为两部分:

X0={x1,x2,,xn2}X1={xn2+1,xn2+2,,xn}

构造多项式

g0(x)=xiX0(xxi)

则有 xX0:g0(x)=0

考虑将 f(x) 表示为 g0(x)Q(x)+f0(x) 的形式,即:

f0(x)f(x)(modg0(x))

则有 xX0:f(x)=g0(x)Q(x)+f0(x)=f0(x)X1 同理。

至此,问题的规模被减半,可以使用分治 + 多项式取模解决。

时间复杂度

T(n)=2T(n2)+O(nlogn)=O(nlog2n)

多项式的快速插值

描述

给出一个 n+1 个点的集合

X={(x0,y0),(x1,y1),,(xn,yn)}

求一个 n 次多项式 f(x) 使得其满足 (x,y)X:f(x)=y

解法

考虑拉格朗日插值公式

f(x)=i=1njixxjxixjyi

记多项式 M(x)=i=1n(xxi),由洛必达法则可知

ji(xixj)=limxxij=1n(xxj)xxi=M(xi)

因此多项式被表示为

f(x)=i=1nyiM(xi)ji(xxj)

我们首先通过分治计算出 M(x) 的系数表示,接着可以通过多点求值在 O(nlog2n) 时间内计算出所有的 M(xi)

我们令 vi=yiM(xi),接下来考虑计算出 f(x)。对于 n=1 的情况,有 f(x)=v1,M(x)=xx1。否则令

f0(x)=i=1n2vijijn2(xxj)M0(x)=i=1n2(xxi)f1(x)=i=n2+1nvijin2<jn(xxj)M1(x)=i=n2+1n(xxi)

可得 f(x)=f0(x)M1(x)+f1(x)M0(x),M(x)=M0(x)M1(x),因此可以分治计算,这一部分的复杂度同样是 O(nlog2n)