FFT学习笔记
fft.1
单位根的性质
\[1.w^{dk}_{dN}=w^k_N
\]
\[2.\frac{1}{\omega_k}=\omega_k^{-1}=e^{-\frac{2\pi i}{k}}=\cos\left(\frac{2\pi}{k}\right)+i\cdot \sin\left(-\frac{2\pi}{k}\right)
\]
递归求解 \(F[\) \(]\) = \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) .....这里指的是项数或者直接说是数组的下标
递归到最后一项就是值了 所以我们倍增求解
fft.2
1.复数怎么求
\[\omega_n^{2} = (\omega_n^{1})^2
\]
\[\omega_{2n}^{2k} = \omega_n^k
\]
\[\omega_{n}^{k+n/2} = -\omega_{n}^k
\]
->感性理解下 很容易去推
2. 原理解释
好的,我可以给您一个 FFT 的原理解释。😊(划去)
FFT 的原理是利用分治的思想,将一个复杂的离散傅里叶变换(DFT)问题分解为多个简单的子问题,从而降低时间复杂度。
具体来说,FFT 的步骤如下:
- 将一个 n 次多项式 f(x) 按照系数的奇偶性分为两部分,即\(f(x) = f_1(x^2) + x f_2(x^2)\),其中 \(f_1(x) 和 f_2(x)\)都是 n/2 次多项式。
- 将 n 次单位根 \(\omega_n\) 的 0 到 \(\frac {n}{2} - 1\) 次幂代入 f(x),得到 \(f(\omega_n^k) = f_1(\omega_n^{2k}) + \omega_n^k f_2(\omega_n^{2k}),其中 k = 0, 1, ..., n/2 - 1。\)
- 将 n 次单位根 \(\omega_n\) 的 \(\frac {n}{2}\) 到 n - 1 次幂代入 f(x),得到 \(f(\omega_n^{k + n/2}) = f_1(\omega_n^{2k}) - \omega_n^k f_2(\omega_n^{2k}),其中 k = 0, 1, ..., n/2 - 1。\)
- 重复上述步骤,直到 \(f_1(x) 和 f_2(x)\) 都是常数或者线性函数(人话:这玩意是个数了),此时可以直接计算它们的值。
- 根据上述步骤的结果,逐层合并得到 \(f(\omega_n^k)\) 的所有值,即 f(x) 的点值表示。
通过这种方法,可以将 DFT 的时间复杂度从 \(O(n^2)\) 降低到 \(O(n log_2 n)\),从而加速多项式乘法或者卷积等问题的求解。
ntt(待完善)
前置知识
- 原根
性质化定义: \(g在模 p 意义下的 0 \sim p-1 次幂各不相同,取遍 [0,p-1]\)
\(也就是说 ord_p(g)=\varphi(p) (p为质数) g 就可以说g是p的原根\)
for example
g mod p all set [1,p-1];
17 mod 3
3 -> 1,3,9,10,13,5,15,11,16,14,8,7,4,12,2,6
//正好包含上述[1,16]
形式化定义 :
\(a^x\equiv1(mod \; p)\) \(ord_n(a)[即x] = \varphi(n)\) a就为p的原根
特别的 我们把ntt的剩余系定义为\([1,p-1]\) ,为简化剩余系
2. 阶
形式化定义:
\(gcd(a,p) = 1\) \(x \in \Bbb N_+\)
\(a^x\equiv1(mod \; p)\) \(a即为p的阶\)
当\(\varphi (p) = p-1\) 由性质可知 其中间没有相同的数 呼应上面的原根
3. 如何求解
先把长度的扩充到\(2^n - [ \quad ]\) 为什么这么做捏 因为如果只在这个\(n\) 的长度去求解 不能保证全部的原根