Advertisement
leanchec

cp-algo_fft

May 28th, 2024
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. using cd = complex<double>;
  2. const double PI = acos(-1);
  3.  
  4. void fft(vector<cd> & a, bool invert) {
  5.     int n = a.size();
  6.  
  7.     for (int i = 1, j = 0; i < n; i++) {
  8.         int bit = n >> 1;
  9.         for (; j & bit; bit >>= 1)
  10.             j ^= bit;
  11.         j ^= bit;
  12.  
  13.         if (i < j)
  14.             swap(a[i], a[j]);
  15.     }
  16.  
  17.     for (int len = 2; len <= n; len <<= 1) {
  18.         double ang = 2 * PI / len * (invert ? -1 : 1);
  19.         cd wlen(cos(ang), sin(ang));
  20.         for (int i = 0; i < n; i += len) {
  21.             cd w(1);
  22.             for (int j = 0; j < len / 2; j++) {
  23.                 cd u = a[i+j], v = a[i+j+len/2] * w;
  24.                 a[i+j] = u + v;
  25.                 a[i+j+len/2] = u - v;
  26.                 w *= wlen;
  27.             }
  28.         }
  29.     }
  30.  
  31.     if (invert) {
  32.         for (cd & x : a)
  33.             x /= n;
  34.     }
  35. }
  36.  
  37. vector<int> multiply(vector<int> const& a, vector<int> const& b) {
  38.     vector<cd> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  39.     int n = 1;
  40.     while (n < a.size() + b.size())
  41.         n <<= 1;
  42.     fa.resize(n);
  43.     fb.resize(n);
  44.  
  45.     fft(fa, false);
  46.     fft(fb, false);
  47.     cout << "!!!" << '\n';
  48.     for (int i = 0; i < n; i++)
  49.         fa[i] *= fb[i];
  50.     fft(fa, true);
  51.  
  52.     vector<int> result(n);
  53.     for (int i = 0; i < n; i++)
  54.         result[i] = round(fa[i].real());
  55.     return result;
  56. }
  57.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement