🪴 あやめHex

Search

Search IconIcon to open search

高速フーリエ変換 (FFT)

Last updated Oct 25, 2022 Edit Source

# 説明

次の記事がわかりやすいです。

【競プロer向け】FFT を習得しよう! | 東京工業大学デジタル創作同好会traP

# 計算量

$O(N\log{N})$

# 実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <complex>
#include <vector>

using namespace std;
using ll = long long;
using ld = long double;
using Complex = complex<ld>;
const ld PI = 3.1415926535897932;

vector<Complex> FFT(vector<Complex> &A) {
  const int N = A.size();
  vector<Complex> even(N / 2), odd(N / 2);
  for (int i = 0; i < N / 2; i++) {
    even[i] = A[2 * i];
    odd[i] = A[2 * i + 1];
  }
  even = FFT(even);
  odd = FFT(odd);
  for (int i = 0; i < N / 2; i++) {
    odd[i] *= polar(1.0L, 2 * PI * i / N);
    A[i] = even[i] + odd[i];
    A[N / 2 + i] = even[i] - odd[i];
  }
  return A;
}

# 使用例