线性插值

感觉我正在日益沦为一个搬运工...

线性插值是指这样一个问题:给定整数n,m,以及一个n次多项式f0,1,2,,n1处的点值,即f(0),f(1),f(2),,f(n1),希望能在关于n线性时间内求出f(m)n106,m1018

利用多项式多点插值并求一次点值可以做到O(nlog2n),但显然是过不去的。

我们考虑多项式f的牛顿级数,设其为c,即:

i=0n1fixi=i=0n1ci(xi)

那么对于m=0,1,2,,n1,显然有:

f(m)=i=0n1ci(mi)

注意到当im(mi)0,于是修改求和上限:

f(m)=i=0mci(mi)

这就是经典的二项式反演的形式,于是我们就得到:

ci=j=0i(1)ij(ij)f(j)

进回带到求和上限为n1的式中,于是有:

f(m)=i=0n1((mi)j=0i(1)ij(ij)f(j))

套路一波,将对j的求和放到外面:

f(m)=j=0n1(f(j)i=jn1(1)ij(mi)(ij))

为了直观,我们用i替换ij

f(m)=j=0n1(f(j)i=0n1j(1)i(mi+j)(i+jj))

利用(mi+j)(i+jj)=(mj)(mji)进行替换,得到:

f(m)=j=0n1(f(j)i=0n1j(1)i(mj)(mji))

于是(mj)可以放到前面:

f(m)=j=0n1(f(j)(mj)i=0n1j(1)i(mji))

现在考虑求出下面的式子的封闭形式:

i=0n1(1)i(mi)

首先是应用上指标反转使(1)i(mi)=(im1i)

i=0n1(im1i)

考虑加入一个数(m11)=0

(m11)+i=0n1(im1i)

裂项:

(m11)+(m10)+i=1n1(im1i)(m0)+i=1n1(im1i)

一直重复,直到只剩下:

(nm1n1)

再进行上指标反转:

(1)n1(m1n1)

于是原式终于可以简化为:

f(m)=j=0n1(f(j)(mj)(1)n1j(m1jn1j))

整理,得:

f(m)=i=0n1(1)n1i(mi)(m1in1i)f(i)

用阶乘展开组合数:

f(m)=i=0n1(1)n1im!i!(mi)!(m1i)!(n1i)!(mn)!f(i)

继续整理:

f(m)=mni=0n1(1)n1i(mi)i!(n1i)!f(i)

于是就可以做了,mi的逆元可以用与预处理阶乘逆元的类似方法做到线性。总复杂度是O(n)

upd:被强大的姐姐打脸了...其实直接用拉格朗日插值公式即可推出和上面一样的东西...所以这篇文章只是想说数学真奇妙。