符号约定
下文固定正整数 B,一般取 60,同时定义 IB={0,1,…,2B−1}。
对于 x∈IB,定义取位函数 biti(x)=⌊x/2i⌋mod2。
对于 x∈IB,x=0,定义最高位 h(x)=max{i∣biti(x)=1}。
对于 a1,a2,…,an∈IB,定义张成空间 span{a1,a2,…,an}={⨁i∈Sai∣S⊆{1,2,…,n}}。
对于 b1,b2,…,bm∈IB,称它们线性无关,当且仅当对任意 S⊆{1,2,…,m},若 ⨁i∈Sbi=0,则 S=∅,这里约定空集的异或和为 0。
若 b1,b2,…,bm∈IB,若它们线性无关,且张成空间 L,则称它们是 L 的一组基。
若 x∈IB,L 是一个张成的空间,则称 x⊕L={x⊕ℓ∣ℓ∈L} 为 x 关于 L 的陪集。
贪心线性基
贪心线性基用 b0,b1,…,bB−1 表示,若 bi=0 表示 i 位置没有向量,若 bi=0 要求 h(bi)=i,并称 i 为一个主元位。
构建
插入算法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #define B 60 using ull = unsigned long long; ull b[B];
bool insert(ull x) { for (int i = B-1; i >= 0; i--) { if (x >> i & 1) { if (!b[i]) { b[i] = x; return true; } x ^= b[i]; } } return false; }
|
下面证明插入 a1,a2,…,an 后,令 Ln=span{a1,a2,…,an},那么 {bi∣bi=0} 是 Ln 的一组基:先证 {bi∣bi=0} 线性无关,然后再证 LnB=span{bi∣bi=0} 与 Ln 相等。
证明:
-
首先证明 {bi∣bi=0} 线性无关,令 T={i∣bi=0}
设 S⊆T 且 S=∅,设 j=maxS。
那么对任意 i∈S 且 i=j,那么 h(bi)=i<j。
于是 bitj(bi)=0,那么 bitj(⨁i∈Sbi)=⨁i∈Sbitj(bi)=1,所以 ⨁i∈Sbi=0。
所以原命题成立。
-
其次证明 LnB 与 Ln 相等。用数学归纳法证明:对任意 k,记 Lk=span{a1,a2,…,ak} 且 LkB 是插入完前 k 个数后的 span{bi∣bi=0},首先当 k=0 时显然成立。
假设插入完前 k−1 个数后成立,即 Lk−1=Lk−1B。
插入 ak 时,当前 x 初始为 ak。由于每个已有的 bi 都属于 Lk−1,每次执行 x←x⊕bi 后,当前 x 仍属于陪集 ak⊕Lk−1。
-
若插入失败,则最终 x=0,所以 0∈ak⊕Lk−1,从而 ak∈Lk−1。
此时 LkB=Lk−1B。根据定义,有 Lk−1⊆Lk;根据 ak∈Lk−1,有 Lk⊆Lk−1,因此 Lk=Lk−1。
由归纳假设得到 LkB=Lk。
-
若在第 i 位插入当前 x,则更高位已经被消去,且当前第 i 位为 1,所以 h(x)=i。
又因为 x∈ak⊕Lk−1,存在 ℓ∈Lk−1 使得 x=ak⊕ℓ。
这里 x=ak⊕ℓ,ak∈Lk 且 ℓ∈Lk−1⊆Lk,所以 x∈Lk;
同时 ak=x⊕ℓ,因为 x∈LkB 且 ℓ∈Lk−1B⊆LkB,所以 ak∈LkB。
因为 Lk−1B=Lk−1⊆Lk,且 x∈Lk,所以 LkB⊆Lk;
同时 Lk−1=Lk−1B⊆LkB,且 ak∈LkB,所以 Lk⊆LkB。
因此 LkB=Lk。
-
结合线性无关性,{bi∣bi=0} 是 Ln 的一组基。
规约
对于由线性基 {bi∣bi=0} 张成的空间 L,定义规约函数 R:IB→IB:从高到低枚举位 i,若 biti(x)=1 且 bi=0,那么令 x←x⊕bi,最终值为 R(x),代码如下:
1 2 3 4 5 6
| ull reduce_min(ull x) { for (int i = B-1; i >= 0; i--) { if (x >> i & 1) x ^= b[i]; } return x; }
|
下证 R(x) 是陪集 x⊕L 中的最小元素:
证明:
-
设 R(x)=x⊕ℓ1,其中 ℓ1∈L,那么任取 y∈x⊕L,存在一个 ℓ2∈L 使得 y=x⊕ℓ2。
代换 x,得到 y=R(x)⊕ℓ1⊕ℓ2。
根据空间的性质,有 ℓ=ℓ1⊕ℓ2∈L,即 y=R(x)⊕ℓ。
-
令 P={i∣bi=0},设 ℓ=⨁i∈Sbi,其中 S⊆P。
根据规约函数的定义,∀i∈P,biti(R(x))=0。
若 S=∅,那么 y=R(x);
若 S=∅,取 j=maxS,那么 bitj(R(x)⊕ℓ)=1。
同时,对于 k>j,因为 ∀i∈S,i≤j<k,有 bitk(bi)=0,那么 bitk(R(x)⊕ℓ)=bitk(R(x))。
综上所述,就得到了 y>R(x)。
-
因此,∀y∈x⊕L,y≥R(x)。
同理,如果规约函数 R′:IB→IB 的映射规则改为:从高到低枚举位 i,若 biti(x)=0 且 bi=0,那么令 x←x⊕bi,最终值为 R′(x),那么 R′(x) 是陪集 x⊕L 中的最大元素。
上面的证明实际上说明了:若某个元素属于该陪集,且所有主元位为 0,则它就是该陪集最小值。那么我们可以根据这个得到下面的定理:∀x,y∈IB,R(x⊕y)=R(x)⊕R(y)。
证明:
-
R(x⊕y) 是 (x⊕y)⊕L 中的最小元素。
又因为存在 ℓx,ℓy∈L,使得 R(x)=x⊕ℓx,R(y)=y⊕ℓy。
那么 R(x)⊕R(y)=x⊕y⊕(ℓx⊕ℓy)∈(x⊕y)⊕L。
所以 R(x⊕y)≤R(x)⊕R(y)。
-
又因为对任意主元位 i,都有 biti(R(x))=0 且 biti(R(y))=0,那么 biti(R(x)⊕R(y))=0。
根据前文证明最小值的方法,就能得到 ∀z∈(x⊕y)⊕L,有 R(x)⊕R(y)≤z。
所以 R(x)⊕R(y)≤R(x⊕y)。
-
因此 R(x)⊕R(y)=R(x⊕y)。
标准化
当需要比较两个空间是否相同时,我们需要对贪心得到的线性基进行标准化。
对应到线性代数的概念,贪心线性基实际上得到的是一个行阶梯矩阵,这里所谓标准化就是把这个行阶梯矩阵进一步化为行最简矩阵。
具体地讲,对 i=0,1,…,B−1,若 bi=0,则从大到小枚举 j,其中 j<i,若 bitj(bi)=1 且 bj=0,令 bi←bi⊕bj。
标准化后的贪心线性基张成空间和原空间相等:任意一次 bi←bi⊕bj 后,因为这两组基可以互相表示,那么张成空间相等。
注意,如果只是说“标准化基”,并不要求它是从贪心线性基得到,只要求下面的事情:
- 设 P 是主元位集合,那么 ∀i,j∈P,有 bitj(bi)=[i=j] 且 h(bi)=i,其中 [−] 是艾佛森括号。
还可以证明,两个空间相等当且仅当标准化基相等,形式化地,若 b0,b1,…,bB−1 和 c0,c1,…,cB−1 都是标准化基,令
Pb={i∣bi=0},Pc={i∣ci=0}
Lb=span{bi∣i∈Pb},Lc=span{ci∣i∈Pc}
那么
Lb=Lc⇔∀i∈{0,1,…,B−1},bi=ci
证明:
充分性显然,只证必要性。
我们希望证明 Pb=Pc,这里可以借助取最高位函数 h(x) 来做到这一点。
具体地讲,令 Hb={h(x)∣x∈Lb,x=0},我们可以证明 Hb=Pb:
任取 h(x)∈Hb,那么存在非空集合 S⊆Pb 使得 x=⨁i∈Sbi,那么 h(x)=maxS∈Pb;
反之,任取 i∈Pb,都有 bi∈Lb 使得 h(bi)=i,即 i∈Hb。
所以 Hb=Pb,同理 Hc=Pc,又因为 Lb=Lc,所以 Hb=Hc,就得到了 Pb=Pc。
现在任取 p∈Pb,我们希望证明 bp=cp。考虑这是一个标准化基,那么
∀q∈Pb,bitq(bp)=bitq(cp)={1,p=q0,p=q
令 z=bp⊕cp,根据 Lb=Lc 和张成空间的封闭性,我们有 z∈Lb。
若 z=0,那么 h(z)∈Hb=Pb,又因为 ∀q∈Pb,bitq(z)=0,矛盾,于是 z=0。
即对于所有的 p∈Pb,都有 bp=cp;对不在 Pb 中的下标,由定义有 bp=cp=0。