用fft计算大数乘法c语言,c++ - 在不使用递归的情况下将FFT应用于两个非常大的数字的乘法 - 堆栈内存溢出...

我最近学习了FFT算法。

我将其应用于遵循此伪代码的非常大自然数的快速乘法问题,

Let A be array of length m, w be primitive m-th root of unity.

Goal: produce DFT F(A): evaluation of A at 1, w, w^2,...,w^{m-1}.

FFT(A, m, w)

{

if (m==1) return vector (a_0)

else {

A_even = (a_0, a_2, ..., a_{m-2})

A_odd = (a_1, a_3, ..., a_{m-1})

F_even = FFT(A_even, m/2, w^2) //w^2 is a primitive m/2-th root of unity

F_odd = FFT(A_odd, m/2, w^2)

F = new vector of length m

x = 1

for (j=0; j < m/2; ++j) {

F[j] = F_even[j] + x*F_odd[j]

F[j+m/2] = F_even[j] - x*F_odd[j]

x = x * w

}

return F

}

它工作得很好,但是我发现了更好的代码,它无需递归即可完成相同的工作,并且运行速度也更快。

我试图弄清楚它是如何逐行工作的,但是,我失败了。

如果您能详细解释一下我的前两个for循环(不是数学部分),我将不胜感激。

下面是新代码

typedef complex base;

void fft(vector &a, bool invert)

{

int n = a.size();

for (int i = 1, j = 0; i < n; i++){

int bit = n >> 1;

for (; j >= bit; bit >>= 1) j -= bit;

j += bit;

if (i < j) swap(a[i], a[j]);

}

for (int len = 2; len <= n; len <<= 1){

double ang = 2 * M_PI / len * (invert ? -1 : 1);

base wlen(cos(ang), sin(ang));

for (int i = 0; i < n; i += len){

base w(1);

for (int j = 0; j < len / 2; j++){

base u = a[i + j], v = a[i + j + len / 2] * w;

a[i + j] = u + v;

a[i + j + len / 2] = u - v;

w *= wlen;

}

}

}

if (invert)

{

for (int i = 0; i < n; i++)

a[i] /= n;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值