据助教说不考这么麻烦的计算,我就摸了
多项式的表示
最熟悉的是系数表示法,例如 P(x)=∑ni=0aixi
系数表示法有它的好处:例如将 \Set1,x,x2… 视为一组基时,系数恰好就是多项式在这组基下的坐标;例如对于任给的点 x 可以计算多项式的值(O(n) 次乘法)。但是在给出系数表示法后,对两个 n 次多项式很难高效算乘积(还记得天才本科生Karatsuba吗)
还可以是点值表示法。根据lagrange插值可知,一个 n 次多项式可以由 n+1 个点唯一确定。因此 P(x)def=\Set(x0,y0),(x1,y1)…
此时计算 P(x)Q(x) 只需要求出 2n+1 个点值,然后将这些取值对应相乘即可得到 R(x)=P(x)Q(x) 的点值,也就唯一确定了 R(x)
因此我们希望有一种方法,对于给定的系数表示多项式 F(x),G(x),能够选取 2n+1 个点
对这 2n+1 个点做插值后得到 F∗(x),G∗(x) 的点值表示,相乘最后还原得到 F(x)G(x) 的系数表示。
这就是FFT
FFT
DFT
不妨假设多项式是 n=2k 次的
考虑方程 xn=1 的所有复数解,它们构成了复平面单位圆上等距分布的 n 个点,记为 \Setωi∣ωni=1
选择这些点出自如下考虑:取 Ωn,那么有 Ω2n2def=\Setx2∣x∈Ω2n=Ωn。这暗示我们可以通过类似分治的算法来每次将问题的规模减小一半。并且对于 Ωn 而言,只需要其生成元 ω1=e2πn+1i 即可完全表示。
假设需要对 F(x)=∑2ni=0aixi 插值,那么记 G(x)=∑ni=0a2ixi,H(x)=∑ni=0a2i+1xi,显然有
- F(x)=G(x2)+xH(x2)
- 原本要对 F(x) 在 Ω2n 上插值,现在要对 G(x),H(x) 在 Ωn 上插值
主定理算一下就是 O(nlogn) 的。
IDFT
考虑如下矩阵形式的DFT
⎡⎢
⎢
⎢
⎢
⎢⎣ω0ω0⋯ω0ω0ω1⋯ωn⋮⋮⋱⋮ω0ωn⋯ωn2⎤⎥
⎥
⎥
⎥
⎥⎦⎡⎢
⎢
⎢
⎢⎣a0a1⋮an⎤⎥
⎥
⎥
⎥⎦=⎡⎢
⎢
⎢
⎢
⎢⎣F(ω0)F(ω1)⋮F(ωn)⎤⎥
⎥
⎥
⎥
⎥⎦
即我们的 Ωn 是一组基,\Setan 则是基下的坐标,作用一下就能得到多项式在 Ωn 上的点值。
这个矩阵 W 非常经典,算一下行列式和逆就会发现对于IDFT的操作只需要取 ω′1=−ω1 做DFT即可实现逆变换,最后需要除掉一个系数 1n+1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~