线性插值

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

线性插值是指这样一个问题:给定整数\(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\):被打脸了...其实直接用拉格朗日插值公式即可推出和上面一样的东西...所以这篇文章只是想说数学真奇妙。

转载于:https://www.cnblogs.com/Mr-Spade/p/10043561.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值