如何用快速傅里叶变换实现DFT
【目标】
如何以 \(O(N \log N)\) 的效率将系数多项式转换为点值多项式。
【前置技能】
众所周知,\(x^n=1\)的根有n个,而且它们分别是\(e^{\frac{2*π*i}{n}}\),即在复平面内的坐标为\((cos(2*π*i),sin(2*π*i))\)。
为了方便描述,我们分别用\(ω_n^0\)~\(ω_n^{n-1}\)来描述这n个根。而且等会我们要算的,就是多项式A在这n个点处的点值。
我们由复数的性质可以得到一些公式:
\((ω_{2n}^{2k})=ω_n^k\)
\((ω_n^k)^2=ω_n^{2k}=ω_{n/2}^{k}\)
\(ω_n^{k+\frac{n}{2}}=-ω_n^k\)
【递归计算点值】
假设我们有一个长度为n的多项式\(A(x)=a_0+a_1*x...a_{n-1}*x^{n-1}\),现在我们设一个过程F(A)来递归地计算\(A(x)\)的点值多项式(而且点值的自变量就是上述n个单位复数根)。为了方便计算,我们设n为2的幂次。
简单地把\(A(x)\)拆分成两个多项式,即设:
\(A_0(x)=a_0+a_2*x+a_4*x^2...+a_{n/2-2}*x^{\frac{n}{2}-1}\)
\(A_1(x)=a_1+a_3*x+a_5*x^2...+a_{n/2-1}*x^{\frac{n}{2}-1}\)
容易发现\(A(x)=A0(x^2)+x*A1(x^2)\)
我们要求的是对于所有k,\(ω_n^k\) 处的点值。
且\(A(ω_n^k)=A_0((ω_n^k)^2)+ω_n^k*A_1((ω_n^k)^2)\)
先求所有的k满足\(k∈[0,n/2)\)
化简易得\(A(ω_n^k)=A_0(ω_{\frac{n}{2}}^k)+ω_n^k*A_1(ω_{\frac{n}{2}}^k)\)
而且对于\(k∈[0,n/2)\),我们也可以得到
\(A(ω_n^{k+\frac{n}{2}})=A_0(ω_n^{2k+n})+ω_n^{k+\frac{n}{2}}*A_1(ω_n^{2k+n})\)
\(=A_0(ω_n^{2k})-ω_n^{k}*A_1(ω_n^{2k})=A_0(ω_{\frac{n}{2}}^k)-ω_n^{k}*A_1(ω_{\frac{n}{2}}^k)\)
此时我们已经能求出所有的点值了,而且我们要用到的条件就是:
\(A_0(ω_{\frac{n}{2}}^k)\) 和 \(A_1(ω_{\frac{n}{2}}^k)\) \(k∈[0,n/2)\)
容易发现这就是子问题,我们只需直接递归 \(F(A_0)\) 和 \(F(A_1)\) 即可。
由主定理,得效率为\(T(N)=O(N)+2*T(\frac{n}{2})=O(N \log N)\)
如何用快速傅里叶变换实现DFT的更多相关文章
- 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w
现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...
- 快速傅里叶变换(FFT)学习笔记(未完待续)
目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...
- 【清橙A1084】【FFT】快速傅里叶变换
问题描述 离散傅立叶变换在信号处理中扮演者重要的角色.利用傅立叶变换,可以实现信号在时域和频域之间的转换. 对于一个给定的长度为n=2m (m为整数) 的复数序列X0, X1, …, Xn-1,离散傅 ...
- 快速傅里叶变换FFT
多项式乘法 #include <cstdio> #include <cmath> #include <algorithm> #include <cstdlib ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- [学习笔记] 多项式与快速傅里叶变换(FFT)基础
引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积, 而代码量却非常小. 博主一年半前曾经因COGS的一 ...
- 快速傅里叶变换 & 快速数论变换
快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...
- 「快速傅里叶变换(FFT)」学习笔记
FFT即快速傅里叶变换,离散傅里叶变换及其逆变换的快速算法.在OI中用来优化多项式乘法. 本文主要目的是便于自己整理.复习 FFT的算法思路 已知两个多项式的系数表达式,要求其卷积的系数表达式. 先将 ...
- 快速傅里叶变换FFT& 数论变换NTT
相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...
随机推荐
- [原创]CentOS下Mysql的日志回滚
一. 环境: a) Centos-6.5-x64位操作系统. b) 安装mysql.命令:yum install mysql* 二. 配置 a) ...
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException at java.sql.Date.getHours(Unknown Source)
数据库字段类型为Date,转成JSON格式会有问题,解决方案如下: json-lib有一个配置类JsonConfig通过JsonConfig可以注册一个字段处理器实现JsonValueProcesso ...
- 冒泡排序的python代码实现
li = [33, 2, 10, 1,564,880,8,99,51,3]# for i in range(len(li) - 1):# current = li[i]# next_v ...
- D. Powerful array
D. Powerful array 题意 给定一个数列:a[i] (1<= i <= n) K[j]表示 在区间 [l,r]中j出现的次数.有t个查询,每个查询l,r,对区间内所有a[i] ...
- Idea中执行TestNg报错
今天在Idea中使用TestNg过程中报错: java.lang.AbstractMethodError: org.testng.remote.RemoteTestNG$DelegatingTestR ...
- Java 9 揭秘(3. 创建你的第一个模块)
文 by / 林本托 Tips 做一个终身学习的人. 在这个章节中,主要介绍以下内容: 如何编写模块化的Java程序 如何编译模块化程序 如何将模块的项目打包成模块化的JAR文件 如何运行模块化程序 ...
- 【WPF】用三角形网格构建三维图形
虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image ...
- 一个web应用的诞生(13)--冲向云端
有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所 ...
- APUE-文件和目录(四)文件系统
一个命令 mkfs 讲文件系统前先介绍一个用于创建文件系统的命令: mkfs mkfs [options] [-t type fs-options] device [size] 描述 mkfs用来在设 ...
- ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解
onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l 环境搭建 l 创建demo并 ...