OI 中的 FFT
不行啊最近备考简直变成文化狗了= =。。我还脑洞大开想学俄语什么心态。。
简单地说一下FFT(来,跟我一起念,法〰法〜塔,法斯特~福铝页~圈死佛而母)。。
FFT本来是做信号变换用的,当然OI和信号变换搭不上边.但是大家都知道,FFT可以快速求卷积.这可以说是由复数的性质决定的.
FFT是什么
FFT,是DFT的一种实现.它可以在$\Theta \left( n\log_2{n}\right)$(其中n为输入规模)时间内完成DFT.
也就是说,FFT是DFT的一种具体实现.因此,与其问FFT是什么,更不如问DFT是什么.
DFT:Discrete Fourier Transform即离散傅里叶变换.由于计算机并不能真正处理连续数据,因此我们所说的傅里叶变换仅限于DFT.
具体的,计算机和人类都不可能完全识别连续数据,设这个连续数据是一个函数$\mathtt{F} ( t) \mathtt{ \ } ( t \in \mathbb{R}^+)$,我们只能选择一些点$t_n \mathtt{ \ } ( t_n \in \mathbb{R}^+, n \in \mathbb{Z}^+, t_{n - 1} < t_n)$,令$f_n = \mathtt{F} ( t_n)$,这个过程称为采样,这些$t_n$被称为采样点.一般我们规定只能取有限个采样点并且每个采样点间距相同,即$t_n = t_{n - 1} + b \mathtt{ \ } \left( \mathtt{const } b = \frac{1}{\max n}, n \in \mathbb{Z}^+ \right)$,此时既然采样点间距相同,采样点的数据也是成序列的.不妨设这个序列为$\mathtt{S}_{\mathtt{F}}$.
傅里叶变换其实是由一个定义在F上的积分\[ \widehat{\mathtt{F}} (\xi) = \int_{- \infty}^{\infty} \mathtt{F} (x) e^{- 2 \pi i x \xi} \text{dx} \]定义的.这是连续傅立叶变换,自然的,我们可以很轻松地写出离散傅里叶变换\[ \widehat{\mathtt{S}_{\mathtt{F}}} [ k] = \sum_{n = 0}^{N - 1} \mathtt{S}_{\mathtt{F}} [ n] e^{\frac{- 2 \pi i n k}{N}} \left( \mathrm{for easier input,lets define N as }\max n \right) \]基本就是把积分换成求和而已.
附加题×1: 已知傅立叶变换的逆变换是\[ \mathtt{F} (x) = \int_{0}^{\infty} \hat{\mathtt{F}} (\xi) e^{2 \pi i \xi x} \hspace{0.25em} d \xi \]写出它的离散形式.
FFT适用性
很自然地,我们想到一个问题: FFT,既然是`快速`算法,它怎么做?
具体的,对于任何一个输入长度为N的序列,我们可以理论上精确地在$\Theta ( n \log_2 n)$的时间内完成FFT.但是由于混合基FFT过于复杂,我们这里只讨论$N=2^a \left( a\in \mathbb{R}\right)$的情况,即序列长度为2的幂时的情况.
DFT与卷积的关系
(按照算导的写法,姑且将$\omega_n$理解为wiki里的$\omega_n$共轭,做刚好相对称的FFT.)
暂且设$\omega_n = e^{2 \pi i / n}$.注意到我们这里出现了复数次幂,这是什么意思呢?
\[e^{iu}=\cos{u}+i \sin{u}\]
因此,如果将每一个复数投射到复平面上,这些点顺时针形成一个圈.

我们的B点,称为我们的主n次单位根.其它点则都是它的幂.
我们求FFT,相当于对一个多项式在这一圈的所有复数上进行求值,因为\[ \widehat{\mathtt{S}_{\mathtt{F}}} [ k] = \sum_{n = 0}^{N - 1}
\mathtt{S}_{\mathtt{F}} [ n] \omega_N^{nk} \]
- 概念
-- 复数的模
复数$x$的模,记作$| x |$.
\[ | x | = \sqrt{| \Im ( x)^2 | + \Re ( x)^2} \]
\[ | e^{ia+b} | = e^b , b\in \mathbb{R} \]
-- 复数乘法
两个复数$a+bi$与$c+di$的积$( a + b i) \cdot ( c + d i) = ( a c - b d) + ( b c + a d) i$
积的模等于原两复数模之积,积的幅角等于原两复数幅角之和.
- 引理
-- 消去引理
$\omega^{kn}_{dn}=\omega^{k}_{d}$
\[\begin{eqnarray*}
| \omega^d_k | = 1 & & \mathtt{(1)}\\
\arg \omega_k = 2 \pi / k & & \mathtt{(2)}\\
& \Downarrow & \\
\arg \omega^{nd}_{nk} = n \arg \omega^d_{nk} = \arg \omega_k^d & &
\mathtt{(res)}
\end{eqnarray*}\]
-- 折半引理
对于n>0且!(n|1),$| \{ \omega^k_n \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} | = 2 |
\{ w_n^{2 k} \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} |$,$\{ w_n^{2 k} \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} = \{ w_{n /
2}^k \mid 0 \leqslant k \leqslant n / 2, k \in \mathbb{Z} \}$.
证明很简单,留作思考题.
- FFT
OI 中的 FFT的更多相关文章
- OI中的快速傅里叶变换(FFT)
快速傅里叶变换(FFT) ---- LLpp ...
- 浅谈分治算法在OI中的应用
分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述] 为了奖励牛牛同学帮妈妈解决了大写中 ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- OI中常犯的傻逼错误总结
OI中常犯的傻逼错误总结 问题 解决方案 文件名出错,包括文件夹,程序文件名,输入输出文件名 复制pdf的名字 没有去掉调试信息 调试时在后面加个显眼的标记 数组开小,超过定义大小,maxn/ ...
- GCC&&GDB在OI中的介绍
序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...
- OI中的莫比乌斯反演
OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...
- 浅谈OI中的提交答案
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
- OI中组合数的若干求法与CRT
OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...
- OI中字符串读入和处理
OI中字符串读入和处理 在NOIP的"大模拟"题中,往往要对字符串进行读入并处理,这些字符串有可能包含空格并以\n作为分割,传统的cin >> scanf() 等等,不 ...
随机推荐
- DOM(十)使用DOM设置单选按钮、复选框、下拉菜单
1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...
- AngularJs-指令和控制器交互
前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...
- JS BOM知识整理
BOM部分主要是针对浏览器的内容,其中常用的就是window对象和location, window是全局对象很多关于浏览器的脚本设置都是通过它. location则是与地址栏内容相关,比如想要跳转到某 ...
- reboot-css
dd, label { margin-bottom: .5rem; }abbr[title] { text-decoration: none; }abbr[title] { border-bottom ...
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 G ...
- Java 工程师的学习线路图。
今天了一个超级好用的工具,思维导图 FreeMind,于是顺道试用了一下,照着画了一张 Java 工程师的学习线路图.
- Java-集合类汇总
结构图: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakH ...
- uploadfile上传文件时ie浏览器无法弹出窗口
设置--->安全---->activeX筛选取消选择 更多.net.sqlserver.jquery资料欢迎访问 htttp://www.itservicecn.com
- SpringMVC实战
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...
- Java编程思想学习(九) 异常处理
java的异常处理机制可以使程序有极好的容错性,让程序更加的健壮.所谓的异常,就是指的阻止当前方法或作用域继续执行的问题,,当程序运行时出现异常时,系统就会自动生成一个Exception对象来通知程序 ...