前言
本文仅作为简单的离散傅里叶的简单推导
点值表示法
设 f(x)=∑aixi
如何快速计算卷积?
下面的证明写得不好, 只是简单写写…
考虑将这个多项式用点值表示
{vi,f(vi)}
只需要证明这种表示方法是 充分必要 的
感性证明: 多项式函数由 n−1 个方程即可 充分必要 地表示
我们带值其实就是列了 n−1 个系数方程, 最终可以求出 n 个系数
那么 {vi,f(vi)⋅g(vi)} 可以反推回 f∗g 吗?
其实就是要证明 f(vi)⋅g(vi)=(f∗g)(vi)
走到这一步其实就呼之欲出了, AB=C 这种结构的多项式计算, 分开来先算 A 和 B 或者是直接算 C 不只有顺序的区别吗?
快速求点值
考虑分治
这里需要一些符合分治的特殊性质
考虑 复数域 的 单位根
单位根定义
wnk=cosn2πk+isinn2πk(=en2πki)
考虑到大多数人应该都没有接触过 欧拉 用 e 来表示的单位根(一个经典的应用是 eπi+1=0), 并且三角函数表示比较简单易懂, 以下全部使用三角函数表示法证明
为了防止混淆, 上下标不用 i 表示, 以下的 i 的定义为 i2=−1
首先我们的目标是求:
{f(wnk)}
对于
f(x)=a0+a1x1+⋯+anxn
为了分治的方便起见, log2n∈N+
左右直接拆分
先考虑暴力拆分
f(x)=(a0+⋯+a2n−1x2n−1)+(a2nx2n+⋯anxn)=(a0+⋯+a2n−1x2n−1)+x2n(a2nx0+⋯anx2n−1)
想不出此处的 x2n 该叫什么好, 便叫他 转移系数 啦
不难看出, 此处附带的转移系数是 x2n
每个转移阶段都不一样, 不方便!
积偶拆分
考虑更方便的做法(使转移系数恒定为 x)
不难发现积偶数是隔一个元素出现一次的, 很好地满足了这个性质
设
F(x2)G(x2)=a0+a2x2+⋯+anxn=a1+a3x2+⋯+anxn
至于为什么传入的是 x2, 是为了方便, 更多的思考, 请自行斟酌
有
f(x)=F(x2)+xG(x2)
那么有
f(wnk)=F(wn2k)+wnkG(wn2k)
单位根是处在一个圆上的, 不难发现, 圆上下对应了的值是完全相反的, 如何利用这一点来求值?(此处以中心对称出发)
考虑 wnk+2n
有
f(wnk+2n)=F(wn2k+n)+wnk+2nG(wn2k+n)
统一下形式
首先研究 wnk 与 wnk+2n 的关系
wnk+2n=cosn2π(k+2n)+isinn2π(k+2n)=cos(n2πk+π)+isin(n2πk+π)=−cosn2πk−isinn2πk=−wnk
然后研究 wn2k+n 如何转化为 只缩小 n (进行分治) 的结果
wn2k+n=cosn2π(2k+n)+isinn2π(2k+n)=cos2n2πk+isin2n2πk=w2nk
恭喜! 成功统一了结构!
有
f(wnk)f(wnk+2n)=F(w2nk)+wnkG(w2nk)=F(w2nk)−wnkG(w2nk)
这下算出 F,G 可以用两次了!
此单步的时间复杂度是: T(n)=2T(2n)+1=O(log2n)