快速傅里叶变换算法
考虑圆周卷积形如
$$c_r = \sum_{i,j}[(i+j)\ mod \ n = r]a_ib_j$$
其中
$$[(i+j) \ mod \ n = r] \\= [(i+j-r) \ mod \ n = 0] \\= \frac{1}{n} \sum_{k=0}^{n-1}{w^{(i+j-r)k}} \\= \frac{1}{n} \sum_{k=0}^{n-1}{w^{ik}w^{jk}w^{-rk}}$$
从而$$c_r = \sum_{i,j}{[(i+j-r) \ mod \ n = 0]a_ib_j} \\= \frac{1}{n}\sum_{k}{w^{-rk}}\sum_{i}{w^{ik}a_i}\sum_{j}{w^{jk}a_j} \\= \frac{1}{n}\sum_{k}w^{-rk}A_kB_k$$
记
$$A(x) = \sum_{k}{x^ka_k}$$
$O(x),E(x)$为$A(x)$ 奇项偶项之和
从而
$$A(w_{n}^m) = E((w_n^m)^2) + w_n^mO((w_n^m)^2) \\= E(w_{n/2}^m) + w_n^m O(w_{n/2}^m)$$
$$A(w_{n}^{m+n/2}) = E((w_n^m)^2) + w_n^{m+n/2}O((w_n^m)^2) \\= E(w_{n/2}^m) - w_n^m O(w_{n/2}^m)$$
$$T(n) = 2T(n/2)+O(n)$$ $$T(n) = O(nlogn)$$
对于任意一较大质数,总存在一原根 $g$ 使得 $g^t mod \ p = 1, t<p$ 当且仅当 $t = p - 1$ 时成立.
其中 $t$ 从 $1$ 取到 $p-1$ 时恰好可以覆盖到所有的 $1$ ~ $p-1$,这样 $g$ 可以起到模 $p$ 下相当于向量的作用
当 $p$ 取 $2^tx+1, t>\lceil log_2n \rceil$ 时可以取 $$g^{\frac{P-1}{2^d}}$$ 作为第 $d$ 次的单位根。
最后进而实现模意义下的数论变换,无精度误差。
考虑将多项式拆分
记 $M = [\sqrt{p}]$
$$A(x) = A_1(x)M + A_2(x)$$
$$B(x) = B_1(x)M + B_2(x)$$
$$A \times B= A_1 \times B_1 \cdot M^2 + (A_1 \times B_2 + A_2 \times B_1)M + A_2 \times B_2$$
对于 $n$ 阶多项式 $P_1(x)$ 和 $P_2(x)$ 在取余 $m$ 的剩余系下,DFT中系数数值在 $m^{0.25}$ 到 $m^{0.75}$ 之间,这样
显然有中间数值在 $n*m^{1.5}$ 的范围内,同时我们显然可以将两个多项式映射到一个复数系数的多项式
,这样参照long double精度,实现了将 $10^6$ 阶的多项式在取余任意小于等于INT_MAX的任意模数下
的结果$O(nlogn)$ 算出。
记
$$P(x) = A(x) + B(x)i$$
$$Q(x) = A(x) - B(x)i$$
这样
$$p_r = \sum_{k}{w_n^{kr}(A_k + B_ki)} \\=\sum_{k}{(A_k+B_ki)[cos(\pi/d) + sin(\pi/d)i]} \\= A cosw+Asinwi+Bcoswi-Bsinw \\= conj[Acos(-w)+Asin(-w)i+Bcos(-w)i-Bsin(-w)] \\= conj[\sum_{k}{(A_k-B_ki)(cos(\pi/d)+sin(\pi/d))}] \\= conj[q_{n-r}]$$
$$a_r = \frac{p_r+conj[p_{n-r}]}{2}$$$$b_r = \frac{p_r-conj[p_{n-r}]}{2}$$
$$
(a\cdot b\% m)\% 2^{64} \\ = (a\cdot b - \lfloor\frac{a\cdot b}{m}\rfloor\cdot m) \% 2^{64} \
\\ = ((a\cdot b)\%2^{64} - (\lfloor\frac{a\cdot b}{m}\rfloor\cdot m)\%2^{64}) \% 2^{64}
$$