[FFT] 快速傅里叶变换学习笔记

原文:https://blog.csdn.net/herano/article/details/71213373
-1、为什么学 FFT

退役(很早)之前听说 FFT 很神(e)奇(xin),Po姐来讲的时候也是膜(sha)了(ye)一(bu)发(dong),于是就放那里了。退役之后有(xian)了(de)时(mei)间(shi),并且在篮球赛之前立了赢一场的 flag 否则学FFT结果又双叒叕全输了,于是下面就是成果了……网上 FFT 讲解多得是不看也罢……

0、什么是 FFT?为什么 FFT?

0.1、为什么 FFT?

从一个简单问题说起:大整数乘法。在做 VijosP2000 的时候,看数据范围 O(n2)O(n2) 的 FFT 了。

0.2、什么是 FFT?

FFT(Fast Fourier Transform),全名快速傅里叶变换,这与傅里叶变换只有半毛钱的关系,傅里叶变换是分析波的成分的方法,通过推广傅里叶变换得到了优化的快速傅里叶变换,为了展示区别和联系,下面是傅里叶变换和傅里叶逆变换的公式:
傅里叶变换:

F(ω)=F[f(t)]=f(t)eiωtdtF(ω)=F[f(t)]=∫−∞∞f(t)e−iωtdt
的原像函数。具体问题请参考《高等数学》,博主还是高中生……(高中高等数学233333)
然后,我们终于可以开始讲 FFT 了……

1 、(初中知识)多项式

1.1、定义

我们把形如 a0+a1x+a2x2++an1xn1a0+a1x+a2x2+⋯+an−1xn−1 等类似形式表示。

1.2、多项式的两种表示法

1.2.1、系数表示法

我们知道,向量是个好东西(蛤?),矩阵也是个好东西(蛤?),于是我们把三者结合起来看(蛤玩意?)。
我们将 n1n−1

1.2.2、点值表示法

我们把多项式 A(x)A(x) 的点值表示。
到这里,是不是差不多忘了要干什么了……

1.3、多项式的运算

1.3.1、多项式求值

这个比较简单,拿题说。这是我还没出也不想出的一道题,拿出来娱乐一下……
题目描述 Description

都知道 FZ 酱数学不好,数学老师很着急,于是让她求个多项式的值。但是数学老师一不小心数据就出大了,他却并没有注意到这一点。老师共出了 TT 道题就崩溃了,请帮她尽快完成作业。

输入 Input

第一行一个整数 TT

输出 Output

对于每组数据,输出一行,为答案。

样例输入 Sample Input

2
2
3 2
100
3
1 2 3
-9

样例输出 Sample Output

203
226

样例解释 Explanation

对于第一个多项式为 A(x)=2x+3A(x)=2x+3

限制 Limits

对于 50%50% 位。

那么很好我们必须写高精度了……
212813.4×10382128−1≈3.4×1038

1.3.1.1、方法一:O(pn2)50ptsO(pn2)→50pts

暴力不会吗?
核心代码如下:
Algorithm1

1.3.1.2、方法二:O(p2nlog2n)[50,80]ptsO(p2nlog2⁡n)→[50,80]pts

这里挨个乘太慢了,快速幂处理会快一些。
(其实不一定会快多少)
核心代码如下:
Algorithm2

1.3.1.3、方法三:O(p2n)100ptsO(p2n)→100pts

学过必修三吗?
学过必修三还不会?
拿出数学必修三翻到 37 页你看到了什么?
秦九韶算法可以大量减少乘法和加法次数,并且把运算量简化为 O(n)O(n) 的。
核心代码如下:
Algorithm3_2
不过没上面的优雅不是吗……(呵呵)
回到正题上,我们要谈的其实是……

1.3.2、多项式的加法和乘法

1.3.2.1、多项式加法

没啥难度,直接加即可:

C(x)=A(x)+B(x)=i=0n1aixi+j=0n1bjxj=i=0n1(ai+bi)xi=i=0n1cixiC(x)=A(x)+B(x)=∑i=0n−1aixi+∑j=0n−1bjxj=∑i=0n−1(ai+bi)xi=∑i=0n−1cixi
完成。

1.3.2.2、多项式乘法

这就是个开括号的问题……
两个次数界为 na,nbna,nb 就可以知道了。

C(x)=i=02n2(j=0iajbij)xi=i=02n2cixiC(x)=∑i=02n−2(∑j=0iajbi−j)xi=∑

猜你喜欢

转载自blog.csdn.net/h_l_dou/article/details/84200121