快速傅里叶变换 | FFT 初学
FFT
前置
多项式:形如
多项式乘法:
其中,
多项式表示法:
- 系数表示法:将每一项的系数拿出来写在一起共同组成一个向量,如果缺项就补
。一般书写的顺序与数组下标对应。
- 点值表示法:任意的
次多项式都可以由二维平面内任意 个点唯一确定,因为一个方程可以解出一个系数。故 次多项式可以用一个包含 个二维平面内的点集来表示。
快速傅里叶变换
对两种表示法分别进行多项式乘法,不难发现,系数表示法的过程是基于乘法分配律的,
但是,一般题目给定了多项式的系数表示,为了快速实现多项式乘法,我们需要快速实现多项式的系数表示转点值表示,这也就是FFT做的事情。
至此,我们大致了解了多项式乘法的基本过程。
- 求值:将多项式
通过FFT由系数表示转化成点值表示; - 点乘:然后将点值表示下的
通过 的点乘得到结果 的点值表示; - 插值:将多项式
通过FFT的逆操作还原出 的系数表示。
那么,要如何实现求多项式的一个点值呢?这里我们采用霍纳法则将多项式展开。
那么我们可以在
单位根
定义:在复数域下,我们称满足
由代数基本定理可知,
下面给出有关单位根的几则引理。
- 消去引理:若
,则有 。证明:
- 折半引理:若
是大于 的偶数,则 个 次单位复数根的平方的集合就是 次单位复数根的集合,共 。通俗点说, 次单位复数根的前后两半平方后是对应相等的。证明:
- 求和引理:对于
和满足 的非负整数 ,有
下面讲讲如何在
我们将
而对于一个多项式
这样,将
这显然是可以分治递归求解的,每次次数界折半,时间复杂度
插值的话,就是反过来做,推到一下式子可得:
发现求系数的过程与前面求点值的过程类似,也可以在
优化
-
蝶形变换
令
,那么不难发现递归时 长这样。记最后的数组为
,则有 ,故一开始时可以交换 和 以减少常数。 -
三次变两次
发现整个过程先要求两个多项式
的点值,点乘后又要还原出系数,总共进行了 次FFT。把
放到 的虚部上,求出 ,然后把它的虚部 即为答案。证明:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效