快速多项式全家桶 简略总结 (不确定里面的内容对不对)

多项式牛顿迭代

解决的问题:求一个[多项式函数](?)\(G\),使得 \(F(G) \equiv 0 \pmod {x ^ n}\)

(听 XK 提到 泛函分析)

\[G_{k+1} \equiv G_k - \frac { F(G_k) } { F'(G_k) } \pmod {x ^ { 2 ^ { k + 1 } }} \]

求导时把 \(G\) 当成未知数,不要对 \(G\) 求导。

倍增。

加法

每一项对应加。

时间 \(O(n)\)

乘法

NTT。

时间 \(O(n \log n)\)

求导

对每一项分别求导。

\[(x ^ n)' = n x ^ {n - 1} \]

\[f' _ i = (i + 1) f _ { i + 1 } \]

时间 \(O(n)\)

积分

就是求导反过来。

\[f _ i = \frac { f' _ { i - 1 } } { i } \]

时间 \(O(n)\)

求逆

把式子变成 \(\ldots \equiv 0\) 的形式。设左边那一堆为 \(H(G)\)。(\(G\) 是要求的多项式)

要求 \(H(G) = 0\),牛顿迭代求 \(G\) 即可。

初值(\(g_0\))等于 \(f_0\) [在模意义下](?)的乘法逆元。

时间 \(O(n \log n)\)

[开平方根](?)

牛顿迭代(类似求逆)。

初值可能要用二次剩余。


\(\ln\)\(\exp\) 互为逆运算。


ln

\[\ln G(x) = F(x) \]

\(F\),求 \(G\)

推式子要用:

\[\ln ' ( x ) = \frac { 1 } { x } \]

推式子:对两边求导,再把两边都积分回去。

做:对于左边,求导、求逆 -> 相乘 -> 积分。

初值 \(\ln 1 = 0\)。(不能有其他的吗?)

时间 \(O(n \log n)\)

exp

先对两边求 \(\ln\)。再用牛顿迭代(类似求逆)做,要用多项式 \(\ln\)

时间 \(O(n \log n)\)

除法、取余

\[F(x) = G(x) H(x) + R(x) \]

\(F, G\),求 \(H, R\)

\(F\) 的次数是 \(n\)\(G\) 的次数是 \(m\)。那么 \(H\) 的次数就是 \((n - m)\),而 \(R\) 的次数是 \(m - 1\)

等式两边把 \(x\) 换成 \(x ^ { - 1 }\) 后同乘 \(x ^ n\),得到系数翻转后的多项式。\(\pmod {x ^ { n - m + 1 }}\)\(R\) 变成的那个多项式变成 \(0\),而且这样不会使 \(H\) 有损失,因为系数翻转后的 \(H\) 的次数 \((n - m)\) 小于 \((n - m + 1)\)。于是直接用多项式求逆和多项式乘法求出系数翻转后的 \(H\)。然后把系数翻转回来求出真正的 \(H\),再利用它求 \(G\)(多项式乘法、多项式减法)即可。

时间 \(O(n \log n)\)

原理的关键在于我们可以用 \(\pmod {x ^ \ldots}\) 来去掉次数较高的项。但是这里 \(R\) 的次数较小,所以我们把系数翻转再用 \(\pmod {x ^ \ldots}\) 来消除 \(R\) 变成的多项式的影响。(从 https://zhuanlan.zhihu.com/p/678382384https://www.cnblogs.com/blog-Dr-J/p/10487228.html 学到这一点)

2024.8.10

posted @ 2024-08-10 21:00  huangkxQwQ  阅读(6)  评论(0编辑  收藏  举报