fft qt 代码_FFT代码详解
關(guān)于FFT原理部分的介紹,在網(wǎng)上已經(jīng)有很多了,所以在此只講代碼實(shí)現(xiàn)部分的內(nèi)容。
推薦看完它的原理解釋再來看這里的代碼解釋
廢話不多說,上代碼(多項(xiàng)式乘法)
#include
#include
#include
#define N 4000001
using namespace std;
struct cp//手寫復(fù)數(shù)類可以卡常
{
double real,imag;
};
cp operator +(cp a,cp b)
{
return (cp){a.real+b.real,a.imag+b.imag};
}
cp operator -(cp a,cp b)
{
return (cp){a.real-b.real,a.imag-b.imag};
}
復(fù)數(shù)乘法:設(shè)$R_{a}$表示$a$的實(shí)部系數(shù),$I_{a}$表示$a$的虛部系數(shù)
則$a*b$
$=(R_{a}+I_{a})*(R_{b}+I_{b})$
$=R_{a}*R_{b}+R_{a}*I_{b}+R_{b}*I_{a}+I_{a}*I_{b}$
因?yàn)?i^2=-1$
所以結(jié)果的實(shí)部為$R_{a}*R_{b}-I_{a}*I_{b}$
虛部為$R_{a}*I_{b}+R_{b}*I_{a}$
cp operator *(cp a,cp b)
{
return (cp){a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real};
}
double pi=acos(-1.0);
int lim,rev[N],len;
cp w[N],inv[N],a[N],b[N];
void get_w()
{
for(int i=0;i<=lim;i++)
{
double angle=(double)i*2*pi/lim;
w[i].imag=sin(angle);
w[i].real=cos(angle);
inv[i]=(cp){w[i].real,-w[i].imag};
}
}
fft參數(shù)解釋
$arr:$系數(shù)數(shù)組,在$fft$后變?yōu)辄c(diǎn)值數(shù)組,$arr_{i}$表示將$w^i_n$帶入多項(xiàng)式后求得的值
$w:$預(yù)處理好的w單位根,在$fft$的時(shí)候正常帶入即可,在$idft$的時(shí)候帶入單位根的倒數(shù)(具體參見$idft$)void fft(cp *arr,cp *w)
{
for(int i=0;i
{
//處理每一個(gè)系數(shù)在分治過程中的實(shí)際位置;
//if是因?yàn)橹恍杞粨Q一次,所以選擇由小的一方來執(zhí)行
if(i
}
for(int i=2;i<=lim;i*=2)//枚舉區(qū)間長度
{
int l=i/2;
for(int j=0;j
{
//枚舉帶入的單位根w(k,l),k>=l的單位根也可以在這里一并求出
for(int k=0;k
{
意義變更
在這里$arr$的意義從系數(shù)變?yōu)?w^k_i$的點(diǎn)值,$a_{j,j+i-1}$分別表示將$w^{0,i-1}_i$的點(diǎn)值
下面的的t相當(dāng)于文首博客中的$w^k_n * A_2(w^k_{n \over 2})$
cp t=arr[j+k+l]*w[lim/i*k];//w(k,i)=w(k/i,1)=w(n*k/i,n)
arr[j+k+l]=arr[j+k]-t;
arr[j+k]=arr[j+k]+t;
}
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++) scanf("%lf",&a[i].real);
for(int i=0;i<=m;i++) scanf("%lf",&b[i].real);
lim=1;
while(lim<=n+m)len++,lim<<=1;//這樣會(huì)比用cmath的log要快?
for(int i=0;i>1]>>1)|((i&1)<
get_w();
fft(a,w);
fft(b,w);
for(int i=0;i<=lim;i++) a[i]=a[i]*b[i];
fft(a,inv);
for(int i=0;i<=n+m;i++) printf("%d ", (int)(a[i].real/lim+0.5));
//除以lim的原因具體參見idft,0.5是為了四舍五入
}
總結(jié)
以上是生活随笔為你收集整理的fft qt 代码_FFT代码详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 你对视网膜(Retina)
- 下一篇: 搭建安卓开发环境 GIT配色 term