Bostan-Mori 用于提取有理分式的远端系数
[xn]Q(x)P(x),其中
n 很大,
max(degP,degQ) 是常见的
m=105 范围。
分子分母同时乘上
Q(−x) 后,发现分母
Q(x)Q(−x) 仅余偶次项,不妨令其为
G(x2);将分子
P(x)Q(−x) 拆为
F0(x2)+xF1(x2),原式化为
G(x2)F0(x2)+xG(x2)F1(x2),分
n 的奇偶到其中一侧递归求解即可,时间复杂度为
O(mlogmlogn)。
提取
[xn]lnF(x):
[xn]lnF(x)=[xn]∫F(x)F′(x)dx=n1[xn−1]F(x)F′(x)。
提取
[xn]i=1∑mQi(x)Pi(x):
[xn]i=1∑mQi(x)Pi(x)=[xn]∏i=1mQi(x)∑i=1mPi(x)∏j=iQj(x),分子分母都可以分治乘求出。
顺便提一嘴
(i=1∏nFi(x))′=i=1∑nFi′(x)j=i∏Fj(x),有时候(比如说求
x+ai1 之和的时候)能够少一个分治乘。
举个若智的例子,比如说求
i=1∑naik,
k 很大,就是求
[xk]i=1∑n1−aix1,用上面的方法就能做到
O(nlognlogk)。
这玩意的主要用途貌似还是常系数齐次线性递推。
和常系数齐次线性递推:首先提取有理分式的远端系数问题可以转为常系数齐次线性递推,设
Q(x)F(x)=P(x),有
i=0∑n[xi]Q(x)[xn−i]F(x)=[xn]P(x),即:
[xn]F(x)=[x0]Q(x)1([xn]P(x)−i=1∑n[xi]Q(x)[xn−i]F(x))
当
n>m 时
[xn]P(x)=[xn]Q(x)=0,此时就变成常系数齐次线性递推。
常系数齐次线性递推也可以转为上述问题:设有递推关系
fn=i=1∑maifn−i 及初值
f0,f1,⋯,fm−1,设
f 的 OGF 为
F(x),
A(x)=i=1∑maixi,
F0(x)=i=0∑m−1fixi,不难验证有:
F(x)=A(x)F(x)+F0(x)−(A(x)F0(x)modxm)
因此有:
F(x)=1−A(x)F0(x)−(A(x)F0(x)modxm)
使用 Bostan-Mori 即可做到
O(mlogmlogn) 求解单项,常数很小。
原来这个东西叫做 LSB-first 吗。
多次询问:直接做是
O(qmlogmlogn) 的,考虑转成常系数齐次线性递推之后用多项式取模做法,预处理块幂,这样是
O(Bm+Bnmlogm+qmlogm) 的,取
B=O(nlogm) 有最优复杂度
O(mnlogm+qmlogm),或者说预处理多层块幂可以达到更好的平衡?比方说有
D+1 层,底层分块块长为
B,其它就按照
(Bn)1/D 分,这样复杂度是
O(Bm+D(Bn)1/Dmlogm+qDmlogm),取
B=O(DD/(D+1)n1/(D+1)logD/(D+1)m) 有最优复杂度
O(mDD/(D+1)n1/(D+1)logD/(D+1)m+qDmlogm),魔怔。
好吧 Bostan-Mori 本身也是可以多叉的?设
T=2t,那么
i=0∏T−1Q(ωTix) 只有次数是
T 的倍数的项系数非零,计算
∏i=0T−1Q(ωTix)P(x)∏i=1T−1Q(ωTix) 的复杂度是
O(mTlogm) 的,这样分割一次后直接跑多项式乘法逆,复杂度为
O(mTlogm+Tqnlogm),平衡一下复杂度是
O(nmqlogm) 的。
不过如果只算分母的话,每次从
2t−1 倍增合并到
2t,复杂度是
O(ntlogm) 的,但是分子还是算不了。
Bostan-Mori 还可以拓展到高维情况,只需要需提取的项
[x0nx1k1x2k2⋯xdkd] 中
k1,k2,⋯,kd 较小即可,复杂度大概是
O(m(∏ki)logn(logm+∑logki))。
还能够做一些位运算有关的魔怔东西,比方说求
n′⊆n∑[xn′]Q(x)P(x),只需要
F1(x)←+F0(x) 即可。
可是
[xn]expF(x) 和
[xn]F(x) 都只能整式递推/dk/dk