声明
本文大部分译自参考文献 [1],还有一些自己的理解和补充。
问题引入
对于一个特征值足够大的域
K,定义
K[[x]] 表示以
K 中元素为系数的形式幂级数。
那么,对于给定的多项式
f(x) 以及
n,k,我们希望求出:
[xk]f(x)0, [xk]f(x)1,…,[xk]f(x)n−1
设次数为
n 的多项式乘法复杂度为
M(n),那么本文可以给出该问题的一个
O(M(n+k)log(n+k)) 的解法。
Bostan-Mori 算法
该算法提出于参考文献 [2]。
对于给定的
n 次多项式
f(x),g(x) 以及
k,Bostan-Mori 算法能够求出:
[xk]g(x)f(x)
复杂度为
O(M(n)logk)。
引理 1
f(x)f(−x) 可以表示为
H(x2),即只包含偶数项。
证明
提取
f(x) 的奇偶次项,写成
f(x)=c0(x2)+xc1(x2),那么
f(x)f(−x)=c0(x2)2−x2c1(x2)2。
将式子进行重写:
g(x)f(x)=g(x)g(−x)f(x)g(−x)=H(x2)xP(x2)+Q(x2)
其中,
H(x2) 是将
g(x)g(−x) 重写,而
P(x2),Q(x2) 分别是提取
f(x)g(−x) 的奇数项和偶数项。
那么:
[xk]g(x)f(x)=⎩⎨⎧[x⌊k/2⌋]H(x)P(x)[x⌊k/2⌋]H(x)Q(x),2∣k,2∤k
可以递归到规模减半的子问题,递归边界为
k=0,是平凡的。
注意
P(x),Q(x),H(x) 的次数仍然是
n,所以该算法时间复杂度为
O(M(n)logk)。
原问题的算法
我们假设
[x0]f(x)=0,否则,我们可以让
f(x) 减去常数项求解,最后多一次卷积。
记
ansi=[xk]f(x)i,那么我们有:
ansi=[xkyi]j∑yjf(x)j=[xkyi]1−yf(x)1
于是我们只需要求出
[xk]1−yf(x)1,结果是
K[[y]] 中的元素。
我们应用 Bostan-Mori 算法。观察算法过程:每进行一次迭代,
y 的次数就会翻倍;由于我们可以把分子分母对
xk+1 取模,而
k 减半,从而
x 的次数也会减半。因此
x,y 的次数之积是
O(n+k) 的,可以在
O(M(n+k)) 的时间复杂度内计算二元多项式的乘法。
整个算法的复杂度是
O(M(n+k)log(n+k))。
在算法竞赛中,
K 通常为 NTT 模数域,此时时间复杂度为
O((n+k)log2(n+k))。
求解多项式复合逆
原文题有另外的一个解法,来自参考文献 [3]。其中用到了复合逆。我们可以通过一种“算两次”的方法反解出复合逆。下面介绍这种方法:
我们仍然要求
[xk]1−yf(x)1。但是这次我们设
H(x)=1−yx1 然后使用拉格朗日反演,设
g(x) 为
f(x) 的复合逆,那么:
[xk]1−yf(x)1=k1[xk−1]H′(x)(g(x)x)k=k1[xk−1](1−yx)2y(g(x)x)k
我们有
(1−x)21=i=0∑+∞ixi+1,带入得到:
[xk]1−yf(x)1=k1[xk−1]yi=0∑k(i+1)xiyi(g(x)x)k
ansi=[xkyi]1−yf(x)1=ki[xk−i](g(x)x)k
于是我们只需要求出
(x/g(x))kmodxk+1 就可以得到所有
ansi。
反之亦然,我们可以通过本文的方法得到
ansi,并逆推出
(x/g(x))kmodxk+1,然后再进行开
k 次根、求逆的操作,就可以得到
g(x)。
至此,我们完成了对多项式复合逆的求解。
求解多项式复合函数
根据参考文献 [4],多项式复合函数可以与多项式复合逆在相同复杂度内计算。
下面讲解如何使用复合逆求解复合函数。
假设我们有多项式
P(x)=i=1∑n−1pixi, Q(x)=i=0∑n−1qixi,目标是求出
R(x)=Q(P(x))modxn。
首先我们可以假设
p1=1, q0=0,否则假设有
k<n 满足
p1=p2=⋯=pk−1=0, pk=0,那么:
P~(x):=kpkP(x)Q~(x):=Q(pkxk)−q0R(x)=Q~(P~(x))+q0
就可以转化成
p1=1, q0=0 的情形。
记
P(−1)(x) 表示
P(x) 的复合逆,然后我们写出一些定义:
V(x):=P(−1)(x)modx2nVˉ(x):=(V(x)−xnQ(x)V′(x))modx2nPˉ(x):=V(−1)(x)modx2n
引理 1
P(x)=Pˉ(x)(modxn+1)
证明
设
k≤n,根据拉格朗日反演,我们有:
[xk]Pˉ(x)=k1[xk−1](V(x)−xnQ(x)V′(x)x)k=k1[xk−1](xV(x)−xnQ(x)V′(X))−n=k1[xk−1]i=0∑+∞(i−n)(−1)ixniQ(x)iV′(x)i(xV(x))−n−i
当
i≥1 时后面式子的次数
≥n,而
k−1<n,所以只用考虑
i=0 的项。那么:
[xk]Pˉ(x)=k1[xk−1](V(x)x)n=[xk]P(x)
所以
P(x)=Pˉ(x)(modxn+1)。
引理 2
P(Vˉ(x))=P(V(x))−xnP′(V(x))Q(x)V′(x)(modx2n)
证明
直接将
P(Vˉ(x)) 进行展开:
P(Vˉ(x))=i=1∑n−1pi(V(x)−xnQ(x)V′(x))i=i=1∑n−1pij=0∑i(ji)(−1)jV(x)i−jxnjQ(x)jV′(x)j
当
j≥2 时后半部分
modx2n=0,所以只取
j=0,1:
P(Vˉ(x))=i=1∑n−1piV(x)i+i=1∑n−1ipiV(x)i−1xnQ(x)V′(x)=P(V(x))−xnP′(V(x))Q(x)V′(x)
于是引理 2 得证。
因为
P(V(x))=x,所以有
P′(V(x))=V′(x)P′(V(x))=1。于是我们可以重写引理 2:
P(Vˉ(x))=x−xnQ(x)(modx2n)
然后我们将
Pˉ(x) 替换
x,得到:
P(x)=Pˉ(x)−Pˉ(x)nQ(Pˉ(x))(modx2n)
根据引理 1 有
P(x)=Pˉ(x)(modxn+1),而
Pˉ(x)n 的最低次项是
xn。因此
Pˉ(x), Q(Pˉ(x)) 中
≥n 次项在乘完后次数会
≥2n,因此可以对
xn 取模。于是这两个
Pˉ(x) 都可以替换为
P(x):
P(x)=Pˉ(x)−P(x)nQ(P(x))(modx2n)
也即:
xnR(x)=(P(x)x)n(Pˉ(x)−P(x))(modx2n)
因此我们只需要计算出
V(x),Vˉ(x),Pˉ(x) 便可以求出
R(x)modx2n,时间复杂度显然是和求复合逆等价的,为
O(M(n)logn)。
参考文献
[2] A. Bostan & R. Mori (2021). A Simple and Fast Algorithm for Computing the
N-th Term of a Linearly Recurrent Sequence. arXiv:2008.08822 [cs.SC]
[4] R. P. Brent and H. T. Kung (1978). Fast Algorithms for Manipulating Formal Power Series. J. ACM 25, 4 (Oct. 1978), 581–595.