Advertisement
radoslav11

Basic FFT

May 24th, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3.  
  4. #define int long long
  5. #define double long double
  6.  
  7. using namespace std;
  8. const int MAXN = (1 << 20);
  9. const double PI = acos(-1);
  10.  
  11. typedef vector<complex<double>> polynomial;
  12.  
  13. void print_poly(polynomial poly)
  14. {  
  15.     bool f = false;
  16.     for(int i = poly.size() - 1; i >= 0; i--)
  17.         if(f || (int)(poly[i].real() + 0.5) != 0)
  18.         {
  19.             cout << (int)(poly[i].real() + 0.5) << " ";
  20.             f = true;
  21.         }
  22.  
  23.     if(!f) cout << 0;
  24.     //cout << endl;
  25. }
  26.  
  27. void print_poly(vector<int> poly)
  28. {  
  29.     bool f = false;
  30.     for(int i = poly.size() - 1; i >= 0; i--)
  31.         if(f || poly[i] != 0)
  32.         {
  33.             cout << poly[i] << " ";
  34.             f = true;
  35.         }
  36.  
  37.     if(!f) cout << 0;
  38.     //cout << endl;
  39. }
  40.  
  41. void fft(polynomial &a)
  42. {
  43.     int n = a.size();
  44.     if(n == 1) return;
  45.    
  46.     polynomial a0(n / 2), a1(n / 2);
  47.     for(int i = 0; i < n / 2; i++)
  48.     {
  49.         a0[i] = a[2 * i];
  50.         a1[i] = a[2 * i + 1];
  51.     }
  52.  
  53.     fft(a0);
  54.     fft(a1);
  55.  
  56.     double ang = 2.0 * PI / n;
  57.     complex<double> w(1), wn(cos(ang), sin(ang));
  58.  
  59.     for(int i = 0; i < n / 2; i++)
  60.     {
  61.         a[i] = a0[i] + w * a1[i];
  62.         a[i + n / 2] = a0[i] - w * a1[i];
  63.         w *= wn;
  64.     }
  65. }
  66.  
  67. void inv_fft(polynomial &a)
  68. {
  69.     int n = a.size();
  70.     if(n == 1) return;
  71.  
  72.     polynomial a0(n / 2), a1(n / 2);
  73.     for(int i = 0; i < n / 2; i++)
  74.     {
  75.         a0[i] = a[2 * i];
  76.         a1[i] = a[2 * i + 1];
  77.     }
  78.  
  79.     inv_fft(a0);
  80.     inv_fft(a1);
  81.  
  82.     double ang = -2.0 * PI / n;
  83.     complex<double> w(1), wn(cos(ang), sin(ang));
  84.  
  85.     for(int i = 0; i < n / 2; i++)
  86.     {
  87.         a[i] = a0[i] + w * a1[i];
  88.         a[i + n / 2] = a0[i] - w * a1[i];
  89.         a[i] /= 2;
  90.         a[i + n / 2] /= 2;
  91.         w *= wn;
  92.     }
  93. }
  94.  
  95. polynomial multiply(vector<int> _a, vector<int> _b)
  96. {
  97.     polynomial ret, a(_a.begin(), _a.end()), b(_b.begin(), _b.end());
  98.  
  99.     int sz = 1;
  100.     while(sz < max(a.size(), b.size()))
  101.         sz <<= 1;
  102.     sz <<= 1;
  103.  
  104.     a.resize(sz);
  105.     b.resize(sz);
  106.     ret.resize(sz);
  107.    
  108.     fft(a);
  109.     fft(b);
  110.     for(int i = 0; i < sz; i++)
  111.         ret[i] = a[i] * b[i];
  112.  
  113.     inv_fft(ret);
  114.     return ret;
  115. }
  116.  
  117. vector<int> rebase(polynomial poly, int base)
  118. {
  119.     vector<int> ret;
  120.     ret.resize(poly.size());
  121.  
  122.     int carry = 0;
  123.     for(int i = 0; i < poly.size(); i++)
  124.     {
  125.         ret[i] = ((int)(poly[i].real() + 0.5) + carry) % base; 
  126.         carry = ((int)(poly[i].real() + 0.5) + carry) / base;
  127.     }
  128.  
  129.     while(carry) ret.push_back(carry % 10), carry = carry / 10;
  130.     return ret;
  131. }
  132.  
  133. bool is_digit(char c)
  134. {
  135.     return c >= '0' && c <= '9';
  136. }
  137.  
  138. polynomial from_string(string s)
  139. {
  140.     polynomial ret;
  141.     ret.clear();
  142.     for(int i = s.size() - 1; i >= 0; i--)
  143.         if(is_digit(s[i])) ret.push_back(s[i] - '0');
  144.  
  145.     return ret;
  146. }
  147.  
  148. void read()
  149. {
  150.  
  151. }
  152.  
  153. void solve()
  154. {
  155.  
  156. }
  157.  
  158. #undef int
  159. int main()
  160. {
  161.     ios_base::sync_with_stdio(false);
  162.     cin.tie(NULL);
  163.  
  164.     while(true)
  165.     {
  166.         read();
  167.         solve();
  168.         cout << flush;
  169.     }  
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement