【目标】

  如何以 \(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. [原创]CentOS下Mysql的日志回滚

    一.    环境: a)        Centos-6.5-x64位操作系统. b)        安装mysql.命令:yum install mysql* 二.    配置 a)        ...

  2. 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 ...

  3. 冒泡排序的python代码实现

    li = [33, 2, 10, 1,564,880,8,99,51,3]# for i in range(len(li) - 1):#     current = li[i]#     next_v ...

  4. D. Powerful array

    D. Powerful array 题意 给定一个数列:a[i] (1<= i <= n) K[j]表示 在区间 [l,r]中j出现的次数.有t个查询,每个查询l,r,对区间内所有a[i] ...

  5. Idea中执行TestNg报错

    今天在Idea中使用TestNg过程中报错: java.lang.AbstractMethodError: org.testng.remote.RemoteTestNG$DelegatingTestR ...

  6. Java 9 揭秘(3. 创建你的第一个模块)

    文 by / 林本托 Tips 做一个终身学习的人. 在这个章节中,主要介绍以下内容: 如何编写模块化的Java程序 如何编译模块化程序 如何将模块的项目打包成模块化的JAR文件 如何运行模块化程序 ...

  7. 【WPF】用三角形网格构建三维图形

    虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image ...

  8. 一个web应用的诞生(13)--冲向云端

    有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所 ...

  9. APUE-文件和目录(四)文件系统

    一个命令 mkfs 讲文件系统前先介绍一个用于创建文件系统的命令: mkfs mkfs [options] [-t type fs-options] device [size] 描述 mkfs用来在设 ...

  10. ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解

    onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l  环境搭建 l  创建demo并 ...