多项式
推荐扶苏的 FFT 题解,讲得很不错。
一些记号
变量、数组会使用小写字母。
多项式会使用大写字母。一般大小写对应,如 \(A\) 是 \(a\) 的普通生成函数。\(A(x)\) 表示 \(x\) 代入后的取值。一般来说,生成函数会表示成关于 \(x\) 的幂指数形式。
多项式间的计算分为卷积(\(\times\))和对应位相乘(\(\cdot\))。其它就不多说了。
系数表示法
一个 \(n\) 次多项式 \(A\) 可以由长 \(n+1\) 的数列 \(a\) 唯一生成。
这种表示法的多项式卷积 \(C=A\times B\),有 \(c_{x}=\sum_y a_y b_{x-y}\),\(O(n^2)\)。
点值表示法
一个 \(n\) 次多项式 \(A\) 可以由 \(n+1\) 个横坐标不同的平面点对唯一生成。
点值表示的优势是点对的横坐标在不同的情况下可以指定。据此可以优化。
单位根优化
默认 \(n=2^k(k\in N)\)。
取 \(\omega_n\) 表示辐角为正且最小 \(n\) 次单位根,即 \(\omega_n^n=1\)。
那么多项式的点值横坐标可以取 \(x_i=\omega_n^i\)。
单位根有性质 \(\omega_{2n}^{2k}=\omega_n^k\)。
证明考虑复数的三角表示,显然有 \(\omega_n^k=\text{cos}\frac{2k\pi}{n}+\text{isin}\frac{2k\pi}{n}\)。
同样可证的还有 \(\omega_n^{k+\frac{n}{2}}=-\omega_n^k\)。
DFT
将多项式 \(A\) 变换为由 \(x_i=\omega_n^i\) 生成的点值表示。
将 \(A\) 奇偶分类。
令 \(A_1\) 为 \(a_{2i}\) 生成的多项式,\(A_2\) 为 \(a_{2i+1}\) 生成的多项式。
不难 \(A(x)=A_1(x^2)+xA_2(x^2)\)。
带入单位根 \(A(\omega_n^k)=A_1(\omega_n^{2k})+\omega_n^kA_2(\omega_n^{2k})=A_1(\omega_{\frac{n}{2}}^{k})+\omega_n^kA_2(\omega_{\frac{n}{2}}^{k})\)。
或者带入 \(A(\omega_n^{k+\frac{n}{2}})=A_1(\omega_n^{2k+n})+\omega_n^{k+\frac{n}{2}}A_2(\omega_n^{2k+n})=A_1(\omega_n^{2k})-\omega_n^{k}A_2(\omega_n^{2k})=A_1(\omega_{\frac{n}{2}}^{k})-\omega_n^kA_2(\omega_{\frac{n}{2}}^{k})\)。
也就是说,超过一半的单位根的取值可以由前一半的取值得出。复杂度自然就正确了。
IDFT
傅里叶逆变换,点值转系数。
相当于求一个反演。
推柿子后,我们发现可以做 FFT 的时候把单位根取倒,结果 /n 就是答案了。取倒数时由于 cos 是偶函数,sin 是奇函数,其实就是把虚部取反。
FFT
我们直接发现最后一层下标即二进制表示翻转。
然后自下而上合并即可。
主要是位逆序置换,即 \(rev_i=(rev_{i>>1}>>1)|((i\&1)?(n>>1):0)\)
解释起来其实也不难,将末位扣掉翻转,原来末位是 1 就在第一位加一即可。
NTT
元素的阶的定义:模 p 意义下的正整数乘法群里的阶。
原根的定义:阶为 \(\varphi(p)\) 的元素。也就是模 p 意义下的正整数乘法群的生成元。
既然和抽象代数这么有关系那该证的性质就很好证了啊。
首先是原根存在定理,由于原根能生成整个乘法群,所以存在原根当且仅当乘法群是循环群。简记:\(2,4,p^k,2p^k\)。
然后是原根判定定理,即判断原根是否是生成元。生成元判定使用的是阶是否为 \(\varphi(p)\)。具体到数论描述,就是 \(g^{\frac{\varphi(p)}{q}}\) 都满足,\(q\) 为质数。
最后是原根个数定理。这个最直接,生成元是欧拉函数级别,就是 \(\varphi(\varphi(p))\)。
你考虑上面单位根的性质,会发现原根其实就是模 p 意义下的单位根。
所以直接带入即可。可惜不能三次变两次了。
牛顿迭代
思路就是求切线以后再求 0 点迭代。
直接记公式 \(G(x)\longleftarrow G(x)-\frac{F(G(x))}{F'(G(x))}\),每次迭代精度翻倍。
泰勒展开
不难推出。
多项式求逆
\(F(x)G(x)=1\)
通常是求前 \(n\) 项。
直接变 \(F(x)-\frac{1}{G(x)}=0\)
于是求这个函数的 0 点。
推柿子时将 \(F(x)\) 看作常数。
不难 \(2G(x)-F(x)G^2(x)\)
边界是 0 点逆元。
FMT/FWT
首先拓展生成函数的定义。考虑集合生成函数 \(F(x)=\sum f_S x^S\)。不需要考虑集合作为指数的具体含义,这只是表示它们是同一项。
那么定义关于集合运算的卷积就很自然了。
FWT 是用于处理集合幂卷积的。
与 FFT 类似,先将两个集合幂级数 FWT,使其可以逐点相乘,再 FWT 回来。

浙公网安备 33010602011771号