线性插值

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

线性插值是指这样一个问题:给定整数\(n,m\),以及一个\(n\)次多项式\(f\)\(0,1,2,\dots,n-1\)处的点值,即\(f(0),f(1),f(2),\dots,f(n-1)\),希望能在关于\(n\)线性时间内求出\(f(m)\)\(n\leq 10^6,m\leq 10^{18}\)

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

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

\[\sum_{i=0}^{n-1}f_ix^i=\sum_{i=0}^{n-1}c_i{x\choose i} \]

那么对于\(m=0,1,2,\dots,n-1\),显然有:

\[f(m)=\sum_{i=0}^{n-1}c_i{m\choose i} \]

注意到当\(i\geq m\)\({m\choose i}\)\(0\),于是修改求和上限:

\[f(m)=\sum_{i=0}^mc_i{m\choose i} \]

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

\[c_i=\sum_{j=0}^i(-1)^{i-j}{i\choose j}f(j) \]

进回带到求和上限为\(n-1\)的式中,于是有:

\[f(m)=\sum_{i=0}^{n-1}\Bigg({m\choose i}\sum_{j=0}^i(-1)^{i-j}{i\choose j}f(j)\Bigg) \]

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

\[f(m)=\sum_{j=0}^{n-1}\Bigg(f(j)\sum_{i=j}^{n-1}(-1)^{i-j}{m\choose i}{i\choose j}\Bigg) \]

为了直观,我们用\(i\)替换\(i-j\)

\[f(m)=\sum_{j=0}^{n-1}\Bigg(f(j)\sum_{i=0}^{n-1-j}(-1)^i{m\choose i+j}{i+j\choose j}\Bigg) \]

利用\({m\choose i+j}{i+j\choose j}={m\choose j}{m-j\choose i}\)进行替换,得到:

\[f(m)=\sum_{j=0}^{n-1}\Bigg(f(j)\sum_{i=0}^{n-1-j}(-1)^i{m\choose j}{m-j\choose i}\Bigg) \]

于是\({m\choose j}\)可以放到前面:

\[f(m)=\sum_{j=0}^{n-1}\Bigg(f(j){m\choose j}\sum_{i=0}^{n-1-j}(-1)^i{m-j\choose i}\Bigg) \]

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

\[\sum_{i=0}^{n-1}(-1)^i{m\choose i} \]

首先是应用上指标反转使\((-1)^i{m\choose i}={i-m-1\choose i}\)

\[\sum_{i=0}^{n-1}{i-m-1\choose i} \]

考虑加入一个数\({-m-1\choose -1}=0\)

\[{-m-1\choose -1}+\sum_{i=0}^{n-1}{i-m-1\choose i} \]

裂项:

\[{-m-1\choose -1}+{-m-1\choose 0}+\sum_{i=1}^{n-1}{i-m-1\choose i} \]

\[{-m\choose 0}+\sum_{i=1}^{n-1}{i-m-1\choose i} \]

一直重复,直到只剩下:

\[{n-m-1\choose n-1} \]

再进行上指标反转:

\[(-1)^{n-1}{m-1\choose n-1} \]

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

\[f(m)=\sum_{j=0}^{n-1}\Bigg(f(j){m\choose j}(-1)^{n-1-j}{m-1-j\choose n-1-j}\Bigg) \]

整理,得:

\[f(m)=\sum_{i=0}^{n-1}(-1)^{n-1-i}{m\choose i}{m-1-i\choose n-1-i}f(i) \]

用阶乘展开组合数:

\[f(m)=\sum_{i=0}^{n-1}(-1)^{n-1-i}\frac{m!}{i!(m-i)!}\frac{(m-1-i)!}{(n-1-i)!(m-n)!} f(i) \]

继续整理:

\[f(m)=m^{\underline n}\sum_{i=0}^{n-1}\frac{(-1)^{n-1-i}}{(m-i)i!(n-1-i)!}f(i) \]

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

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

posted @ 2018-11-30 13:08  Mr_Spade  阅读(1012)  评论(1编辑  收藏  举报