K 进制 FWT / 高维多项式乘法 略记
最简单的问题:
二进制不进位加法卷积。
即已知向量
上述问题可以转化为高维多项式乘法问题,比如二进制异或卷积,就相当于对于
根据 DFT 的线性性,容易知道多维的 DFT 问题可以逐维求解。
说人话,就是做
容易实现一个每维长度都等于
void DWT(Cp *a) // 也叫 K 进制不进位加法卷积;K 进制 FWT
{
static Cp t[10];
for(int d = 1; d < M; d = d * V) // 从低维向高维做
for(int i = 0; i < M; i += d * V)
for(int j = 0; j < d; ++j) // 枚举向量的第 j 位
{
for(int k = 0; k < V; ++k) // n^2 跑 dft
{
t[k] = Cp();
for(int p = 0; p < V; ++p)
t[k] = t[k] + a[i + j + p * d] * w[p * k];
}
for(int k = 0; k < V; ++k)
a[i + j + k * d] = t[k];
}
}
考虑若每一维长度有所不同,并不影响该算法的运行。
考虑进行高维 DFT 的复杂度:
对于第 bluestein-algorithm 将 DFT 的复杂度优化至
归程
Radix Sum
算力训练大毒瘤!