高阶差分求解多项式求和
高阶差分
记 Δf(x)=f(x+1)−f(x)。称 Δf(x) 为 f(x) 的一阶差分。
同理:记 Δnf(x)=Δn−1f(x+1)−Δn−1f(x) 。称 Δnf(x) 为 f(x) 的 n 阶差分。
下面给出差分的几个比较重要的性质。
性质 1:若 f(x) 为度为 n 的多项式,则 Δn+1f(x)=0。
证明:
Δf(x)=∑ai(x+1)i−aixi
不难发现 Δf(x) 的 xn 项的系数为 0。
所以 Δf(x) 为度为 n−1 的多项式。
又由于 Δnf(x)=Δn−1f(x+1)−Δn−1f(x)。
不难归纳出 Δkf(x) 的度数为 n−k。当 k=n 是 Δkf(x) 已经是常数了,再做一次差分归 0。
性质 2 :
Δrf(x)=r∑i=0(−1)r−i(ri)f(x+i)
证明:
利用数学归纳法。当 r=1 的显然成立(直接带入发现一致)
若 r≤m 时此式成立,则设 r=m。我们只需证明 r+1 时该式同样成立即可。
根据定义有:
Δr+1f(x)=Δrf(x+1)−Δrf(x)=r∑i=0(−1)r−i(ri)f(x+i+1)−r∑i=0(−1)r−i(ri)f(x+i)=r+1∑i=1(−1)r−(i−1)(ri−1)f(x+i)−r∑i=0(−1)r−i(ri)f(x+i)=r∑i=1((−1)r−(i−1)(ri−1)−(−1)r−i)f(x+i)+(−1)r−(r+1−1)(rr)f(x+r+1)−(−1)r−0(r0)f(x)=r∑i=1((−1)r−i+1((ri−1)+(ri)))f(x+i)+(−1)r+1−r−1(r+1r+1)f(x+r+1)+(−1)r+1−0(r+10)f(x)=r∑i=1(−1)r+1−i(r+1i)f(x+i)+(−1)r+1−r−1(r+1r+1)f(x+r+1)+(−1)r−l−0(r+10)f(x)=r+1∑i=0(−1)r+1−i(r+1i)f(x+i)
证毕。
正题
高阶差分可以用来处理这样一类问题:
求 ∑ni=1f(i)×qi。
其中 f(i) 是一个度为 k 的多项式。
当 q=0 时。答案是 0。
当 q=1 时,我们发现就是求一个多项式的前缀和。我们知道一个度为 n 的多项式的前缀和是一个度为 n+1 的多项式,所以我们直接拉格朗日插值即可。
当 q>1 时。
引入一个结论:
设 S(n)=∑n−1i=0f(i)×qi 则存在一个度为 k 的多项式 G(x) 使得 S(n)=qn×G(n)−G(0)
证明如下:
依旧是采用数学归纳法,当 k=0 时显然成立。
假设当 k≤m 时成立,我们让 k=m+1。
S(n)=n−1∑i=0f(i)×qiq×S(n)=n−1∑i=0f(i)×qi=n∑i=1f(i−1)×qi(1−q)×S(n)=n−1∑i=0f(i)×qi−n∑i=1f(i−1)×qi=n−1∑i=0f(i)×qi−n∑i=0f(i−1)×qi+f(−1)=n−1∑i=0(f(i)−f(i−1))×qi−f(n−1)×qn+f(−1)
注意到 f(i)−f(i−1) 是一个差分的形式,那么它的度应该是 k−1。此时命题成立,那么我们将 ∑n−1i=0(f(i)−f(i−1))×qi 替换成 qn×P(n)−P(0),其中 P(x) 是一个度为 k−1 的多项式,那么有:
(1−q)×S(n)=qn×P(n)−P(0)−f(n−1)×qn+f(−1)(1−q)×S(n)=qn×(P(n)−f(n−1))−(P(0)−f(−1))S(n)=qn×P(n)−f(n−1)1−q−P(0)−f(−1)1−q
我们设 G(x)=P(x)−f(x−1)1−q。易知 G(x) 是一个度为 k 的多项式。(f(x−1) 的度为 k)
那么有:
S(n)=qn×G(x)−G(0)
证毕。
S(n)=∑n−1i=0f(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)=k+1∑i=0(−1)k+1−i(k+1i)G(i)=0
而令人振奋的这一点是所有的 G(i) 都可以用 G(0) 表示!所以这其实是一个一元的方程!我们直接运用解出来 G(0) 即可。
那么上述问题就被解决了。复杂度是 O(k+logn) 的(基本上是线性的,显然插值此时也是线性,logn 在于预处理求逆元)。当然如果你比较懒一边算一边求逆元的话就是 O(klogn) 的了。也是比较优秀的的,不至于有人还卡这个。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】