定义
将 64 位二进制数看成长度 64 的 0/1 向量,那么异或就是在模 2 意义下的向量加法。
我们可以把给定的 m 个非零(下文解释)的数 {x1,x2,…,xm} 取出一组异或线性基 B={b1,b2,…,br},满足:
- 任何 xi 都可以被若干个 bj 的线性组合表示;
- 任何 bi 都不可以被若干个 bj(j=i) 的线性组合表示(线性无关)。
由于在模 2 意义下数字只有 0/1,所以这里的线性组合就表示 k1b1⊕k2b2⊕⋯⊕krbr,其中 ki∈{0,1}。
事实上,这就是线性代数中极大无关组的概念。对上面两条概念形式化地表示,就是:
- 对任意的 xi,存在一组 {kj} 使得 xi=⨁j=1rkjbj。
- 对任意的 bi,若 bi=⨁j=1rkjbj,必有 kj={1j=i0j=i。
对第二条性质,我们可以做出推论:对 B 的任意非空子集,它们的异或和不可能为 0。
证明考虑反证法,如果存在一组 {kj} 使得 ⨁j=1rkjbj=0 并且 kj 不全为 0,那么通过异或类似移项的操作,不妨设 k1=1,就会有 b1 可以被若干个 bj(j=1) 线性表示,与定义矛盾。
如果某个 xi=0,我们可以认为空集的异或和为 0,所以不管它。
构造方法
我们首先要证明,对异或线性基进行线性组合,这个线性基仍然线性无关。
反证法,假设 b1⊕(⨁j=2rkjbj) 可以被 bj(j=1) 线性表示,那么 b1 就通过移项被线性表示,与定义矛盾。
因此我们总可以让最大的那个 bi,假设它的最高位为 j,它通过和别的向量线性组合的方式,让第 j 位为 1 的向量有且只有 bi 一个。
这就导出了我们的贪心构造方法,初始状态下,最高位 i=0,1,…,63 为 1 的向量 vi 均不存在。
插入一个向量 x 时,贪心地从高位往低位遍历。假设当前遍历到第 i 位,若 xi=0,跳过;若 xi=1,且 vi 不存在,那么令 vi=x;否则,令 x←x⊕vi 消掉 x 的第 i 位。
如果循环结束仍然未被插入,说明 x 已经可以被当前的线性基表示出来,因为存在若干个数使得 x 异或它们为 0,移项即可得到 x 可以被若干个 vi 表示。