多项式学习笔记
多项式乘法
前置知识
系数表示法
形如:\(f(x)=\sum\limits_{i=0} a_i x^i\)。
点值表示法
其中 \(a_i\) 未知。要确定一个多项式:\(f(x)=\sum\limits_{i=0} a_i x^i\),就需要知道这个函数上的 \(n+1\) 个点。
所以将此多项式表示为 \((x_0,f(x_0))\cdots\)。
单位根
令 \(x \in \{x|x^n=1\}\) 是 \(n\) 阶单位根,\(n\) 阶单位根在复数域上会有 \(n\) 个,令这 \(n\) 个分别为 \(\omega _n^1,\omega_n^2 \cdots,\omega_n^n\),其中 \(\omega_n\) 为最小的 \(n\) 阶单位根。
在几何意义上,画一个单位圆,将这个圆分成 \(n\) 等份,其中每个 \(n\) 等分点就是一个 \(n\) 阶单位根。
给出一些公式:
FFT
将 \(n\) 个单位根作为 \(x\) 搞出 \(n\) 个点,\((\omega_n,f(\omega_n)),(\omega_n^2,f(\omega_n^2)),\cdots\),假设 \(n\) 是 \(2\) 的幂。
将 \(k\) 换成 \(k+\frac n 2\),\(f(\omega_n^{k+\frac n 2})=\sum\limits_{i=0} f_{2i} \omega_{\frac n 2}^{ki} - \omega_n^k\sum\limits_{i=0} f_{2i+1} \omega_{\frac n 2}^{ki}\)。
也就是说只要知道了 \(\sum\limits_{i=0} f_{2i} \omega_{\frac n 2}^{ki},\omega_n^k\sum\limits_{i=0} f_{2i+1} \omega_{\frac n 2}^{ki}\) 就可以求出 \(f(\omega_n^k),f(\omega_n^{k+\frac n 2})\)。
进一步转化,这样递归过程看的更清楚一点:\( \sum\limits_{i=0} f_{2i} (\omega_{\frac n 2}^k)^i + \omega_n^k\sum\limits_{i=0} f_{2i+1} (\omega_{\frac n 2}^k)^i\)。
将 \(f\) 重排,从 \(n=1\) 向上处理,时间复杂度就是 \(O(n \log n)\)。
NTT
发现原根和单位根之间的一些换算。详情见高级数论。剩下的就和 FFT
差不多。由于要除,所以朴素的只能处理模数为质数,至于任意模数的 NTT,蒟蒻还不会。
牛顿迭代
前置知识
泰勒展开
牛顿迭代
已知 \(f(x),函数 g\),求 \(f(x) ≡ g(h(x)) \mod x^n\)。

浙公网安备 33010602011771号