多项式的多点求值
描述
给出一个多项式 f(x) 和 n 个点 x1,x2,…,xn,求
f(x1),f(x2),…,f(xn)
解法
考虑使用分治来将问题规模减半。
将给定的点分为两部分:
X0X1={x1,x2,…,x⌊2n⌋}={x⌊2n⌋+1,x⌊2n⌋+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(2n)+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=1∑nj=i∏xi−xjx−xjyi
记多项式 M(x)=∏i=1n(x−xi),由洛必达法则可知
j=i∏(xi−xj)=x→xilimx−xi∏j=1n(x−xj)=M′(xi)
因此多项式被表示为
f(x)=i=1∑nM′(xi)yij=i∏(x−xj)
我们首先通过分治计算出 M(x) 的系数表示,接着可以通过多点求值在 O(nlog2n) 时间内计算出所有的 M′(xi)。
我们令 vi=M′(xi)yi,接下来考虑计算出 f(x)。对于 n=1 的情况,有 f(x)=v1,M(x)=x−x1。否则令
f0(x)M0(x)f1(x)M1(x)=i=1∑⌊2n⌋vij=i∧j≤⌊2n⌋∏(x−xj)=i=1∏⌊2n⌋(x−xi)=i=⌊2n⌋+1∑nvij=i∧⌊2n⌋<j≤n∏(x−xj)=i=⌊2n⌋+1∏n(x−xi)
可得 f(x)=f0(x)M1(x)+f1(x)M0(x),M(x)=M0(x)M1(x),因此可以分治计算,这一部分的复杂度同样是 O(nlog2n)。