位运算卷积

位运算卷积

快速求序列 \(C\)

\[C_i=\sum_{j\oplus k=i}A_jB_k \]

其中 \(\oplus=or,and,xor\)

类似 FFT 的思路,对于序列 \(a\) 构造新序列 \(fmt(a)\),使得满足 \(fmt(a*b)_i=fmt(a)_i\times fmt(b)_i\)

在位运算情况下,\(fmt(a)_i\) 均可以表达成关于序列 \(a\) 的可逆线性变换,即:

\[fmt(a)_i=\sum_j g(i, j)a_j \]

将这个表达式带入上面 \(fmt\) 的性质:

\[\begin{aligned} fmt(a*b)_i &= fmt(a)_i\times fmt(b)_i \\ \sum_x g(i, x)(a*b)_x &= \sum_yg(i,y)a_y\sum_zg(i,z)b_z \\ \sum_j\sum_kg(i, j\oplus k)a_jb_k &= \sum_y\sum_zg(i, x)g(i, y)a_yb_z \end{aligned} \]

考虑直接令 \(j=y,k=z\) 的每一对 \((j,k,y,z)\) 都存在 \(g(i,j\oplus k)=g(i,x)g(i,y)\) 即可满足性质。

分别将 \(\oplus\) 带入 \(or,and,xor\) 找到合适的函数 \(g\)

or

\(g(i, x)=[x\subset i]\)

即对 \(i\)子集和

\(fwt\quad ifwt\):SOSDP。

and

\(g(i, x)=[x\supset i]\)

即对 \(i\)超集和

\(fwt\quad ifwt\):SOSDP。

xor

\(g(i,x)= (-1)^{|x\cap i|}\)

\(fwt\) 操作:\(A={A_0+A_1},A_0-A_1\)

\(ifwt\) 操作:\(A=\frac{1}{2}(A_0+A_1),\frac{1}{2}(A_0-A_1)\)


可以手动验证上述函数的正确性。

posted @ 2024-02-25 20:01  ckain  阅读(33)  评论(0)    收藏  举报