k 维 FWT。

k 维 FWT。

考虑到 FWT 运算过程的实质:

\(FWT(A)[i]=\sum_{j}w(i,j)A_j\)

我们要求 \(FWT(A)[i]·FWT(B)[i]=FWT(C)[i]\),令系数相等,也就是要求

\(\sum_{j,k}w(i,j)w(i,k)A_jB_k=\sum_{t}w(i,t)C_t=\sum_{t}w(i,t)\sum_{j\oplus k=t}A_jB_k\)

也即是 \(w(i,j)w(i,k)=w(i,t),j\oplus k=t\)

由于 \(\oplus\) 是一个位运算,因此不妨考虑按位构造 \(w(i,j)=w(i_0,j_0)w(i_1,j_1)\dots w(i_n,j_n)\),其中每一位的 \(w\) 是独立的。

注意到我们需要 \(IFWT\),也即是 \(w\) 矩阵是一个可逆矩阵,也即是 \(w\) 矩阵满秩。

对于二维的情况,例如

  • \(w(i,j)w(i,k)=w(i,j\&k)\),可以写作 \(w(i,j)=[i\&j=j]\),将其拆为二进制的每一位,也即是 \(w(0,0)=w(1,0)=w(1,1)=1,w(0,1)=0\)

  • \(w(i,j)w(i,k)=w(i,j\oplus k)\),可以写作 \(w(i,j)=(-1)^{popcnt(i\& j)}\),这是因为 \(popcnt(i\&j)+popcnt(i\&k) \equiv popcnt(i\&(j\oplus k))\)

    将其拆为二进制位,也即是 \(w(0,0)=w(0,1)=w(1,0)=1,w(1,1)=-1\)

对于更高维度的情况

  • 不妨定义 \(\&\) 为每个维度取 \(\min\) 之后的运算结果

    \(w(i,j)w(i,k)=w(i,j\&k)\),到每一位,也即是 \(w_t(i_t,j_t)w_t(i_t,k_t)=w_t(i_t,\min(j_t,k_t))\)

    可以构造矩阵(以三维为例)

    \(w_t(x,y)=[x\le y]\)

    当然分治的时候还是将其按照最高位的值拆掉,然后将仅最高位不同的这些位置拿出来乘 \(w_t\) 即可。

  • 定义高维异或指不进位加法

    \(w_t(i_t,j_t)w_t(i_t,k_t)=w_t(i_t,j_t+k_t\bmod K)\),其中 \(K\) 是维度。

    这令我们想到单位根,因为单位根有 \(w^n_n=1\) 的优雅性质。

    那么可以构造 \(w_t(i_t,j_t)=w^{j_t}_K\)

    但是这不能够满足有逆,所以考虑构造 \(w_t(i_t,j_t)=w_{K}^{i_tj_t}\)

    这个矩阵的逆?\(w^{-1}_t(i_t,j_t)=\frac{1}{K}w_t^{-i_tj_t}\)

    模意义下就是原根。

    因为 \(g^{P-1}\equiv 1\pmod P\),因此取 \(g^{\frac{P-1}{n}}\) 就可以了。

    注意要求 \(n|P-1\)

posted @ 2025-03-29 16:40  spdarkle  阅读(41)  评论(0)    收藏  举报