跳转至

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

多项式的多点求值

描述

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

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

解法

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

将给定的点分为两部分:

X0={x1,x2,…,x⌊n2⌋}X1={x⌊n2⌋+1,x⌊n2⌋+2,…,xn}

构造多项式

g0(x)=∏xi∈X0(x−xi)

则有 ∀x∈X0:g0(x)=0.

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

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

则有 ∀x∈X0:f(x)=g0(x)Q(x)+f0(x)=f0(x),X1 同理.

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

时间复杂度

T(n)=2T(n2)+O(nlog⁡n)=O(nlog2⁡n)

多项式的快速插值

描述

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

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

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

解法

考虑拉格朗日插值公式

f(x)=∑i=1n∏j≠ix−xjxi−xjyi

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

∏j≠i(xi−xj)=limx→xi∏j=1n(x−xj)x−xi=M′(xi)

因此多项式被表示为

f(x)=∑i=1nyiM′(xi)∏j≠i(x−xj)

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

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

f0(x)=∑i=1⌊n2⌋vi∏j≠i∧j≤⌊n2⌋(x−xj)M0(x)=∏i=1⌊n2⌋(x−xi)f1(x)=∑i=⌊n2⌋+1nvi∏j≠i∧⌊n2⌋<j≤n(x−xj)M1(x)=∏i=⌊n2⌋+1n(x−xi)

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