参考文献
oi-wiki 插值
oi-wiki 多项式快速插值
前置知识
多项式基础
洛必达法则
当我们面临一个问题:
有 n 个点 (x1,y1),(x2,y2),⋯,(xn,yn),求一个经过所有点的函数 f(x) 的函数表达式。
我们可以通过一定的拟合方式找出这个函数。
比如用分段线性函数拟合 f(x),这种方法被称作线性插值。
又或者用多项式拟合 f(x),这种方法被称作多项式插值。
多项式插值的其中一种方式就是拉格朗日插值法
Lagrange 插值法
首先设第 i 个点 pi 在 x 轴上的投影 pi′=(xi,0)。
考虑构造 n 个函数 f1(x),f2(x),⋯,fn(x),满足其图像经过 {pj′(xj,0),j=ipi(xi,yi),则可以得到 f(x)=i=1∑nfi(x)。
可以设 fi(x)=a⋅∏j=i(x−xj),将点 pi(xi,yi) 代入可以知道,a=∏j=i(xi−xj)yi,所以
fi(x)=yi⋅∏j=i(xi−xj)∏j=i(x−xj)=yi⋅j=i∏(xi−xj)(x−xj)
因此我们就可以得到拉格朗日插值法形如:
f(x)=i=1∑nyi⋅j=i∏(xi−xj)(x−xj)
朴素实现的时间复杂度为 O(nlogn)。
多项式快速插值
记多项式 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)=i=1∑⌊2n⌋vij=i∧⌊2n⌋<j≤n∏(x−xj)M0(x)=i=1∏⌊2n⌋(x−xi)f1(x)=i=⌊2n⌋+1∑nvij=i∧⌊2n⌋<j≤n∏(x−xj)M1(x)=i=⌊2n⌋+1∏n(x−xi)
可得 f(x)=f0(x)M1(x)+f1(x)M0(x),M(x)=M0(x)M1(x),因此可以分治计算,复杂度 O(nlogn)。