一、异或线性基
现在对于n个数字(下面称这n个数为原数集): a 1 , a 2 … … a n a_1,a_2……a_n a1,a2……an,找到一组数 p 1 , p 2 , . . . , p m p_1,p_2,...,p_m p1,p2,...,pm,可以用 p p p 中数的异或组合来表示 a a a中的数(即 p p p集合和 a a a集合通过异或出来的值域是一样的),那么称 p p p 就是 a a a 的一个线性基。
例如:
对于集合 A { 2 , 8 , 10 } A\ \{2,8,10\} A {
2,8,10},它的线性基就是 P { 2 , 8 } P\{2,8\} P{
2,8}。
因为 2 ( 2 ) = 10 , 8 ( 2 ) = 1000 2_{(2)}=10,8_{(2)}=1000 2(2)=10,8(2)=1000, 2 2 2 ^ 8 8 8 = 10 10 10 。
所以通过 P P P 中的元素异或,就可以直接得到 A A A 中的所有元素。
先说一说线性基有什么性质:
1.原数集中的任意一个数字都能够通过线性基中的元素异或出来(这与线性基的构建方式有关),同时也说明线性基不唯一。
2.原数集中的数字异或出来的值域与线性基中的元素以后出来的值域相等(通过上一条性质可知)。
3.线性基中没有异或和为零的非空子集:现在假设存在这样一个子集使得 b 1 , b 2 … … b x b1,b2……bx b1,b2……bx 的异或和为零,那么根据异或的性质能得出: b 1 = b 2 ⊕ b 3 ⊕ … … ⊕ b x b1=b2⊕b3⊕……⊕bx b1=b2⊕b3⊕……⊕bx,既然 b 1 b1 b1 已经能用除他之外的线性基元素表示出来,我们便没有必要再将 b 1 b1 b1 放在线性基中。
4.线性基中的选取元素的每一种方案,都对应一个异或值,不存在多种选取方案对应同一个异或值的情况:现在假设存在这种情况,那么我们就会存在一个非空子集的异或值为零,这与上一条性质矛盾。
5.线性基是满足以上性质的最小集合,即线性基中不存在任何一个多余的元素。
构造线性基
首先定义两个数组:
a [ i ] a[i] a[i] 是原数集 , p [ i ] p[i] p[i] 是在二进制中二进制位为 1 1 1 最高位为第 i i i 位的数。
对于 p [ i ] p[i] p[i]可能不好理解,举个例子: x = 3 x = 3 x=3,在二进制下 x = x = x=11,其二进制位为 1 最高位为第 1 位,所以
p [ 1 ] = 3 p[1] = 3 p[1]=3;
我们主要通过插入操作来实现线性基的构造如下:
令插入的数为 x x x,考虑 x x x 的二进制最高位 i i i,
- 若线性基的第 i i i 位为 0 0 0( p [ i ] = 0 p[i]=0 p[i]=0),则直接在该位插入 x x x,退出;
- 若线性基的第 i i i 位已经有值 a i a_i ai,则 x = x ⊕ a i x=x⊕a_i x=x⊕ai ,重复以上操作直到 x = 0 x=0 x=0
插入顺序的不同会导致线性基的不同。
举个例子,原数集 a { 2 , 8 , 10 } a\ \{2,8,10\} a {
2,8,10}
既然要异或,先将原数集变为二进制表示:
1 0 1 0 ( 10