算法 - FWT & FFT & NTT
反正是用来卷的。
FWT
作用
用于求
开始
记
拿 g 为 XOR 为例:
对于 XOR,
对于 OR,
利用之前推出的等式,可以归纳证明
那么
以 XOR 为例简单证明,设
若
实现
- 如果这个运算 g 不满足交换律,你会发现类似
的式子,一种方法就是多写一个函数,或者把 A 或 B 取反,那么 g 就满足交换律了。 - FWT 可以简单地写成非递归的形式。
- 对于 XOR,有
,因为每递归一层就会差 2 倍。
1 | template<typename T> |
FFT
作用
已知
设
如果能够获得
而 FFT 正是用于加速这个过程。
开始
DFT
为方便计算,设
选取的
现在要求
对于奇数项和偶数项,分别求出
至此 DFT 完成了。
IDFT
但是为了求出
考虑 DFT 的过程,设矩阵
现在需要求
设
所以只需要对
至此 FFT 完成了。
实现
- DFT 由于要奇偶分别递归,要写成非递归形式可能有些困难。目标是把初始向量重新排列之后变成左右递归而不是奇偶递归,以方便自底向上(其实就是把递归的依据从下标的末尾换成首位),这部分怎么写炫酷就怎么写。
NTT
与 FFT 唯一的不同是多项式是模意义下的。(
此时需要单位根的替代品,原根,但同时对模数提出了一些要求。
但实现方法和 FFT 是一致的。
此处暂略。
后记
鉴于网上的一些资料不够直观/简洁,于是按自己的思路另外写了一份。