【目标】

  如何以 \(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的更多相关文章

  1. 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

    现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...

  2. 快速傅里叶变换(FFT)学习笔记(未完待续)

    目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...

  3. 【清橙A1084】【FFT】快速傅里叶变换

    问题描述 离散傅立叶变换在信号处理中扮演者重要的角色.利用傅立叶变换,可以实现信号在时域和频域之间的转换. 对于一个给定的长度为n=2m (m为整数) 的复数序列X0, X1, …, Xn-1,离散傅 ...

  4. 快速傅里叶变换FFT

    多项式乘法 #include <cstdio> #include <cmath> #include <algorithm> #include <cstdlib ...

  5. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  6. [学习笔记] 多项式与快速傅里叶变换(FFT)基础

    引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积, 而代码量却非常小. 博主一年半前曾经因COGS的一 ...

  7. 快速傅里叶变换 & 快速数论变换

    快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...

  8. 「快速傅里叶变换(FFT)」学习笔记

    FFT即快速傅里叶变换,离散傅里叶变换及其逆变换的快速算法.在OI中用来优化多项式乘法. 本文主要目的是便于自己整理.复习 FFT的算法思路 已知两个多项式的系数表达式,要求其卷积的系数表达式. 先将 ...

  9. 快速傅里叶变换FFT& 数论变换NTT

    相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...

随机推荐

  1. R语言的高质量图形渲染库Cairo(转)

    前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...

  2. php curl_setopt的相关设置查询手册

    bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置, ...

  3. 快学scala

    scala 1.   scala的由来 scala是一门多范式的编程语言,一种类似java的编程语言[2] ,设计初衷是要集成面向对象编程和函数式编程的各种特性. java和c++的进化速度已经大不如 ...

  4. JavaScript设计模式_03_代理模式

    代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...

  5. java之内部类

    最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...

  6. 【源码分享】jquery+css实现侧边导航栏

    jquery+css实现侧边导航栏 最近做项目的时候,突然想用一个侧边导航栏,网上找了几个插件,有的太丑而且不太符合我的预期.与其修改别人的代码,不如自己来写一个了.废话不多说先上图,感兴趣的请继续看 ...

  7. python之路第一篇

    一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...

  8. Java - byte[] 和 String互相转换

    通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等. 除非觉得必要,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务 ...

  9. 移动办公OA系统

    好久没有更新文章了,总觉得心里空空的,最近由于工作的原因,没有来的及及时更新,总感觉应该把学习到的东西做个记录,供大家学习,也供自己复习,温故而知新.今天趁着周末休息时间,把自己最近在公司的做的项目做 ...

  10. Nignx入门location、root配置

    nginx的配置.首当其冲的就是location配置了,下面是笔记参考的博文链接 http://www.cnblogs.com/sunkeydev/p/5225051.html   location匹 ...