快速傅里叶变换
学习这个很久了,由于网上没有为初学者写的详细的教程,走了很多弯路。特此写一篇文章。特此写一篇文章。
考虑两个多项式f(x)=n∑i=0aixi,g(x)=n∑i=0bixi,如果我们得到他们的卷积h=f∗g,直接用系数表示进行计算的话,时间复杂度为O(n2)的。因此,我们考虑用点值表示法。也就是说,如果我们知道
f(x)={(x1,y1),(x2,y2)⋯(xn,yn)}
g(x)={(x1,y′1),(x2,y′2)⋯(xn,y′n)}
就可以得到
h(x)={(x1,y1y′1),(x2,y2y′2)⋯(xn,yny′n)}
这样做就变成O(n)了。
那么现在问题变成了如何求得f的点值表示?这里我们就需要用到快速傅里叶变换。我们考虑对f(x)进行变形 ,为了叙述方便,我们假设多项式的项数n满足n=2k−1,k∈Z,不足的项系数为0。
f(x)=n∑i=0aixif(x)=n−12∑i=0a2i+1x2i+1+n−12∑i=0a2ix2if(x)=xn−12∑i=0a2i+1x2i+n−12∑i=0a2ix2i
我们假设
G(x)=n−12∑i=0a2i+1x2iH(x)=n−12∑i=0a2ix2i
那么有
f(x)=xG(x2)+H(x2)
假设ωn为单位复根,即ωn满足
ωnn=1
那么有
DFT(f(ωkn))=ωknDFT(G(ω2kn))+DFT(H(ω2kn))DFT(f(ωkn))=ωknDFT(G(ωkn2))+DFT(H(ωkn2))
同理
DFT(f(ωn2+kn))=ωknDFT(G(ω2k+nn))+DFT(H(ω2k+nn))DFT(f(ωn2+kn))=−ωknDFT(G(ωkn2))+DFT(H(ωkn2))
至此,我们完成了计算。一共O(logn)层,每层处理O(n),时间复杂度O(nlogn)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App