高阶差分求解多项式求和

高阶差分求解多项式求和

高阶差分

Δf(x)=f(x+1)f(x)。称 Δf(x)f(x) 的一阶差分。

同理:记 Δnf(x)=Δn1f(x+1)Δn1f(x) 。称 Δnf(x)f(x)n 阶差分。

下面给出差分的几个比较重要的性质。


性质 1:若 f(x) 为度为 n 的多项式,则 Δn+1f(x)=0

证明:

Δf(x)=ai(x+1)iaixi

不难发现 Δf(x)xn 项的系数为 0

所以 Δf(x) 为度为 n1 的多项式。

又由于 Δnf(x)=Δn1f(x+1)Δn1f(x)

不难归纳出 Δkf(x) 的度数为 nk。当 k=nΔkf(x) 已经是常数了,再做一次差分归 0


性质 2

Δrf(x)=i=0r(1)ri(ri)f(x+i)

证明:

利用数学归纳法。当 r=1 的显然成立(直接带入发现一致)

rm 时此式成立,则设 r=m。我们只需证明 r+1 时该式同样成立即可。

根据定义有:

Δr+1f(x)=Δrf(x+1)Δrf(x)=i=0r(1)ri(ri)f(x+i+1)i=0r(1)ri(ri)f(x+i)=i=1r+1(1)r(i1)(ri1)f(x+i)i=0r(1)ri(ri)f(x+i)=i=1r((1)r(i1)(ri1)(1)ri)f(x+i)+(1)r(r+11)(rr)f(x+r+1)(1)r0(r0)f(x)=i=1r((1)ri+1((ri1)+(ri)))f(x+i)+(1)r+1r1(r+1r+1)f(x+r+1)+(1)r+10(r+10)f(x)=i=1r(1)r+1i(r+1i)f(x+i)+(1)r+1r1(r+1r+1)f(x+r+1)+(1)rl0(r+10)f(x)=i=0r+1(1)r+1i(r+1i)f(x+i)

证毕。


正题

高阶差分可以用来处理这样一类问题:

i=1nf(i)×qi

其中 f(i) 是一个度为 k 的多项式。


q=0 时。答案是 0

q=1 时,我们发现就是求一个多项式的前缀和。我们知道一个度为 n 的多项式的前缀和是一个度为 n+1 的多项式,所以我们直接拉格朗日插值即可。

q>1 时。

引入一个结论:

S(n)=i=0n1f(i)×qi 则存在一个度为 k 的多项式 G(x) 使得 S(n)=qn×G(n)G(0)

证明如下:

依旧是采用数学归纳法,当 k=0 时显然成立。

假设当 km 时成立,我们让 k=m+1

S(n)=i=0n1f(i)×qiq×S(n)=i=0n1f(i)×qi=i=1nf(i1)×qi(1q)×S(n)=i=0n1f(i)×qii=1nf(i1)×qi=i=0n1f(i)×qii=0nf(i1)×qi+f(1)=i=0n1(f(i)f(i1))×qif(n1)×qn+f(1)

注意到 f(i)f(i1) 是一个差分的形式,那么它的度应该是 k1。此时命题成立,那么我们将 i=0n1(f(i)f(i1))×qi 替换成 qn×P(n)P(0),其中 P(x) 是一个度为 k1 的多项式,那么有:

(1q)×S(n)=qn×P(n)P(0)f(n1)×qn+f(1)(1q)×S(n)=qn×(P(n)f(n1))(P(0)f(1))S(n)=qn×P(n)f(n1)1qP(0)f(1)1q

我们设 G(x)=P(x)f(x1)1q。易知 G(x) 是一个度为 k 的多项式。(f(x1) 的度为 k

那么有:

S(n)=qn×G(x)G(0)

证毕。


S(n)=i=0n1f(i)×qi=qn×G(n)G(0)

所以答案就应该是:

S(n+1)f(0)=qn+1×G(n+1)G(0)f(0)

f(0) 一般来说是比较好求的。

问题是如何快速求出 G(n+1)G(0)

由于 G 是一个度为 k 的多项式,只要我们能算出 G(0)G(k)。那么就可以通过插值插出 G(n+1)

问题转化成求 G(0)

还是依靠差分:

S(n+1)S(n)=qn+1×G(n+1)G(0)(qn×G(n)G(0))S(n+1)S(n)=qn+1×G(n+1)qn×G(n)qnf(n)=qn+1×G(n+1)qn×G(n)G(n+1)=qn×f(n)+qn×G(n)qn+1=f(n)+G(n)q

所以所有 G(n) 都可以用 k×G(0)+b 的形式表示出来。

但是我们只是得到了关系式,G(0) 的值我们依然不知道。

既然都差分了那就差分到底

回顾下高阶差分的性质 1,2。因为 G(x) 是一个度为 k 的多项式,所以 Δk+1G(x)=0。也就是:

Δk+1G(0)=i=0k+1(1)k+1i(k+1i)G(i)=0

而令人振奋的这一点是所有的 G(i) 都可以用 G(0) 表示!所以这其实是一个一元的方程!我们直接运用解出来 G(0) 即可。

那么上述问题就被解决了。复杂度是 O(k+logn) 的(基本上是线性的,显然插值此时也是线性,logn 在于预处理求逆元)。当然如果你比较懒一边算一边求逆元的话就是 O(klogn) 的了。也是比较优秀的的,不至于有人还卡这个

posted @   夜空之星  阅读(653)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示