数学
多项式
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@k∑A[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={A0,A1} 其中 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(A∣B)={K1(A∣B)0+K2(A∣B)1,K3(A∣B)0+K4(A∣B)1}
现在来考虑一下 ( A ∣ B ) 0 和 ( A ∣ B ) 1 (A|B)_0和(A|B)_1 (A∣B)0和(A∣B)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 (A∣B)0=A0∣B0,(A∣B)1=A1∣B0+A0∣B1+A1∣B1
此时我们把推得的所有条件带入 F ( A ∣ B ) = F ( A ) ∗ F ( B ) F(A|B) = F(A)*F(B) F(A∣B)=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(A∣B)0+K2(A∣B)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(A0∣B0)+K2(A0∣B1+A1∣B0+A1∣B1)=K12A0∣B0+K1K2A0∣B1+K1K2A1∣B0+K22A1∣B1
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(A0∣B0)+K2A0∣B1+K2A1∣B0+K2A1∣B1=K12A0∣B0+K1K2A0∣B1+K1K2A1∣B0+K22A1∣B1
得到方程组:
{
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}
[1−101]
然后或运算的FWT就讲完了,&运算和^一样。