首页 > 其他 > 详细

高维FWT

时间:2019-11-05 17:56:10      阅读:103      评论:0      收藏:0      [点我收藏+]

给定\(F(a_0,a_1...a_n)_3\)\(G(a_0,a_1...a_n)_3\)

定义\(a \oplus b\) 为3进制不进位加法,求$ Ans= F \oplus G$ ,即求
\[ Ans(a_0+b_0 \bmod 3,a_1+b_1 \bmod 3,...,a_n+b_n \bmod 3)_3=F(a_0,a_1...a_n)_3 G(b_0,b_1...b_n)_3 \]

part 1

我们先考虑\(n\)\(1\)的情况,可以发现这就是一个长度为\(3\)的循环卷积。

因为该卷积的元素个数很少,我们考虑如何对多项式\(A(x)\)暴力求\(DFT(A(x))\)\(IDFT(A(x))\)

回想一下\(DFT\)是在做什么,它相当于是给定多项式\(A(x)\)各位的系数\(a_i\),对多项式\(A(x)\)\(x=\omega_n^0,\omega_n^1...\omega_n^{n-1}\)时的值。

\(IDFT\)就是给定多项式\(A(x)\)\(x=\omega_n^0,\omega_n^1...\omega_n^{n-1}\) 的值,求多项式\(A(x)\)各位的系数\(a_i\)

考虑一下以下矩阵(范德蒙德矩阵)

\[ T_n = \begin{bmatrix} 1 & 1 & 1 & \ldots & 1 \1 & \omega_n ^ 1 & \omega_n ^ 2 & \ldots & \omega_n ^ {n - 1} \1 & \omega_n ^ 2 & \omega_n ^ 4 & \ldots & \omega_n ^ {2(n - 1)} \\ldots & \ldots & \ldots & \ddots & \ldots \1 & \omega_n ^ {n - 1} & \omega_n ^ {2(n - 1)} & \ldots & \omega_n ^ {(n - 1)(n - 1)} \\end{bmatrix} \]

我们发现对\(A(x)\)\(DFT\)就是对\(A(x)\)所表示的向量乘上矩阵\(T_n\)

考虑\(T_n\)的逆矩阵
\[ T_n ^ {-1} = \frac{1}{n} \begin{bmatrix} 1 & 1 & 1 & \ldots & 1 \1 & \omega_n ^ {-1} & \omega_n ^ {-2} & \ldots & \omega_n ^ {-(n - 1)} \1 & \omega_n ^ {-2} & \omega_n ^ {-4} & \ldots & \omega_n ^ {-2(n - 1)} \\ldots & \ldots & \ldots & \ddots & \ldots \1 & \omega_n ^ {-(n - 1)} & \omega_n ^ {-2(n - 1)} & \ldots & \omega_n ^ {-(n - 1)(n - 1)} \\end{bmatrix} \]
可以证明该矩阵是\(T_n\)的逆矩阵(当然我不会啦)

那么对\(A(x)\)\(IDFT\)就是对\(A(x)\)所表示的向量乘上矩阵\(T_n^{-1}\)

对于一个大小为\(3\)的多项式,我们只要先求出\(3\)次单位根,再暴力乘上一个\(3*3\)的矩阵就好了

Part 2

\(n>1\),那么我们要求一下式子(为了方便以下式子都省略\(\bmod 3\))
\[ F(a_0,a_1...a_n)_3 G(b_0,b_1...b_n)_3 \to Ans(a_0+b_0,a_1+b_1,...,a_n+b_n)_3 \]
我们不妨先枚举\(a_1,a_2...a_n,b_1,b_2...b_n\)
\[ F(a_0,x,y...z)_3 G(b_0,u,v...w)_3 \to Ans(a_0+b_0,x+u,y+v,...,z+w)_3 \]
我们此时只要对\(F,G\)的第一维做循环卷积就好了。

假设我们已经对\(F(a_0,x,y...z)\)\(G(b_0,u,v...w)\)的第一维做了\(DFT\)变换

此时我们要求:
\[ F(X,x,y...z)_3 G(X,u,v...w)_3 \to Ans(X,x+u,y+v,...,z+w)_3 \]
然后再对 \(Ans\) 的第一维做\(IDFT\)变换

我们考虑求解它的一个子问题
\[ F(X,x,y...z)_3 G(X,u,v...w)_3 \to Ans(X,x+u,y+v,...,z+w)_3 \]
即枚举\(F,G\)的第一维,再枚举\(F,G\)除第二维以后的后面几维
\[ F(X,a_1,x,y...z)_3 G(X,b_1,u,v...w)_3 \to Ans(X,a_1+b_1,x+u,y+v,...,z+w)_3 \]
我们发现这个形式和上面的形式差不多,我们此时再对\(F,G\)第二维做\(DFT\)变换,再解决一个子问题,再对\(Ans\)

第二维做\(IDFT\)变换

我们这样递归下去,发现我们就是对\(F,G\)\(1 \to n\)维做\(DFT\)变换,再对\(F,G\) 对应的点值相乘,再做\(IDFT\)变换

伪代码:

FWT(A),FWT(B)

for(i=0~(3^n)-1) A[i]*B[i]->Ans[i]

IFWT(Ans)

复杂度\(O(3^n n *3^2)\)

若将\(3\)换成\(d\),复杂度为\(O(d^n n* d^2)\)\(O(d^n n* d logd)\)

高维FWT

原文:https://www.cnblogs.com/zhongzero/p/11799142.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!