用c++写一个fft算法
时间: 2024-04-29 10:21:38 浏览: 145
好的,以下是一个简单的 C++ 实现 FFT 的代码:
```cpp
#include <bits/stdc++.h>
using namespace std;
typedef complex<double> cpx;
const double PI = acos(-1);
void fft(vector<cpx>& a, bool invert) {
int n = a.size();
for (int i = 1, j = 0; i < n; i++) {
int bit = n >> 1;
for (; j & bit; bit >>= 1) j ^= bit;
j ^= bit;
if (i < j) swap(a[i], a[j]);
}
for (int len = 2; len <= n; len <<= 1) {
double ang = 2 * PI / len * (invert ? -1 : 1);
cpx wlen(cos(ang), sin(ang));
for (int i = 0; i < n; i += len) {
cpx w(1);
for (int j = 0; j < len / 2; j++) {
cpx u = a[i + j], v = a[i + j + len / 2] * w;
a[i + j] = u + v;
a[i + j + len / 2] = u - v;
w *= wlen;
}
}
}
if (invert) {
for (int i = 0; i < n; i++) a[i] /= n;
}
}
vector<int> multiply(vector<int>& a, vector<int>& b) {
vector<cpx> fa(a.begin(), a.end()), fb(b.begin(), b.end());
int n = 1;
while (n < a.size() + b.size()) n <<= 1;
fa.resize(n); fb.resize(n);
fft(fa, false); fft(fb, false);
for (int i = 0; i < n; i++) fa[i] *= fb[i];
fft(fa, true);
vector<int> res(n);
for (int i = 0; i < n; i++) res[i] = round(fa[i].real());
return res;
}
int main() {
vector<int> a = {1, 2, 3}, b = {4, 5, 6};
vector<int> c = multiply(a, b);
for (auto x : c) cout << x << " ";
cout << endl;
return 0;
}
```
这里给出的是基于分治思想的 Cooley-Tukey FFT 算法,可以实现 $O(n\log n)$ 的复杂度。其中 `fft()` 函数接受一个向量 `a` 和一个布尔值 `invert`,表示是否进行逆变换。在 `multiply()` 函数中,我们将两个多项式分别转化为向量并进行乘法运算,最后将结果转化回多项式形式。
阅读全文