Bluestein算法简要介绍

前言

其实我是不打算学 Bluestein \text{Bluestein} Bluestein 的,第一次听说这个算法还是在今年省选后,HNOI2019D2T2考了,然后就比较悲剧。

刚好 Dra 在啃论文,跟着一块将近啃了一个下午,大概是看懂了,于是就有了这篇文章。

下面是一些参考资料

  • 2016年国家集训队论文毛啸《再探快速傅里叶变换》
  • wikipedia

原理

普通的 FFT \text{FFT} FFT 是把函数表达式转点值表达式,并采了 N = 2 n N=2^n N=2n 个样本,即采样点 x i = w N i x_i=w_N^i xi=wNi

Bluestein \text{Bluestein} Bluestein 算法并不要求 N N N 2 2 2 的整数次幂,即可以对复数域单位圆上的一系列有倍数关系的点进行多点求值。

具体地,假设有
f ( x ) = ∑ i = 0 n − 1 f i ⋅ x i f(x)=\sum_{i=0}^{n-1} f_i \cdot x^i f(x)=i=0n1fixi

那么我们对它进行 DFT \text{DFT} DFT 操作,就相当于求
F k = f ( w n k ) = ∑ i = 0 n − 1 f i ⋅ w n i k = ∑ i = 0 n − 1 f i ⋅ w n − ( k − i ) 2 + i 2 + k 2 2 F_k=f(w_n^k)=\sum_{i=0}^{n-1} f_i \cdot w_n^{ik}=\sum_{i=0}^{n-1}f_i \cdot w_n^{\frac {-(k-i)^2+i^2+k^2} 2} Fk=f(wnk)=i=0n1fiwnik=i=0n1fiwn2(ki)2+i2+k2

F k = w n k 2 2 ∑ i = 0 n − 1 f i w n i 2 2 ⋅ w n − ( k − i ) 2 2 F_k=w_n^{\frac {k^2} 2}\sum_{i=0}^{n-1} f_i w_n^{\frac {i^2} 2}\cdot w_n^{-\frac {(k-i)^2} 2} Fk=wn2k2i=0n1fiwn2i2wn2(ki)2

不难发现后面其实是一个卷积的形式,那么我们就可以用线性卷积把它优化至 O ( n log ⁡ n ) O(n\log n) O(nlogn)。这样一来,它的常数就是 FFT \text{FFT} FFT 的三倍。其实由于求和的上界是 n − 1 n-1 n1 ,因此我们需要对 k , i k,i k,i 的大小关系进行分类讨论,因此需要正反做两遍卷积,常数又翻了一倍。

注意到指数有可能不是一个整数,如果在模意义下可能会用到二次剩余,而解决二次剩余是一件比较麻烦的事情,那么我们可以用另一种换法
i k = ( i + k 2 ) − ( i 2 ) − ( k 2 ) ik=\binom {i+k} 2-\binom i 2-\binom k 2 ik=(2i+k)(2i)(2k)

同样地可以得到:

F k = w n − ( k 2 ) ∑ i = 0 n − 1 f i w n − ( i 2 ) ⋅ w n ( i + k 2 ) F_k=w_n^{-\binom k 2}\sum_{i=0}^{n-1} f_iw_n^{-\binom i 2}\cdot w_n^{\binom {i+k} 2} Fk=wn(2k)i=0n1fiwn(2i)wn(2i+k)

注意负数的组合数也是有定义的。把后面翻转一下就是卷积的形式。

应用

其实没什么应用,除了可以和单位根反演结合出毒瘤题之外,在单位根反演中如果要用到多点求值,而 w n w_n wn n n n 又不是一个 2 2 2 的整数次幂,就可以类似地用 Bluestein \text{Bluestein} Bluestein 来进行优化。如 [HNOI2019]白兔之舞中,答案的形式是类似于多点求值的。

另外值得一提的是,它可以在 O ( n log ⁡ n + n log ⁡ k ) O(n\log n+n\log k) O(nlogn+nlogk) 的时间内解决循环卷积的多项式快速幂,只需要在进入快速幂函数时 DFT \text{DFT} DFT 一次,中间快速幂的过程只需要对点值相乘,再函数结束前再重新 IDFT \text{IDFT} IDFT 回去即可。

代码

具体实现就不说了,代码也许以后会填坑吧。口胡一时爽,一直口胡一直爽

你可能感兴趣的:(学习笔记,=====数学=====)