快速傅里叶变换实用讲解

快速傅里叶变换实用讲解

妈妈再也不用担心 FFT 只能记板子了。


快速傅里叶变换

一个 n 项(n1 次)多项式可以用 n 个点值表示,利用这一点我们可以实现系数表达与点值表达的转换。

对于二的整数次幂 n 项多项式 F(x)=i=0n1aixi,我们用求出点值 F(wni) 其中 wnn 次单位根。

F0(x)=a0+a2x+a4x2+,F1(x)=a1+a3x+a5x2

很明显有F(x)=F0(x2)+xF1(x2)

那么 k<n2

F(wnk)=F0(wn2k)+wnkF1(wn2k)=F0(wn2k)+wnkF1(wn2k)F(wnk+n2)=F0(wn2k+n)+wnk+n2F1(wn2k+n)=F0(wn2k)wnkF1(wn2k)

可以发现这两个仅是符号的差别,于是我们可以分治解决。


快速傅里叶逆变换

根据系数求点值可以看作一个线性变换,即:

[1wnwn2wnn11wn2wn4wn2(n1)1wn3wn6wn3(n1)wn3(n1)1wnn1wn2(n1)wn(n1)2][f0f1f2fn1]

逆变换相当于对这个矩阵求逆,得到(我并不会证明):

1n[11wn1wn21wnn111wn21wn41wn2(n1)11wn31wn61wn3(n1)1wn3(n1)11wnn11wn2(n1)1wn(n1)2]

该有的性质还是有,直接用 FFT 的方法求解即可。


蝶形变换

好美的名字。

直接给结论吧:最终系数 ai 会跑到 revi 的位置,其中 revi 指将 i 二进制表示翻转后的结果。

证明也十分简单,考虑上述分治过程,分治到第 k 次本质在决定位置的二进制第 k 高位,而我们考虑的确是二进制第 k 低位,就相当于将其二进制翻转。

于是我们就改递归为递推了。


模意义

单位根是复数域上的概念,对应在模意义域就是原根。

其实上述分治过程只是用到了单位根的三个性质:

  • wnn=1

  • wnn2=1

  • wn2k=wn2k

而原根也有这些性质,可以放心使用。

但还有一点,由于 wn=GP1n,其中 G 表示原根,P 表示模数,这里要求 P1n 的倍数,即至少有 log2n2 的因子。

常用的的有:

  • P=998244353,G=3

  • P=469762049,G=3

  • P=1004535809,G=3


任意模数

很简单,分别用上文的三种模数实现 NTT 后用中国剩余定理还原出真实的值,从而实现任意模数。


多项式求逆

注:为了美观,本段所有多项式省去 (x)
假设我们求出了 1FH(modxn2),现在要求 1FG(modxn)

显然我们有 HG0(modxn2),考虑对左边平方,令P=HG,则[xi]P2=j[xj]P[xij]P,而 min{j,ij}<n2,所以 [xj]P[xij]P 一定有一个为 0,所以 P20(modxn)

所以 H22HG+G20(modxn),同乘 F 后移项得到 G2HHF(modxn)

因为 T(n)=T(n2)+O(nlogn)。最后复杂度 O(nlogn)


分治FFT

半在线卷积的解法,其实就是CDQ分治优化DP+FFT。

虽然模板题可以多项式求逆搞过去。但只需要加一个逐项系数 ai,即变为:

fi=aij=1ifijgj

就可以阻止多项式求逆。


求导推式子

当遇到形如 f(x)=f(x)+g(x) 的式子时,若 g(x) 已知,则可以 O(n) 求得 f(x)n


动态多项式乘法

每次乘/除上一个因式,动态维护其结果

多项式乘法可以看作一个递推,那么多项式除法就是一个逆过程,在这之上易于计算。

当每次乘除的因式极短时,这种方法要优于FFT。


生成函数的上下界限制

生成函数,在多项式形式的上下界进行修改,其实是限制了方案。

作者:lupengheyyds

出处:https://www.cnblogs.com/lupengheyyds/p/18734586

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   lupengheyyds  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示