多项式学习笔记

多项式乘法

前置知识

系数表示法

形如:\(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\) 阶单位根。

给出一些公式:

\[\omega_n^{2k}=\omega_{\frac n 2}^k,\omega_n^k=-\omega_n^{k+\frac n 2} \]

FFT

\(n\) 个单位根作为 \(x\) 搞出 \(n\) 个点,\((\omega_n,f(\omega_n)),(\omega_n^2,f(\omega_n^2)),\cdots\),假设 \(n\)\(2\) 的幂。

\[\begin{align*} f(\omega_n^k) & =\sum\limits_{i=0}^n f_i (\omega_n^k)^i=\sum\limits_{i=0}^n f_i \omega_n^{ik}\\ & =\sum\limits_{i=0} f_{2i} \omega_{n}^{2ki} + \sum\limits_{i=0} f_{2i+1} \omega_n^{2ki+k}\\ & =\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}\\ \end{align*} \]

\(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\)

posted @ 2022-12-24 08:53  starrylasky  阅读(21)  评论(0)    收藏  举报