用途
- FWT主要解决这样的问题,给出A(x),B(x),求 Ck=∑i⊗j=kAiBj C k = ∑ i ⊗ j = k A i B j ,其中 ⊗ ⊗ 表示and(按位与)/or(按位或)/xor(按位异或)运算中的一种。
定义
- 首先,A(x)可以表示成一个n维向量 (a0,a1,...,an−1) ( a 0 , a 1 , . . . , a n − 1 ) 。
- 定义向量间的加法为按位加,即: A(x)+B(x)=(a0+b0,a1+b1,...,an−1+bn−1) A ( x ) + B ( x ) = ( a 0 + b 0 , a 1 + b 1 , . . . , a n − 1 + b n − 1 ) 。
- 乘法亦为按位乘: A(x)B(x)=(a0b0,a1b1,...,an−1bn−1) A ( x ) B ( x ) = ( a 0 b 0 , a 1 b 1 , . . . , a n − 1 b n − 1 ) 。
- 记 A(x)⊗B(x)=C(x) A ( x ) ⊗ B ( x ) = C ( x ) ,C(x)即我们要求的n维向量。
- 不妨将n扩大为某个2的幂次,这样便方便定义:
A0(x)=(a0,a1,...,an/2−1),A1(x)=(an/2,...,an−2,an−1) A 0 ( x ) = ( a 0 , a 1 , . . . , a n / 2 − 1 ) , A 1 ( x ) = ( a n / 2 , . . . , a n − 2 , a n − 1 )
变换与逆变换
- 设若我们构造了一个变换tf(tf也是一个n维向量),满足当n=1时 tf(A)=a0 t f ( A ) = a 0 ,并且 tf(A)tf(B)=tf(C) t f ( A ) t f ( B ) = t f ( C ) ,且可在较短时间内进行变换tf及其逆变换utf,那么我们便可以搞事了。
- 并且,这个变换确实是存在的,不知道哪个大犇想出来的。
- 虽说不知道怎么想出来的,但证还是会证的,可以使用数学归纳法。
XOR
tf(A)=(tf(A0)+tf(A1),tf(A0)−tf(A1))
t
f
(
A
)
=
(
t
f
(
A
0
)
+
t
f
(
A
1
)
,
t
f
(
A
0
)
−
t
f
(
A
1
)
)
utf(A)=(utf(A0+A1)2,utf(A0−A1)2)
u
t
f
(
A
)
=
(
u
t
f
(
A
0
+
A
1
)
2
,
u
t
f
(
A
0
−
A
1
)
2
)
AND
tf(A)=(tf(A0)+tf(A1),tf(A1))
t
f
(
A
)
=
(
t
f
(
A
0
)
+
t
f
(
A
1
)
,
t
f
(
A
1
)
)
utf(A)=(utf(A0)−utf(A1),utf(A1))
u
t
f
(
A
)
=
(
u
t
f
(
A
0
)
−
u
t
f
(
A
1
)
,
u
t
f
(
A
1
)
)
OR
tf(A)=(tf(A0),tf(A1)+tf(A0))
t
f
(
A
)
=
(
t
f
(
A
0
)
,
t
f
(
A
1
)
+
t
f
(
A
0
)
)
utf(A)=(utf(A0),utf(A1)−utf(A0))
u
t
f
(
A
)
=
(
u
t
f
(
A
0
)
,
u
t
f
(
A
1
)
−
u
t
f
(
A
0
)
)
算法流程
- 至此,我们获悉了变换tf与逆变换utf的求法。
- 那么,我们可以先求出tf(A),再求出tf(B)。tf(A)的求法可以递归分治下去,递归到n=1的那一层就直接返回 ax a x 。时间复杂度是 O(nlog2n) O ( n l o g 2 n ) 的。
- 求完之后,两者相乘(按位乘)即为tf(C)。那么,直接套用逆变换, utf(tf(C))=C u t f ( t f ( C ) ) = C 。至于utf的计算,同样也是分治解决。