关于 FWT

首先, & , ∣ \&,| &, 卷积可以在 这里 找到
今天来说一说 ⨂ \bigotimes 卷积

问题:求 h k = ∑ i ⨂ j = k f j ∗ g k h_k=\sum_{i\bigotimes j=k} f_j*g_k hk=ij=kfjgk,其中 ⨂ \bigotimes 为不进位加法,在二进制中说的就是异或

首先我们有一个结论:

1 2 n ∑ T ( − 1 ) ∣ S ∩ T ∣ = [ S = ∅ ] \frac{1}{2^n}\sum_{T}(-1)^{|S\cap T|}=[S=\empty] 2n1T(1)ST=[S=]

证明:当 S = ∅ S=\empty S= 时,每一项的贡献都是 1 1 1
S ≠ ∅ S\neq \empty S= 时,对于一个 a ∈ S a\in S aS
考虑 ( − 1 ) ∣ S ∩ ( T ⊗ a ) ∣ = ( − 1 ) ( ∣ S ∩ T ) ⊗ a = − ( − 1 ) ∣ S ∩ T ∣ (-1)^{|S\cap (T\otimes a)|}=(-1)^{(|S\cap T)\otimes a}=-(-1)^{|S\cap T|} (1)S(Ta)=(1)(ST)a=(1)ST
所以有一一对应关系,于是上述式子为 0

考虑原式子
h k = ∑ i ∑ j [ i ⊗ j ⊗ k = ∅ ] f i ∗ g j h_k=\sum_i\sum_j[i\otimes j\otimes k=\empty ]f_i*g_j hk=ij[ijk=]figj
h k = 1 2 n ∑ i ∑ j ∑ T ( − 1 ) ∣ ( i ⊗ j ⊗ k ) ∩ T ∣ f i ∗ g j h_k=\frac{1}{2^n}\sum_i\sum_j\sum_{T}(-1)^{|(i\otimes j\otimes k)\cap T|}f_i*g_j hk=2n1ijT(1)(ijk)Tfigj
注意到这里是可以拆出来的
h k = 1 2 n ∑ i ∑ j ∑ T ( − 1 ) ∣ i ∩ T ∣ ( − 1 ) ∣ j ∩ T ∣ ( − 1 ) ∣ k ∩ T ∣ f i ∗ g j h_k=\frac{1}{2^n}\sum_i\sum_j\sum_{T}(-1)^{|i\cap T|}(-1)^{|j\cap T|}(-1)^{|k\cap T|}f_i*g_j hk=2n1ijT(1)iT(1)jT(1)kTfigj
h k = 1 2 n ∑ T ( − 1 ) ∣ k ∩ T ∣ ∑ i ( − 1 ) ∣ i ∩ T ∣ f i ∑ j ( − 1 ) ∣ j ∩ T ∣ g j h_k=\frac{1}{2^n}\sum_{T}(-1)^{|k\cap T|}\sum_i(-1)^{|i\cap T|}f_i\sum_j(-1)^{|j\cap T|}g_j hk=2n1T(1)kTi(1)iTfij(1)jTgj
我们令 f ^ S = ∑ T ( − 1 ) ∣ S ∩ T ∣ f T \hat f _S=\sum_{T}(-1)^{|S\cap T|}f_T f^S=T(1)STfT,g 同理,那么有
h k = 1 2 n ∑ T ( − 1 ) ∣ k ∩ T ∣ f ^ T ∗ g ^ T h_k=\frac{1}{2^n}\sum_{T}(-1)^{|k\cap T|}\hat f_T*\hat g_T hk=2n1T(1)kTf^Tg^T
注意到如果有
h ^ k = ∑ T ( − 1 ) ∣ k ∩ T ∣ h T \hat h_k=\sum_{T}(-1)^{|k\cap T|} h_T h^k=T(1)kThT
那么就有
h k = 1 2 n ∑ T ( − 1 ) ∣ k ∩ T ∣ h ^ T h_k=\frac{1}{2^n}\sum_{T}(-1)^{|k\cap T|}\hat h_T hk=2n1T(1)kTh^T
直接代入就可以证明
于是就有结论:
h ^ T = f ^ T ∗ g ^ T \hat h_T=\hat f_T*\hat g_T h^T=f^Tg^T
可以快速实现 “点值” 的乘法
于是现在的问题就是快速求
f ^ k = ∑ T ( − 1 ) ∣ k ∩ T ∣ f T \hat f_k=\sum_{T}(-1)^{|k\cap T|} f_T f^k=T(1)kTfT
我们按位从低到高来处理
f ( i ) f^{(i)} f(i) 为考虑到第 i i i 位的时候的结果,那么容易得到
f S ( i ) = f S ( i − 1 ) + f S ∪ { i } ( i − 1 ) f^{(i)}_S=f^{(i-1)}_S+f^{(i-1)}_{S\cup \{i\}} fS(i)=fS(i1)+fS{i}(i1)
f S ∪ { i } ( i ) = f S ( i − 1 ) − f S ∪ { i } ( i − 1 ) f^{(i)}_{S\cup \{i\}}=f^{(i-1)}_S-f^{(i-1)}_{S\cup \{i\}} fS{i}(i)=fS(i1)fS{i}(i1)
于是可以在 O ( n ∗ 2 n ) O(n*2^n) O(n2n) 的时间内实现


FWT 的另一种理解方式:

对于求 h k = ∑ i ⨂ j = k f j ∗ g k h_k=\sum_{i\bigotimes j=k} f_j*g_k hk=ij=kfjgk,其中 ⨂ \bigotimes 为不进位加法,是可以扩展到 k k k 进制的

我们考虑构造一个矩阵 A A A,满足 ( f ∗ A ) ∗ ( g ∗ A ) = ( h ∗ A ) (f*A)*(g*A)=(h*A) (fA)(gA)=(hA)
其中括号里面是向量乘矩阵,外面是向量的点乘
这样一来我们只需要对 f , g f,g f,g 进行变化,再乘上逆矩阵就可以了

不放令 x = ( x 0 x 1 . . . x m ) k x=(x_0x_1...x_m)_k x=(x0x1...xm)k,令 x ′ x' x x x x 的最高位, x ′ ′ x'' x x x x 去掉最高位后剩下的
那么我们可以构造另一个矩阵 B B B s . t . A x , y = ∏ B x i , y i s.t. A_{x,y}=\prod B_{x_i,y_i} s.t.Ax,y=Bxi,yi
考虑如果知道 B B B 如何求得 f ∗ A f*A fA
( f ∗ A ) [ x ] = ∑ i = 0 n − 1 f i A x , i (f*A)[x]=\sum_{i=0}^{n-1}f_iA_{x,i} (fA)[x]=i=0n1fiAx,i
= ∑ p = 0 k − 1 B x ′ , p ∑ i ′ = p f i ∗ A x ′ ′ , i ′ ′ =\sum_{p=0}^{k-1}B_{x',p}\sum_{i'=p}f_i*A_{x'',i''} =p=0k1Bx,pi=pfiAx,i
后面一坨可以继续分治求下去
于是 B B B 需要满足的性质,有
∑ i f i B x , i ∑ j g j B x , j = ∑ k h k B x , k \sum_i f_iB_{x,i}\sum_jg_jB_{x,j}=\sum_kh_kB_{x,k} ifiBx,ijgjBx,j=khkBx,k
如果有 f i ∗ g j ∗ ( i ⊗ j = k ) = h k f_i*g_j*(i\otimes j=k)=h_k figj(ij=k)=hk,那么有
B x , i B x , j = B x , k ( i ⊗ j = k ) B_{x,i}B_{x,j}=B_{x,k}(i\otimes j=k) Bx,iBx,j=Bx,k(ij=k)

B x , i B x , j = B x , k ( K ∣ i + j − k ) B_{x,i}B_{x,j}=B_{x,k}(K|i+j-k) Bx,iBx,j=Bx,k(Ki+jk)
B = 1 1 1 . . . 1 w K 1 w K 2 . . . 1 w K 2 w K 4 . . . . . . . . . . . . . . . 1 w K K − 1 w K 2 ∗ ( K − 1 ) . . . B=\begin{matrix} 1 & 1 & 1&... \\ 1 & w_K^1 & w_K^2 &...\\ 1 & w_K^2 & w_K^4 & ... \\ ... &...&...&...\\ 1 & w_K^{K-1} & w_K^{2*(K-1)} & ...\end{matrix} B=111...11wK1wK2...wKK11wK2wK4...wK2(K1)...............
f f t fft fft 的矩阵一样, 大概可以把 F W T FWT FWT 看做对每一位做了一遍循环卷积
二进制的时候:
B = 1 1 1 − 1 B=\begin{matrix} 1 & 1 \\ 1 & -1 \end{matrix} B=1111
这符合我们之前的推论


子集卷积
h k = ∑ i ∑ j [ i ∩ j = ∅ ] [ i ∪ j = k ] f i ∗ g j h_k=\sum_{i}\sum_{j}[i\cap j=\empty][i\cup j=k]f_i*g_j hk=ij[ij=][ij=k]figj
为了满足第一个限制,我们可以设置 n n n 个数组
i i i 个数组只有下标的 p o p c n t = i popcnt=i popcnt=i 的地方才有值
然后我们为满足第二个限制对每一个做一遍 F M T FMT FMT,两两相乘,累加到对应的 p o p c n t popcnt popcnt 数组中最后 I F M T IFMT IFMT 回去,复杂度 O ( n 2 ∗ 2 n ) O(n^2*2^n) O(n22n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值