深入理解 FFT
理论前置
知道啥是多项式(即
知道啥是多项式的卷积(即
知道啥是复数(即
知道啥是单位根(即
引入
随着 OI 中毒瘤出题人和毒瘤数数题的变多,我们有时候会需要求两个多项式的卷积,根据定义暴力计算,我们有一个 优秀做法。
显然毒瘤出题人不会止步于此,于是我们需要更快的算法。
这时就需要引入多项式的另外一种表示方法了。
点值表示法
对于
具体的,对于一个
这种表示法对我们来说是很好的,因为对于两个多项式
现在让我们整理一下算法流程:
- 输入两个多项式
- 把
各转成点值表达法(需要 个点) - 把点值表达法的
两两相乘 - 把点值表达法转成
的系数表达法 - 输出多项式
。
现在为止一切都很好,但是我们会发现还存在一个问题:系数表达法和点值表达法的转换依旧是
你先别急,先看完下面再说
系数表达法 -> 点值表达法
让我们先从简单的多项式入手,比如
很简单,我们可以代入一系列的正负值
稍难一点,设
一般的,对于多项式
可以发现对于
看上去非常不错,但事实上这种做法暗藏着一个陷阱:经过一轮迭代后
怎么解决呢?
可以发现我们想要的是一系列值
这时就需要引入复数了。
不妨设
怎么计算
至此,我们就可以通过分治将此算法做到
点值表达法 -> 系数表达法
考虑系数表示法变成点值表示法的另外一种方式:线性代数。
我们有
使用矩阵表示即为
代入
那么如果我们想要进行 IFFT,本质上就是对上面这个大矩阵求逆。
由于这是一个有一些很好的性质的矩阵,所以它的逆也非常的漂亮:
不难发现逆矩阵和原矩阵几乎一模一样,也可以使用 FFT 的方式计算。
至此,我们可以在
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律