日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fft qt 代码_FFT代码详解

發(fā)布時(shí)間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fft qt 代码_FFT代码详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。