[FFT] 快速傅里叶变换学习笔记
来源:互联网 发布:js数据类型转换 编辑:程序博客网 时间:2024/06/06 03:47
-1、为什么学FFT
退役(很早)之前听说FFT很神(e)奇(xin),Po姐来讲的时候也是膜(sha)了(ye)一(bu)发(dong),于是就放那里了。退役之后有(xian)了(de)时(mei)间(shi),并且在篮球赛之前立了赢一场的flag否则学FFT结果又双叒叕全输了,于是下面就是成果了……网上FFT讲解多得是不看也罢……
0、什么是FFT?为什么FFT?
0.1、为什么FFT?
从一个简单问题说起:大整数乘法。在做VijosP2000的时候,看数据范围
0.2、什么是FFT?
FFT(Fast Fourier Transform),全名快速傅里叶变换,这与傅里叶变换只有半毛钱的关系,傅里叶变换是分析波的成分的方法,通过推广傅里叶变换得到了优化的快速傅里叶变换,为了展示区别和联系,下面是傅里叶变换和傅里叶逆变换的公式:
傅里叶变换:
傅里叶逆变换:
其中
然后,我们终于可以开始讲FFT了……
1 、(初中知识)多项式
1.1、定义
我们把形如
以上内容均为初二(我记得是)的内容,不明白的自觉面壁思过(初中数学老师:这个定义抄10遍给我)……
下面就是没学过的了:
为方便表示,我们记多项式
我们规定:严格大于
哦,行……
下面无特殊说明,多项式均用
1.2、多项式的两种表示法
1.2.1、系数表示法
我们知道,向量是个好东西(蛤?),矩阵也是个好东西(蛤?),于是我们把三者结合起来看(蛤玩意?)。
我们将
在选修4-2中,我们知道向量与矩阵有着密切联系,这就是为什么我们把多项式,向量和矩阵联系起来。(然而我们并没选4-2蛤蛤蛤)
于是这个
1.2.2、点值表示法
我们把多项式
到这里,是不是差不多忘了要干什么了……
1.3、多项式的运算
1.3.1、多项式求值
这个比较简单,拿题说。这是我还没出也不想出的一道题,拿出来娱乐一下……
题目描述 Description
都知道FZ酱数学不好,数学老师很着急,于是让她求个多项式的值。但是数学老师一不小心数据就出大了却并没有注意到这一点。老师共出了
T 道题,FZ酱拿到了这T 道题就崩溃了,请帮她尽快完成作业。
输入 Input
第一行一个整数
T ,表示数据组数。
对于每组数据:
第一行有一个数n 表示这个多项式的次数界;
第二行有n 个整数a0,a1,⋯ ,an−1 ,表示多项式∑i=0n−1aixi ;
第三行,为未知数的值x 。
输出 Output
对于每组数据,输出一行,为答案。
样例输入 Sample Input
2
2
3 2
100
3
1 2 3
-9
样例输出 Sample Output
203
226
样例解释 Explanation
对于第一个多项式为
A(x)=2x+3 ,代入后得A(100)=2×100+3=203 ;
对于第二个多项式为A(x)=3x2+2x+1 ,代入后得A(−9)=226 。
限制 Limits
对于
50% 的数据,答案在[0,2128−1] 范围内;
对于100% 的数据,T≤2 ,n≤105 ,保证输入均为绝对值不大于231−1 的整数并且答案小于3∗106 位。
那么很好我们必须写高精度了……
记数字长度为
1.3.1.1、方法一:O(pn2) ——>50pts
暴力不会吗?
核心代码如下:
1.3.1.2、方法二:O(p2nlog2n) ——>[50,80]pts
这里挨个乘太慢了,快速幂处理会快一些。
(其实不一定会快多少)
核心代码如下:
1.3.1.3、方法三:O(p2n) ——>100pts
学过必修三吗?
学过必修三还不会?
拿出数学必修三翻到37页你看到了什么?
秦九韶算法可以大量减少乘法和加法次数,并且把运算量简化为
核心代码如下:
当然,还可以处理前缀积,也是
核心代码如下:
不过没上面的优雅不是吗……(呵呵)
回到正题上,我们要谈的其实是……
1.3.2、多项式的加法和乘法
1.3.2.1、多项式加法
没啥难度,直接加即可:
这个操作可以
1.3.2.2、多项式乘法
这就是个开括号的问题……
两个次数界为
我们把不足的次数用系数
考虑怎样的两项乘完后,结果的幂指数为同一个。即
那么乘完之后,
我们把中间的那个加法,即
这样,朴素算法时间复杂度为
但是点值表达式的表示就很好了,直接乘起来就好了嘛!即:
设
1.4、插值-点值转换
就要接近重点了同志们加油!
先定义两个运算:
1、定义一种运算,可以将系数表示转化为点值表示,记为
2、定义其逆运算,即从一个多项式的点值表示确定其系数表示为插值。记为
第一个运算在
答案是肯定的。我们把这些点代入,可以得出一个当然可以拿矩阵证明网上多得是。
那么就很尴尬,
所以我们还需要一些姿势。
2、(高中知识)复数
一些奇奇怪怪的问题无法解决,可以把它从实数域扩展到复数域上解决,加入了复数这种类似向量的东西,问题就会变得简单。
噫,向量?点值表示不就是个向量吗!
2.1、定义
一堆定义就不说了,选修2-2内容,这里简单的强调一些运算:
设
设
这是学过的,下面就说说没学过的。
2.2、单位根
根?方程的根?什么方程的根?
定义:
当我们把问题引入复数域,
2.3、欧拉公式
一个很6的公式。内容是:
式子很简单,证明如下:
由Taylor展开:
将Taylor展开推广到复数域上,有复数运算
证毕。
将
将
我们不是要解
那么
下面就是一些数论问题了……
记
这不一样吗……
所以可以证明
于是记这些根为
问题得证。
2.4、三个引理
2.4.1、消去引理
内容:当
证明:
很简单……
2.4.2、折半引理
内容:如果
证明:
还行吧……可以看出,
更一般的结论:
2.4.3、求和引理
内容:对于
证明:
注意:
现在全都就绪了,终于要到目标了……
3、离散傅里叶变换(DFT)
DFT,即Discrete Fourier Transform,离散傅里叶变换,就是我们之前定义的那个,现在有了复数,我们就可以在
我们将多项式按照指数的奇偶分类,记原多项式为
通过观察可知,
那么,对于
这样,由奇偶性使得需要代入的值范围减半,递归做下去就行了,时间复杂度为:
因为永远是奇偶合并,如果想要更方便地合并必然
4、逆离散傅里叶变换(IDFT)
IDFT,即Inverse Discrete Fourier Transform,逆离散傅里叶变换,还是我们之前定义的那个。我们在
我们说过,IDFT相当于解个
这同时也是做DFT时我们乘的矩阵。只不过这次
记上面的系数矩阵为
记此矩阵为
\begin{equation}\begin{aligned}E_{ij}&=\sum\limits_{k=0}^{n-1}D_{ik}W_{kj}\\&=\sum\limits_{k=0}^{n-1}\omega_n^{-ik}\omega_n^{kj}\\&=\sum\limits_{k=0}^{n-1}\omega_n^{k(j-i)}\end{aligned}\end{equation}
当i=j
\begin{equation}\begin{aligned}E_{ij}&=\sum\limits_{k=0}^{n-1}\omega_n^{k(j-i)}\\&=\sum\limits_{k=0}^{n-1}\omega_n^0=n\\\end{aligned}\end{equation}
当i\not =j
\begin{equation}\begin{aligned}E_{ij}&=\sum\limits_{k=0}^{n-1}\omega_n^{k(j-i)}\\&=\sum\limits_{k=0}^{n-1}(\omega_n^{j-i})^k=0\\\end{aligned}\end{equation}
记单位矩阵为I
将由方程组推得那个矩阵左乘
这和DFT的操作很像,所以用DFT的过程实现IDFT即可。
负号?把
至此,所有的时间都是
5、实现问题
说是一回事,写是另一回事。
奇偶分组这个玩意就很坑,容易发现,设
不过FFT本身常数巨大,主要因为double类型的计算时间,所以常数问题一定要注意。
我们看到,DFT做完后,得到的是将
由于FFT涉及复数和除法,容易出现精度问题,所以考虑一种整数在模的前提下的FFT,就出现了FNT,也叫NTT,即快速数论变换(Fast Number-theory Transform或Number Theory Transform)。这里有学习笔记……
如果我们计算卷积的时候FFT真是大毒瘤……
FFT和FWT都在图像处理,音频处理方面有较大应用。
FFT的板子在这里,以HDOJ1402为例……Code
VijosP2000那道题除了写FFT还得压位……或者用一种神奇的
终于把我的flag填完了我好开心啊!!!
- [FFT] 快速傅里叶变换学习笔记
- FFT,快速傅里叶变换学习笔记
- [学习笔记]快速傅里叶变换 FFT
- FFT(快速傅里叶变换)算法学习笔记
- 快速傅里叶变换 FFT 学习小记
- FFT—快速傅里叶变换学习小记
- 快速傅里叶变换(FFT)(ZZ)
- FFT快速傅里叶变换;
- 快速傅里叶变换(FFT)
- 关于FFT快速傅里叶变换
- FFT快速傅里叶变换
- FFT - 快速傅里叶变换
- 快速傅里叶变换(FFT)
- 快速傅里叶变换(FFT)
- GSL快速傅里叶变换FFT
- 快速傅里叶变换FFT
- 【数学】快速傅里叶变换(FFT)
- FFT 快速傅里叶变换 初探
- 树与二叉树的转换、树的遍历
- SQLiteDatabase填充spinner(populating spinner from SQLiteDatabase)
- jsp中自定义标签的学习
- 【C#】wpf中的xmlns命名空间为什么是一个网址,代表了什么意思
- 1064. 朋友数
- [FFT] 快速傅里叶变换学习笔记
- NOIP2013 Day1
- Nginx配置反向代理安装和配置-初探
- 【数据结构-堆排序】堆排序 Heap Sort
- android SQLite数据的使用
- videoView播放视频,简易视频播放器自己写
- 关于支付宝sdk出现Fatal error问题解决办法
- ionic2框架 图片选择与上传(支持ios,android)
- 链表算法之环形链表插值