2.upd.2025.7.10

oi.polo.fft

快速傅里叶变换(Fast Fourier Transform)

FFT三问:

1.什么是FFT

  • 一个快速处理卷积的算法

2.什么是卷积

  • 就是多项式乘法

3.FFT有多快

  • 常规卷积或是DFT时间复杂度为\(O(n^2)\),而FFT为\(O(nlog_2n)\),比常规卷积快了将近一阶

算法实现:

$Chapter1: $ 首先我们先来看两种多项式的表示形式

1.记录系数
2.记录点

首先我们先来看1.记录系数:

假设我现在有一个多项式叫做\(P(x)\),它有\(n\)个系数(n项)

那么不难发现它代数形式肯定能写成:

\(P(x) = a_0 +a_1x+a_2x+...+a_{n-2}x^{n-2}+a_{n-1}x^{n-1}\)

因此我记录\(P(x)\)也只需要记录其系数\({\{a_n\}}\)序列

我们再来看2.记录点

我们都学过待定系数法

因此我们知道对于一个\(n\)次函数,我们只需要取\(n+1\)个点就可以求出这个函数的代数式了!

所以我们只要记录\(n\)个点就可以表示这个\(n\)项多项式\(P(x)\)了

$Chapter2: $这两种存储方式该如何进行卷积运算?

1.记录系数方式的卷积:

很简单,我们直接用乘法分配律去算,但是对于两个项数为\(n\)的多项式,这样做的时间复杂度为\(O(n^2)\), 非常菜

2.记录点坐标方式的卷积:

设\(n\)阶多项式\(F(x)\)与\(m\)阶多项式\(G(x)\)相乘,结果为\(n+m\)阶多项式\(P(x)\) \(\Rightarrow\) \(P(x) = F(x)*G(x)\)

因此我们取\(F(x)\)和\(G(x)\)共\(n+m\)个点,将每一个点\((x_0,F(x))\)和\((x_0,G(x))\)相乘,得到\((x_0,F(x)*G(x)),这个点一定在P(x)上\)

但是我们发现取点需要\(O(n)\),计算需要\(O(n)\),总共还是要\(O(n^2)\),目前我们优化卷积还是毫无进展

$Chapter3: $对于记录点坐标方式卷积的优化

假设我现在要对于\(F(x)=x^2+1\)取\(m\)个点,我们要怎么做呢

一种方法是直接简单的取m个点,如取\(x=1,2,3,...,m\),并分别计算\(F(x)\),需要算2*m次(2为F(x)的项数)

但是我们思考\(F(x)\)的性质,它是一个偶函数欸!

\(F(x) = F(-x)\)

因此如果我们取 \(\pm 1,\pm2\)这样,我们计算出\(F(x)\)就相当于计算出了\(F(-x)\)!,要算\(m\)次

同理,对于奇函数我们也是如此

但是万一我的函数非奇非偶呢???

给定多项式\(F(x)=a_0+a_1x+a_2x^2+...+a_{n-1}x^{n-1}+a_{n}x^{n}\),为方便讨论我们假设\(n\)为偶数

我们有什么办法给\(F(x)\)施加奇偶性呢?

我们按照\(x\)的次数分为两类:

\(F(x) = (a_0 +a_2x^2+a_4x^4+...+a_nx^n) + (a_1x+a_3x^3+...+a_{n-1}x^{n-1})\)

我们令\(F_{even}(x^2)=a_0+a_2x^2+a_4x^4 + ...+a_nx^n,F_{odd}(x^2)=a_1+a_3x^2+...+a_{n-1}x^{n-2}\)

\(F(x)=F_{even}(x^2) + xF_{odd}(x^2)\)!

\(F(-x)=F_{even}(x^2) - xF_{odd}(x^2)\)

我们不难发现现在我们的\(F(x)\)被拆成了一个偶函数\(F_{even}(x^2)\)和一个奇函数\(xF_{odd}(x^2)\)

现在我们对于取的点\((x_0,F(x_0))\)计算出\(F_{even}(x_0^2)\)和\(F_{odd}(x_0^2)\)后相加可得\(F(x)\),相减可得\(F(-x)\)

那我们怎么计算\(F_{even}(x_0^2)\)和\(F_{odd}(x_0^2)\)?

这不就是一个递归嘛,将\(x_0^2\)看作变量,继续来一遍拆分,直到我的函数只有常数项为止,由主定理可得时间复杂度为\(O(nlog_2n)\)

但是,我有\(x_0^2\)啊,原来的\(\pm x_0\)都会变成\(x_0^2\),我在递归去求子函数的值的时候取点全会变成正的,无法正负取点了,所以递归无法进行。

\(Chapter4:\) 数域推广

现在我们需要寻找一类数\(S\),满足\(\forall x \in S,-x \in S\)且对于由\(\forall x \in S, x^2\)构成的集合\(S'\)和\(S\)满足同样的性质

实数无法满足的原因是你无法在\(S'\)中找到\(-x\),因此我们将数域推广至复数

以前的注意力大神发现了单位根 就满足这样的性质

什么是单位根?

单位根\(\{\omega_n\}\)就是在复数域下所有满足 \(x^n=1\)的\(x\)构成的集合

我们不难发现\(\{\omega_n\}\)将复平面上的单位圆进行了\(n\)等分,所以我们可以得到单位根的表达式:

\(\omega^k_n = cos\theta+isin\theta,\theta=\frac{2\pi k}{n}\)

我们这个时候取点取\(\{\omega_n\}\)就可以满足条件了

\(Chapter5:\) FFT完全版

  • 对于n项多项式\(F(x)\)取\(n\)次单位根为点
  • 分奇偶函数递归计算\(F(\omega_n^i)\)
  • 同样计算\(G(x)\)
  • 将\(G(x)\)与\(F(x)\)以点坐标形式相乘

这就是FFT,很简单吧

但是我们发现这离结果还远着呢,所以我们需要从点表示转换为系数表示,因此我们需要插值操作

\(Chapter6:\) 插值

我们将待定系数列的方程组写为矩阵形式(\(P(x)\)系数为\(\{a_n\}\))

\(
{\begin{bmatrix}
P(\omega^0) \\\\
P(\omega^1) \\\\
P(\omega^2) \\\\
\vdots \\\\
P(\omega^{n-1}) \\\\
\end{bmatrix}} = {\begin{bmatrix}
1 & 1 & 1 & ... &1\\\\
1 & \omega & \omega^2 & ... & \omega^{n-1}\\\\
1&\omega^2&\omega^4&...&\omega^{2
(n-1)}\\\\
\vdots&\vdots&\vdots&\ddots&\vdots\\\\
1&\omega^{n-1}&\omega^{2(n-1)}&...&\omega^{(n-1)(n-1)}
\end{bmatrix}} {\begin{bmatrix}
a_0 \\\\
a_1\\\\
a_2 \\\\
\vdots \\\\
a_{n-1} \\\\
\end{bmatrix}}
\)

移项将\(\{a_n\}\)解出

\(
{\begin{bmatrix}
a_0 \\\\
a_1\\\\
a_2 \\\\
\vdots \\\\
a_{n-1}
\end{bmatrix}} = {\begin{bmatrix}
1 & 1 & 1 & ... &1\\\\
1 & \omega & \omega^2 & ... & \omega^{n-1}\\\\
1&\omega^2&\omega^4&...&\omega^{2
(n-1)}\\\\
\vdots&\vdots&\vdots&\ddots&\vdots\\\\
1&\omega^{n-1}&\omega^{2(n-1)}&...&\omega^{(n-1)(n-1)}
\end{bmatrix}}^{-1} {\begin{bmatrix}
P(\omega^0) \\\\
P(\omega^1) \\\\
P(\omega^2) \\\\
\vdots \\\\
P(\omega^{n-1})
\end{bmatrix}}
\)

我们发现中间的那个矩阵为DFT(离散傅里叶变换)矩阵,因此可得

\(
{\begin{bmatrix}
a_0 \\\\
a_1\\\\
a_2 \\\\
\vdots \\\\
a_{n-1}
\end{bmatrix}} = \frac{1}{n}{\begin{bmatrix}
1 & 1 & 1 & ... &1\\\\
1 & \omega^{-1} & \omega^{-2} & ... & \omega^{-(n-1)}\\\\
1&\omega^{-2}&\omega^{-4}&...&\omega^{-2
(n-1)}\\\\
\vdots&\vdots&\vdots&\ddots&\vdots\\\\
1&\omega^{-(n-1)}&\omega^{-2(n-1)}&...&\omega^{-(n-1)(n-1)}
\end{bmatrix}} {\begin{bmatrix}
P(\omega^0) \\\\
P(\omega^1) \\\\
P(\omega^2) \\\\
\vdots \\\\
P(\omega^{n-1})
\end{bmatrix}}
\)

然后我们发现我们只需要求解这个矩阵乘法即可

矩阵乘法是什么?卷积,卷积是什么?多项式乘法

因此我们再FFT一遍就行了

end.

快速傅里叶变换(FFT) 笔记的更多相关文章

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

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

  2. 【学习笔记】快速傅里叶变换(FFT)

    [学习笔记]快速傅里叶变换 学习之前先看懂这个 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理--gzy hhh开个玩笑. 讲一下\(FFT\) ...

  3. 快速傅里叶变换(FFT)学习笔记

    定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...

  4. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  5. 快速傅里叶变换(FFT)学习笔记(其一)

    再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...

  6. 快速傅里叶变换(FFT)学习笔记(其二)(NTT)

    再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...

  7. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  8. 快速傅里叶变换(FFT)

    扯 去北京学习的时候才系统的学习了一下卷积,当时整理了这个笔记的大部分.后来就一直放着忘了写完.直到今天都腊月二十八了,才想起来还有个FFT的笔记没整完呢.整理完这个我就假装今年的任务全都over了吧 ...

  9. 快速傅里叶变换FFT

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

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

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

随机推荐

  1. Java中的常见排查问题命令

    一.线上服务排查,从三个方面负载.cpu.内存 这三个方面着手 1:top 命令是比较常见的,也是最常用的,因为他显示的信息也是最全的 2:针对负载的问题,我们怎么能确定负载当前是高还是低? 一般来说 ...

  2. @PathVaribale

    /** * @pathVaribale * 作用: 用于获取url 中的占位符的值. * 例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符. * url 支持占位符是 ...

  3. jmeter返回数据重新编码的方法

    下图内容为请求后的返回值,红色箭头内容是需要正则处理传参给后面的接口使用 其中==后面的\U0026为未编码内容 而实际能够提交的链接为下图"&" 所以,图1请求后需要先转 ...

  4. SearXNG+MCP实现搜索引擎,想怎么搜就怎么搜

    一.概述 MCP应用市场,有很多搜索引擎的应用.但是你们会发现,普遍都需要api-key.你必须花钱购买api-key才能实现搜索功能. 问题来了,我就想用免费搜索的,就向百度一样,可不可以? 答案是 ...

  5. RabbitMq在win10上的安装、用户管理及控制台Demo

    思路: 安装elang--设置elang的环境变量--安装erlang版本对应的rabbitmq--设置rabbitmq的环境变量--安装rabbitmq的可视化管理插件 相关链接: RabbitMQ ...

  6. 3d xna fbx winfrom 读取

    本文通过参考网上资源做的一个例子. 本程序的功能就是通过xna 将3d 图像显示到winfrom 对他进行旋转操作. 首先我们先准备好两个文件夹 model  文件夹放fbx文件,textures 放 ...

  7. 架构哲学与游戏工业化:策划x程序x抽象x复用x易用=降本增效

    (一)前言 策划 x 程序 x 抽象 x 复用 x 易用 = 降本增效 公式为什么是乘法而不是加法? 如果是加法,任何一个维度的数据为0时结果可能还是正数:如果是乘法,任何一个维度数据都不能为0否则结 ...

  8. 【HUST】网安|计算机网络安全实验|实验一 TCP协议漏洞及利用

    写在最前: 实验指导书已经写得非常好了,这是我个人的实验记录,并没有认真整理和记录容易出问题的地方.只是免得以后忘了什么是netwox还得翻学习通. 文章目录 涉及代码的仓库地址 docker使用 建 ...

  9. 【记录】Python3|json文件处理相关的操作

    文章目录 json分割 json.gz 转换成 jsonl.gz json格式化显示 遍历目录及子目录,对某种类型的文件内容查找是否有指定字符串 json分割 主要使用json.loads.json. ...

  10. RPC实战与核心原理之熔断限流

    熔断限流 服务端的自我保护 策略 在 RPC 调用中服务端的自我保护策略就是限流 如何实现 方式有很多,比如最简单的计数器,还有可以做到平滑限流的滑动窗口.漏斗算法以及令牌桶算法等等.其中令牌桶算法最 ...