迭代FFT

 1 int reverse(int x, int len){
 2     int t = 0;
 3     for (int i = 1; i < len; i <<= 1){
 4         t <<= 1;
 5         if (x & i) t |= 1;
 6     }
 7     return t;
 8 }
 9 
10 Complex A[200010];
11 void FFT(Complex *a, int n, int DFT){
12     for (int i = 0; i < n; ++i) A[reverse(i, n)] = a[i];
13     for (int i = 2; i <= n; i <<= 1){
14         Complex wn = Complex(cos(2 * pi / i), DFT * sin(2 * pi / i));
15         for (int j = 0; j < n; j += i){
16             Complex w = Complex(1, 0);
17             for (int k = 0; k < (i >> 1); ++k){
18                 Complex x = A[j + k];
19                 Complex y = w * A[j + k + (i >> 1)];
20                 A[j + k] = x + y;
21                 A[j + k + (i >> 1)] = x - y;
22                 w = w * wn;
23             }
24         }
25     }
26     if (DFT == -1) for (int i = 0; i < n; ++i) A[i] = A[i] / n;
27     for (int i = 0; i < n; ++i) a[i] = A[i];
28 }

 

转载于:https://www.cnblogs.com/tempestT/p/7663323.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值