概述
设 A 是一个交换环, f,g∈A[x] 满足次数小于 n ,需要快速求出 f(g(x))modxn。
设 M(n) 是两个次数小于 n 的 A[x] 中的元素相乘所需的时间复杂度。
1978:Brent-Kung 算法。O(M(n)nlogn)
2008: Kedlaya ,Umans 提出的算法。
只能在 Fq 下面做,O(n2O(lognloglogn)logq)
2023: Neiger,Salvy 等人提出的算法。O(n1.43)
2024:Yasunori Kinoshita 和 Baitian Li 在 FOCS 2024 提出了一个简单、高效的算法。
Bostan-Mori,Power Projection
对于项数小于 n 的 f,g∈A[x],求 [xm]g(x)f(x) 。
g(x)f(x)=g(x)g(−x)f(x)g(−x)
设 $f(x)g(-x)=a_0 x^{0}+a_1 x^{1}+\dots $。提取出其奇数项和偶数项,记 f0(x)=a0x0+a2x1+a4x2+…,f1(x)=a1x0+a3x1+a5x2+… 。
g(x)g(−x) 是偶函数,令 p(x)=∑xi[x2i]g(x)g(−x) 。
则 [xm]g(x)f(x)=[x⌊2m⌋]p(x)fmmod2(x)
算法复杂度 O(M(n)logm) 。
现在我们解决以下问题:给定项数小于 n 的 f∈A[x] ,求出 [xn]f0(x),[xn]f1(x),…,[xn]fn(x) 。
等价于求 [xn]1−yf(x)1 。采用类似的思路。
可以看成是两个二元多项式 f(x,y),g(x,y)∈A[x,y] ,求 [xn]g(x,y)f(x,y) 。
设 f0(x,y),f1(x,y) 是 f(x,y)g(−x,y) 关于 x 提取偶数项,奇数项的结果。
设 p(x,y) 是 g(x,y)g(−x,y) 关于 x 提取偶数项后的结果。
则 [xn]g(x,y)f(x,y)=[x⌊2n⌋]p(x,y)fnmod2(x,y) 。
递归到 [x0]g(x,y)f(x,y) 的时候直接求 [x0]g(x,y)[x0]f(x,y) 就好了。
分析一下上述算法的时间复杂度。
递归 i 轮后 f(x,y),g(x,y) 中 x 的次数不超过 2in ,y 的次数不超过 2i 。
递归 logn 轮,复杂度 O(M(n)logn) 。
基于转置原理的方法
转置原理:对于一个 n×n 的矩阵 A 。
若存在一个算法可以对任意长度为 n 的列向量 b 计算出 Ab 。
那么一定存在一个算法能够以相同的效率计算 ATb 。
回顾我们的问题,设矩阵 AT 满足 Ai,j=[xi]gj(x) ,f 形成的列向量为 b 。则需要计算 ATb 。
只需要思考 Ab 的求法即可,即计算 aj=∑biAi,j=∑bi[xi]gj(x) 。
设 h(x)=∑bixn−i ,则 aj=[xnyj]1−yg(x)h(x) 。
使用 Bostan-Mori 即可。
不需要转置原理的方法
设 P(y)=ynf(y−1),Q(x,y)=1−yg(x) ,则:
f(g(x))=i=0∑n([yi]f(y))g(x)i=[yn]ynf(y−1)1−yg(x)1=[yn]Q(x,y)P(y)
记 Fl,r(Q(x,y))=i=l∑r−1yi−l[yi]Q(x,y),则我们希望求出 Fn,n+1(Q(x,y)P(y))modxn 。
思考 Fl,r(Q(x,y)P(y))modxn 的求法。
n=1 时,答案即 Fl,r(Q(0,y)P(y)) 。
n>1 时,考虑
Fl,r(Q(x,y)P(y))modxn=Fl,r(Q(x,y)Q(−x,y)modxnmodyrP(y)Q(−x,y))modxn=Fl,r(V(x2,y)P(y)Q(−x,y))modxn:=u
其中 V(x2,y)=Q(x,y)Q(−x,y)modxnmodyr 。
记 e=max(0,l−degyQ(x,y)) 。
u=Fl,r(yeFe,r(V(x2,y)P(y))Q(−x,y))modxn=Fl−e,r−e(Fe,r(V(x2,y)P(y))Q(−x,y))modxn=Fl−e,r−e(Fe,r(V(z,y)P(y))modz⌈2n⌉∣z=x2Q(−x,y))modxn
递归计算 Fe,r(V(x,y)P(y))modx⌈2n⌉ 即可。
可以发现递归至第 i+1 轮时,degxQ(x,y)≤2in,degyQ(x,y)≤2i,r−l≤2i 。
复杂度 O(M(n)logn) 。
n=1 时不需要对多项式进行求逆。
设初始的分母为 Q0(x,y) 。
考虑递归 d 轮后 Qd(x,y)=(Q0(x,y)Q0(−x,y))2d−1 ,则 Qd(0,y)=Q0(0,y)2d 。
代入 Q0(0,y)=1−yg(0) ,得到 (1−yg(0))2d1=i≥0∑(yg(0))i(i2d−1+i) 。
这就说明了为什么对任何交换环 A ,这个算法都可以计算 f,g∈A[x] 时的 f(g(x)) 。
总结
两个做法都是将问题转化为求二元分式的某项值,然后通过类似 Bostan-Mori 的算法求解。
但又存在一定区别:一个需要计算 [xn]1−yg(x)h(x) ,一个需要计算 [yn]1−yg(x)h(y) ,所以具体步骤存在很多不同。