近来做一个大整数乘法的ACM题目时候一直被运行超时所困扰,上网搜索下后发现需要用到快速傅里叶变换和逆变换的算法来实现大整数乘法,才能把复杂度降到LogN * N.
看了一个星期的资料, 吃透了算法才把完整的代码敲出来^^。
代码里有三个主要的函数, 具体约束和说明见代码注释
FFT //计算区间内(左闭右开)的复数的离散傅里叶变换(按时间变换DIT-FFT)
IFFT //计算区间内(左闭右开)的复数的离散傅里叶逆变换(按时间变换DIT-IFFT)
RaderSort //对目标区间(左闭右开)元素进行倒位序排序,雷德算法
使用方法示例 1:
vector<complex<double>> I;
I.push_back(complex<double>(8, 0));
I.push_back(complex<double>(7, 0));
I.push_back(complex<double>(6, 0));
I.push_back(complex<double>(0, 0));
I.push_back(complex<double>(0, 0));
I.push_back(complex<double>(0, 0));
I.push_back(complex<double>(0, 0));
I.push_back(complex<double>(0, 0));
FFT(I.begin(), I.end()); //正向变换
IFFT(I.begin(), I.end()); //逆变换
使用方法示例 2:
<pre name="code" class="cpp">complex<double> K[8];
K[0] = complex<double>(8,0);
K[1] = complex<double>(7, 0);
K[2] = complex<double>(6, 0);
K[3] = complex<double>(0, 0);
K[4] = complex<double>(0, 0);
K[5] =