FWT 快速沃尔什变换 学习笔记

数学

多项式

FWT

啊,跟着黄睿智学的,睿智好强啊。

睿智的参考链接

首先,FWT问题是什么:
已 知 A ( X ) 和 B ( X ) , 求 C [ i ] = ∑ i = j @ k A [ j ] ∗ B [ k ] 已知A(X)和B(X),求C[i] = \sum_{i=j@k}{}A[j]*B[k] A(X)B(X)C[i]=i=j@kA[j]B[k]
注意,中间是乘。@代表某个位运算。

这类问题就是操作涉及到下标的位,娜扎斑马?

我们想类似的多项式做法,FFT,FFT是找到一个方法(由系数表达法变为点至表示法),因为做一次FDFT之后, C [ i ] = A [ i ] ∗ B [ i ] C[i] = A[i]*B[i] C[i]=A[i]B[i]了。

在这里插入图片描述

(其实这有点拉格朗日差值的意思了。)

那FWT肯定也是要这样没错了。具体是要找到DFWT怎么做,也就是把A变成DFWT(A)应该怎么操作。

FFT中FDFT是按奇偶分类:

在这里插入图片描述

后面还用了单位复根,还挺难理解的……但是FWT比它要好理解!

FWT最重要的特点就是按位分类,同样是递归分类,那我们可以直接从高位到低位递归分类!把他们分成高位为1和高位为0的两部分:

A = { A 0 , A 1 } A=\{A_0,A_1\} A={A0A1} 其中 A 0 A_0 A0是最高位为0, A 1 A_1 A1反之。

那么 F ( A ) F(A) F(A)也分为两部分 F ( A ) = { K 1 A 0 + K 2 A 1 , K 3 A 0 + K 4 A 1 } F(A)= \{K1A_0+K2A_1,K3A_0+K4A_1\} F(A)={K1A0+K2A1,K3A0+K4A1}

那么 F ( A ∣ B ) = { K 1 ( A ∣ B ) 0 + K 2 ( A ∣ B ) 1 , K 3 ( A ∣ B ) 0 + K 4 ( A ∣ B ) 1 } F(A|B)= \{K1(A|B)_0+K2(A|B)_1,K3(A|B)_0+K4(A|B)_1\} F(AB)={K1(AB)0+K2(AB)1,K3(AB)0+K4(AB)1}

现在来考虑一下 ( A ∣ B ) 0 和 ( A ∣ B ) 1 (A|B)_0和(A|B)_1 (AB)0(AB)1

这里就显然 ( A ∣ B ) 0 = A 0 ∣ B 0 , ( A ∣ B ) 1 = A 1 ∣ B 0 + A 0 ∣ B 1 + A 1 ∣ B 1 (A|B)_0=A_0|B_0,(A|B)_1=A_1|B_0+A_0|B_1+A_1|B_1 (AB)0=A0B0(AB)1=A1B0+A0B1+A1B1

此时我们把推得的所有条件带入 F ( A ∣ B ) = F ( A ) ∗ F ( B ) F(A|B) = F(A)*F(B) F(AB)=F(A)F(B)

先看左半部分, K 1 ( A ∣ B ) 0 + K 2 ( A ∣ B ) 1 = ( K 1 A 0 + K 2 A 1 ) ∗ ( K 1 B 0 + K 2 B 1 ) K1(A|B)_0+K2(A|B)_1=(K1A_0+K2A_1)*(K1B_0+K2B_1) K1(AB)0+K2(AB)1=(K1A0+K2A1)(K1B0+K2B1)

左边带入,右边展开

K 1 ( A 0 ∣ B 0 ) + K 2 ( A 0 ∣ B 1 + A 1 ∣ B 0 + A 1 ∣ B 1 ) = K 1 2 A 0 ∣ B 0 + K 1 K 2 A 0 ∣ B 1 + K 1 K 2 A 1 ∣ B 0 + K 2 2 A 1 ∣ B 1 K1(A_0|B_0)+K2(A_0|B_1+A_1|B_0+A_1|B_1)=K1^2A_0|B_0+K1K2A_0|B1+K1K2A_1|B_0+K2^2A_1|B_1 K1(A0B0)+K2(A0B1+A1B0+A1B1)=K12A0B0+K1K2A0B1+K1K2A1B0+K22A1B1

K 1 ( A 0 ∣ B 0 ) + K 2 A 0 ∣ B 1 + K 2 A 1 ∣ B 0 + K 2 A 1 ∣ B 1 = K 1 2 A 0 ∣ B 0 + K 1 K 2 A 0 ∣ B 1 + K 1 K 2 A 1 ∣ B 0 + K 2 2 A 1 ∣ B 1 K1(A_0|B_0)+K2A_0|B_1+K2A_1|B_0+K2A_1|B_1=K1^2A_0|B_0+K1K2A_0|B1+K1K2A_1|B_0+K2^2A_1|B_1 K1(A0B0)+K2A0B1+K2A1B0+K2A1B1=K12A0B0+K1K2A0B1+K1K2A1B0+K22A1B1

得到方程组:
{ k 1 = k 1 2 k 2 = k 1 k 2 k 2 = k 2 2 \left\{\begin {matrix} k1=k1^2\\ k2=k1k2\\ k2=k2^2 \end{matrix}\right. k1=k12k2=k1k2k2=k22
k3,k4的推法一模一样。

方程组解得: ( k 1 , k 2 ) = ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , 1 ) (k1,k2)=(0,0),(1,0),(1,1) (k1,k2)=(0,0),(1,0),(1,1)

这时我们要选两个值作为(k1,k2),(k3,k4),选择的原则就是,不能选(0,0),不能选两个相同的点对。

现在我们选k1,k2为1,0,k3,k4为1,1

得到 F ( A ) = { A 0 , A 0 + A 1 } F(A)=\{A_0,A_0+A_1\} F(A)={A0,A0+A1}

然后递归构造就可以了。

我们把 k 1 , k 2 , k 3 , k 4 k1,k2,k3,k4 k1,k2,k3,k4构造成一个矩阵:
[ 1 0 1 1 ] \begin {bmatrix} 1 & 0 \\ 1 & 1 \end {bmatrix} [1101]
那么这就是做FDWT用到的矩阵,做FIDWT的时候就是求它的逆矩阵。

在这里插入图片描述
所以,上述矩阵的逆矩阵就是
[ 1 0 − 1 1 ] \begin {bmatrix} 1 & 0 \\ -1 & 1 \\ \end {bmatrix} [1101]
然后或运算的FWT就讲完了,&运算和^一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值