「笔记」多项式任意长度循环卷积

我们知道\(FFT\)是一个循环卷积。
本质上的离散傅里叶变换满足的是这个性质:

\[c_k=\sum\limits_{i,j}[i+j=k(mod\ n)]a_ib_j \]

但是由于我们做的长度足够大(\(n\)足够大)所以这种循环卷积卷不回去。
这导致我们只能做特定长度的\(FFT,n=2^w\)
如果我们需要做任意长度循环卷积呢?

其实稍微推推式子就可以了。。。
只说\(DFT\),\(IDFT\)也类似。
其实我们要求的是这样一个多项式:

\[DFT(A,x)=\sum\limits_{i=0}^{n}x^i\sum\limits_{j=0}^{n}a_iw_n^{ij} \]

也就是所谓的点值表达式。
那么也就是要求:

\[c_k=\sum\limits_{i=0}^{n}a_iw_n^{ik} \]

这样就可以用我们的小\(trick\)个换成卷积形式了。

\[c_k=\sum\limits_{i=0}^{n}a_iw_n^{\frac{i^2+k^2-(k-i)^2}{2}} \]

这样可以拆了:

\[c_k=w_n^{\frac{k^2}{2}}\sum\limits_{i=0}^{n}\left(a_iw_n^{\frac{i^2}{2}}\right)w_n^{-\frac{(k-i)^2}{2}} \]

卷积形式吧!

也就是说
我们做一次任意长度循环卷积需要\(FFT\)上9次。。。
常数还是蛮大的。
有一种神仙的办法就是把虚部压进去一起\(DFT\),我还没搞太明白。
晚上再去看吧。

posted @ 2020-03-04 07:29  Lrefrain  阅读(546)  评论(0编辑  收藏  举报