Bostan-mori 算法 & LSB-first 算法

86 阅读1分钟

1. Bostan-mori 算法

可以 Θ(M(L)logn)\Theta(\mathsf{M}(L) \log n)[xn]F(x)G(x)\displaystyle[x^n]\frac{F(x)}{G(x)},其中 F(x)F(x)G(x)G(x) 都是 Θ(L)\Theta(L) 次多项式。

如果 n=0n=0,那么 [x0]F(x)G(x)=[x0]F(x)[x0]G(x)\displaystyle[x^0]\frac{F(x)}{G(x)}=\frac{[x^0]F(x)}{[x^0]G(x)},可以直接计算。

否则 F(x)G(x)=F(x)G(x)G(x)G(x)\displaystyle\frac{F(x)}{G(x)}=\frac{F(x)G(-x)}{G(x)G(-x)},令 H(x)=G(x)G(x)H(x)=G(x)G(-x),则 H(x)=H(x)H(x)=H(-x),所以 H(x)H(x) 奇数项全为 00

G(x2)=H(x),F0(x2)+F1(x2)x=F(x)G'(x^2)=H(x), F_0(x^2)+F_1(x^2)x=F(x)。若 nn 为奇数,[xn]F(x)G(x)=[x(n1)/2]F1(x)G(x)\displaystyle[x^n]\frac{F(x)}{G(x)}=[x^{(n-1)/2}]\frac{F_1(x)}{G(x)};若 nn 为偶数,[xn]F(x)G(x)=[xn/2]F0(x)G(x)\displaystyle[x^n]\frac{F(x)}{G(x)}=[x^{n/2}]\frac{F_0(x)}{G(x)}

只需要 Θ(logn)\Theta(\log n) 次多项式乘法即可。

2. LSB-first 算法

2.1. P4723 【模板】常系数齐次线性递推

给定 a0,a1,,ak1a_0, a_1, \ldots, a_{k-1},再给定 f1,f2,,fkf_1, f_2, \ldots, f_k,已知序列 aa 满足 ai=j=1kaij×fj\displaystyle a_i = \sum_{j = 1}^k a_{i-j}\times f_j,求 anmod998244353a_n \bmod 998244353 的值。

满足 n=109,k=3.2×104n = 10 ^ 9, k = 3.2\times 10^4

G(x)=1i=1kfixi,A(x)=i0aixi\displaystyle G(x)=1-\sum_{i=1}^kf_ix^i,A(x)=\sum_{i\ge 0}a_ix^i,存在 k1k-1 次多形式 F(x)=i=0k1(aij=0i1ajfij)xiF(x)=\displaystyle \sum_{i=0}^{k-1} \left(a_i-\sum_{j=0}^{i-1}a_j\cdot f_{i-j}\right)x^i,使得 A(x)=F(x)G(x)\displaystyle A(x)=\frac{F(x)}{G(x)},只需要求出 F(x)F(x) 就能用 Bostan-mori 算法求出答案。

F(x)=A(x)G(x)\displaystyle F(x)=A(x)\cdot G(x),已知 A(x)A(x)G(x)G(x) 在模 xkx^k 下的结果,于是可以直接卷积。

时间复杂度 Θ(M(k)logn)\Theta(\mathsf{M}(k) \log n)