20260114 Bostan-Mori

用途

求解 \([x^n]\frac{P(x)}{Q(x)}\),其中 \(n\) 较大。

做法

上下同乘 \(Q(-x)\),即转为 \(\frac{P(x)Q(-x)}{Q(x)Q(-x)}\)

分子看着比较杂,考虑观察分母的形式。

发现因为 \(Q(-x)\) 为每个 \(x\) 带了 \(-\),这相当于是给了一个抵消的思想。
具体来说,如果 \(q_i x^i \times q_j (-x)^j = (-1)^j q_i q_j x^{i + j} (i\not = j)\) 能贡献给 \(i + j\),那么交换 \(i, j\)\(q_j x^j\times q_i(-x)^i = (-1)^i q_i q_j x^{i + j} (i\not = j)\) 也能贡献 \(i + j\),若 \((-1)^i + (-1)^j = 0\),那么 \((i, j)\) 就相当于贡献了 \(0\)

于是能够发现 \(Q(x)Q(-x)\) 在奇数次的系数一定为 \(0\),因为对于奇数 \(x\),每一组 \((i, x - i)\) 一定恰好一奇一偶,所以交换符号变化,总和抵消为 \(0\)

这说明我们可以把 \(Q(x)Q(-x)\) 的偶数项系数提出来,表示为 \(Q_0(x^2)\)

收到 \(Q_0\) 的影响,考虑把 \(P(x)Q(-x)\) 的奇数项偶数项系数拆开,变为 \(P_0(x^2) + xP_1(x^2)\) 的形式(\(P_0(x)\) 中为偶数项,\(P_1(x)\) 中为奇数项)。

于是可以把要求解的项表示为 \([x^n] \frac{P_0(x^2)}{Q_0(x^2)} + x \frac{P_1(x^2)}{Q_0(x^2)}\)

此时因为 \(P_0, P_1, Q_0\) 中都为 \(x^2\),所以 \(\frac{P_0(x^2)}{Q_0(x^2)}, \frac{P_1(x^2)}{Q_0(x^2)}\) 中非 \(0\) 系数都出现在偶数项,于是 \(x\frac{P_1(x^2)}{Q_0(x^2)}\) 的非 \(0\) 系数都在奇数项。

由此,奇数项和偶数项的系数就被隔离开了,可以根据 \(n\) 的奇偶进行下一步递归。

总的来说就是:

\[\begin{align*} [x^n]\frac{P(x)}{Q(x)} &= [x^n]\frac{P(x)Q(-x)}{Q(x)Q(-x)}\\ &= [x^n] \frac{P_0(x^2)}{Q_0(x^2)} + x \frac{P_1(x^2)}{Q_0(x^2)}\\ &= \begin{cases} [x^{\frac{n}{2}}] \frac{P_0(x)}{Q_0(x)} & n\bmod 2 = 0\\ [x^{\frac{n - 1}{2}}] \frac{P_1(x)}{Q_0(x)} &n\bmod 2 = 1\end{cases} \end{align*} \]

最后会一直递归到 \(n = 0\) 的情况,那么这就是常数项 \(\frac{p_0}{q_0}\)

复杂度分析

因为每次 \(n\) 折半,递归过程只会进行 \(\mathcal{O}(\log n)\) 次。

每次操作时,会发现 \(\deg Q_0 = \deg Q, \max (\deg P_0, \deg P_1)\le \lceil\frac{\deg P + \deg Q}{2}\rceil\)
这说明递归过程中 \(\deg Q_0\) 始终为 \(\deg Q\)\(\deg P_{0 / 1}\) 始终不超过 \(\max(\deg P, \deg Q)\)

于是记 \(\max(\deg P, \deg Q) = k\),因为需要多项式乘法,复杂度为 \(\mathcal{O}(k\log k\log n)\)

鲜花

同乘 \(Q(-x)\) 是怎么想出来的,感觉也太精妙了。

其实这个主要用途就是用于常系数齐次线性递推(真的吗?)。
之前写的 poly 感觉太丑了,新写一份却摆了,或许我永远也不会写它吧。

还看到了引入单位根的多叉 Bostan-Mori,等到想学再去学吧!

说不定 Bostan-Mori 已经不是科技了,但那又怎样呢?

posted @ 2026-01-14 16:18  rizynvu  阅读(7)  评论(0)    收藏  举报