Welcome to Hastie|

Hastieyua

园龄:6年1个月粉丝:68关注:3

FFT学习笔记

FFT学习笔记

因为已经有比我写的好的了,所以这里就不会重头讲,只讲一些自己需要用的而已。

YYC大佬写的

FFT解决什么呢?解决两个多项式快速相乘的问题。

我们设第一个多项式为F(x),第二个多项式为G(x).

多项式F(x)的项数为n ,多项式G(x)的项数为m.

乘出来的多项式为W(x).项数为(n+m1).

入门基本:初中一年级学历

DFT

过程:把系数表达转换为点值表达

相信大家都学过了待定系数法

把一个多项式转换为点值表达应该不难

显而易见,把一个n次多项式转换为点值表达,需要n+1个坐标。

我们把这些F(x)坐标记为:(x0,y0);(x1,y1);(x2,y2)

我们把这些G(x)坐标记为:(x0,y0);(x1,y1);(x2,y2)

那么W(x)坐标就为:(x0,y0y0);(x1,y1y1);(x2,y2y2)

那么我们的问题就在于如何将FG转换为点值表达。

求出FG的点值表达,就可以快速算出W的点值表达了。

复数

在学习DFT之前,还要先学学这个——复数

虚数

定义:i2=1

实数和虚数的组合就是复数,记为a+bi

PS:i2要化简为1

复数的 模长 指它的长度(到原点的距离),辐角 指它与原点的连线,与 x 轴(逆时针)的夹角。如图,复数2+3i 的模长和辐角都已标出(引用longlongzhu123的博客)

img

代码定义复数

结构体存储:一个存实数部,一个存虚数

struct Complex{
	double r,i;
	Complex():r(0),i(0){}						//初始化
	Complex(double R,double I) : r(R),i(I){}	//同r=R,i=I,给一个虚数赋值
	Complex(const Complex& c) : r(c.r),i(c.i){}	//等同r=c.r,i=c.i
};

复数运算

我们设两个复数x,y, x=a0+b0iy=a1+b1i . 一个实数k .

加法

x+y=(a0+b0i)+(a1+b1i)=(a0+a1)+(b0+b1)i

减法

xy=(a0+b0i)(a1+b1i)=(a0a1)+(b0b1)i

乘法

xk=(a0+b0i)k=a0k+b0ki

xy=(a0+b0i)(a1+b1i)=a0a1+a0b1i+a1b0ib0b1

xy=(a0a1b0b1)+(a0b1+a1b0)i

运算的几何意义(非重要)

(引用longlongzhu123的博客)

加法

例子:(2+3i)+(3+1i)=5+4i

img

意义:发现什么了吗?没有?看看那条虚线跟2+3i 有什么关系?没错。虚线与 2+3i平行。2+3i3+1i相加的结果可以看成在 3+1i 的端点处向上数3格,向右数 2 格得到的点。或者说是两个复数所组成平行四边形的一条对角线。(理解一下这句话)

乘法

复数乘法也有几何意义。一句话:模长相乘,辐角相加

img

代码实现运算

重载看不到不要紧,直接看return就ok了。(记住返回的也是复数,用结构体存)

inline Complex operator+(const Complex&a,const Complex&b){return Complex(a.r+b.r,a.i+b.i);}	//复数+
inline Complex operator-(const Complex&a,const Complex&b){return   Complex(a.r-b.r,a.i-b.i);} //复数-
inline Complex operator*(const Complex&a,const Complex&b){			//复数*
    return Complex(a.r*b.r - a.i*b.i , a.r*b.i + b.r*a.i );
}

单位根

单位圆:在复平面上一个模长1 ,长下面这个样子。

img

n次单位根:把单位圆平分成n份,取其中第一份(从x轴正半轴开始逆时针平分)

例子:3次单位根,长下面那样,B点即为3次单位根

img

我们把n次单位根记为:ωnωn1

那剩下的n1个点(指上面的AC点)怎么表示呢?

我们发现,B点是从x轴正半轴开始逆时针数的第一个点(A点是第0个,记作ωn0),所以它记作ωn1,那么C点是第二个点,它记作ωn2。同理,第k个点就叫ωnk,另外ωnk=(ωn)k

单位根的性质

(引用至command_block的blog)

单位根的世界,就是一个单位圆。

-1. $ \forall x:\omega_n0=1(n\omega_n0=1$)

0.ωnk=(ωn)k

1.ωnjωnk=ωnj+k

2.ω2n2k=ωnk

3.当n为偶数时,ωn(k+n/2)=ωnk

4.i=1nωni=0

5.ωn1=(cos(2πn),sin(2πn)) (注:左边为实数部,右边为虚数部)

6.ωnk=ωnk%n

F(ωnk)=Fl(ωn/2k)+ωnkFR(ωn/2k)

F(ωnk+n/2)=FL(ωn/2kωnkFR(ωn/2k))

本文作者:Hastieyua

本文链接:https://www.cnblogs.com/hyfhaha/p/10887243.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Hastieyua  阅读(556)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起