Radix-2 Recursive-FFT

本文深入探讨了Radix-2递归FFT算法,详细阐述了其工作原理和步骤,适用于高效计算复数序列的离散傅里叶变换。同时,该算法在多项式乘法中的应用也被提及,展示了FFT在数值计算领域的强大效能。
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxl = 300000 + 10;
const double PI = acos(-1.0);

int base, c[maxl];
complex<double> a[maxl], b[maxl], p[maxl];

int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
    while(ch >='0' && ch <='9') { x = x * 10 + ch - 48; ch = getchar(); }
    return x * f;
}

void FFT(complex<double> x[], int n, int type) {
    if(n == 1) return;

    complex<double> l[n >> 1], r[n >> 1];
    for(int i = 0; i < n; i += 2) {
        l[i >> 1] = x[i];
        r[i >> 1] = x[i + 1]; 
    }
    FFT(l, n >> 1, type); 
    FFT(r, n >> 1, type);
    complex<double> wn(cos(type * 2 * PI / n), sin(type * 2 * PI / n)), w(1, 0);

    for(int i = 0; i < (n >> 1); w *= wn, i++) {
        x[i] = l[i] + w * r[i];
        x[i + (n >> 1)] = l[i] - w * r[i];
    }
}
int n, m;
int main() {
#ifndef ONLINE_JUDGE
    freopen("data.txt", "r", stdin);
    freopen("ans.txt", "w", stdout);
#endif
    scanf("%d%d", &n, &m);
    for(int i=0; i<=n; i++) a[i] = read();
    for(int i=0; i<=m; i++) b[i] = read(); 

    for(int x = max(n, m) + 1, i = 1; i >> 2 < x; i <<= 1) base = i;
    //cout << base << endl;

    FFT(a, base, 1); FFT(b, base, 1);

    for(int i=0; i<base; i++) p[i] = a[i] * b[i];  FFT(p, base, -1);
    for(int i=0; i < n + m + 1; i++) c[i] = p[i].real() / base + 0.1;
    for(int i=0; i < n + m + 1; i++) printf("%d%c", c[i], i == n + m ? '\n' : ' ');

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值