彼岸弗弗欢
彼岸弗弗欢
其实是傅里叶变换。
因为发现自己之前学得像阿罗拉臭臭泥,所以再学一遍,写写之前没注意到的。
会有很多毫无意义的瞎扯,以及大量的对引用文章的解释,配合我东拼西凑的理解。
这东西就当个乐子看,学的话还是看文末好文共赏的那几篇,卡住了可以过来找找灵感。
过两天可能还会写份详细版,这个东西就一个雏形。
一些不严谨的约定
- 序列
的长度为 ,则意为序列 由 组成。 表示一形式幂级数 ,用 表示 的第 次项系数。 表示 在 时的值。 表示对 进行傅里叶变换之后的序列,相应的 表示对 进行傅立叶逆变换后的形式,即 本身。- 一般不区分 FFT 和 NTT,即不考虑数域。
- 卷积指代加法卷积,用
表示 与 进行卷积。 - 单位根即本元单位根,既可指单位根,也可指原根,事实上这俩玩意儿是一个东西,只是数域不同。
- 多项式和系数序列会突然转化,标志(大概)是字母的大小写改变。
李三傅里叶变换
其实是离散傅里叶变换。
我们回到 FFT 的起点,我们的思路是利用高效的多项式点值乘法进行加速,于是需要对输入多项式先进行求值,再把结果插值得到我们想要的系数表示(因为系数表示更常用,比如可以看作形式幂级数)。
其中求值部分被称为 DFT,即离散傅里叶变换,插值则为 IDFT。若不考虑 FFT 的加速,二者的原始做法应该是这样:
; .
可以用单位根反演证明二者为互逆操作,而 DFT 后乘法的正确性可以简单地展开式子来说明。
不难发现
IDFT 可以看作将
快速彼岸欢
其实是快速傅里叶变换。
基于求值这个想法,我们可以推出另一种 FFT 的实现
先提点前置知识。
也就是多项式取模的一点性质,首先模完了是常数这点显然,然后写开来是
同时还有:
这个证明就是单纯写开了。
其实
考虑我们求
那我们直接用上多点求值那一套,做成分治树的形式,使用多项式取模那一套做到
考虑单位根的好性质,我们可以尝试将单位根进行一定的分组凑出
然后我们这么一路合上去,每层的多项式数量都能折半,而顶层就是
不过我们考虑倒过来做,假定我们目前得到了
以
同理对于
做法于是呼之欲出了。
考虑我们沿用分治的策略,当前层有
啥你疑惑为什么
在最顶层模
大概原理是这样,没看懂的话去原文看图,我懒得画了虽然链接那篇文章也是用的原论文的图。
实质上这个做法又称 DIF-FFT,而我们以前的写法又称 DIT-FFT,它们在信号分析中有不同的意义(时域和频域),但是我也不懂。
另外有讲义说 DIF 和 DIT 的做法互为转置,但我不懂转置原理,所以只提一嘴。
值得指出的是考虑 DIT-FFT 的迭代版是先位逆序置换,然后按
同时我们还能对单位根的预处理进行调整,使得缓存友好来减小常数,然而暂时不想写。
闲行卷积
其实是线性卷积。
即考虑两数列
容易发现这和多项式乘法一个形式,使用 FFT 加速,于是线性卷积是好做的。
卷积寻欢
其实是循环卷积。
仍即考虑两数列
容易发现这和线性卷积差不多形式,做完合并贡献,于是循环卷积是好做的。
但是有更好的方法,考虑我们单位根的性质,会发现
而我们之前做卷积时的方法是:对于长度分别为
那如果我们的
具体的,考虑
式子很长,但干的事情很简单,就是把
不难发现当
当然我们一般的循环卷积仍能用线性卷积代替,但问题是一些乱七八糟的科技比如循环卷积快速幂里面需要直接卷积这个性质(主要是能求逆)来套回线性卷积的
现在我们知道直接用 FFT 可以做
于是请出我们的 Bluestein 或者说 Chirp Z 或者说 CZT,总之就是任意长度循环卷积。
这个东西的得到比较暴力,就直接单位根反演硬写式子,最后一步人类智慧给他换成线性卷积的样子。
啥你说最后还有一部卷积那它能干嘛?事实上尽管我们最后仍然用了 FFT 做线性卷积,但是我们因为构造了一摊系数于是最后线性卷积得到的值会是原序列循环卷积的值。
不过这个系数我还没推过,所以先鸽了,所以这部分配合好文共赏
肘积好文共赏
其实肘鸡是一位硕人。
注意
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!