符号约定

下文固定正整数 BB,一般取 6060,同时定义 IB={0,1,,2B1}I_B=\{0,1,\dots,2^B-1\}

对于 xIBx\in I_B,定义取位函数 biti(x)=x/2imod2\operatorname{bit}_i(x)=\lfloor x/2^i\rfloor\bmod 2

对于 xIB,x0x\in I_B,x\neq 0,定义最高位 h(x)=max{ibiti(x)=1}h(x)=\max\{i\mid \operatorname{bit}_i(x)=1\}

对于 a1,a2,,anIBa_1,a_2,\dots,a_n\in I_B,定义张成空间 span{a1,a2,,an}={iSaiS{1,2,,n}}\operatorname{span}\{a_1,a_2,\dots,a_n\}=\left\{\bigoplus_{i\in S} a_i\mid S\subseteq \{1,2,\dots,n\}\right\}

对于 b1,b2,,bmIBb_1,b_2,\dots,b_m\in I_B,称它们线性无关,当且仅当对任意 S{1,2,,m}S\subseteq\{1,2,\dots,m\},若 iSbi=0\bigoplus_{i\in S} b_i=0,则 S=S=\varnothing,这里约定空集的异或和为 00

b1,b2,,bmIBb_1,b_2,\dots,b_m\in I_B,若它们线性无关,且张成空间 LL,则称它们是 LL 的一组基。

xIBx\in I_BLL 是一个张成的空间,则称 xL={xL}x\oplus L=\{x\oplus \ell\mid \ell\in L\}xx 关于 LL 的陪集。

贪心线性基

贪心线性基用 b0,b1,,bB1b_0,b_1,\dots,b_{B-1} 表示,若 bi=0b_i=0 表示 ii 位置没有向量,若 bi0b_i\neq 0 要求 h(bi)=ih(b_i)=i,并称 ii 为一个主元位。

构建

插入算法如下:

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,,ana_1,a_2,\dots,a_n 后,令 Ln=span{a1,a2,,an}L_n=\operatorname{span}\{a_1,a_2,\dots,a_n\},那么 {bibi0}\{b_i\mid b_i\neq 0\}LnL_n 的一组基:先证 {bibi0}\{b_i\mid b_i\neq 0\} 线性无关,然后再证 LnB=span{bibi0}L_n^B=\operatorname{span}\{ b_i\mid b_i\neq 0\}LnL_n 相等。

证明

  1. 首先证明 {bibi0}\{b_i\mid b_i\neq 0\} 线性无关,令 T={ibi0}T=\{i\mid b_i\neq 0\}

    STS\subseteq TSS\neq \varnothing,设 j=maxSj=\max S

    那么对任意 iSi\in Siji\neq j,那么 h(bi)=i<jh(b_i)=i<j

    于是 bitj(bi)=0\operatorname{bit}_j(b_i)=0,那么 bitj(iSbi)=iSbitj(bi)=1\operatorname{bit}_j\left(\bigoplus_{i\in S} b_i\right)=\bigoplus_{i\in S}\operatorname{bit}_j(b_i)=1,所以 iSbi0\bigoplus_{i\in S} b_i\neq 0

    所以原命题成立。

  2. 其次证明 LnBL_{n}^BLnL_n 相等。用数学归纳法证明:对任意 kk,记 Lk=span{a1,a2,,ak}L_k=\operatorname{span}\{a_1,a_2,\dots,a_k\}LkBL_k^B 是插入完前 kk 个数后的 span{bibi0}\operatorname{span}\{b_i\mid b_i\neq 0\},首先当 k=0k=0 时显然成立。

    假设插入完前 k1k-1 个数后成立,即 Lk1=Lk1BL_{k-1}=L_{k-1}^B

    插入 aka_k 时,当前 xx 初始为 aka_k。由于每个已有的 bib_i 都属于 Lk1L_{k-1},每次执行 xxbix\gets x\oplus b_i 后,当前 xx 仍属于陪集 akLk1a_k\oplus L_{k-1}

    • 若插入失败,则最终 x=0x=0,所以 0akLk10\in a_k\oplus L_{k-1},从而 akLk1a_k\in L_{k-1}

      此时 LkB=Lk1BL_k^B=L_{k-1}^B。根据定义,有 Lk1LkL_{k-1}\subseteq L_k;根据 akLk1a_k\in L_{k-1},有 LkLk1L_{k}\subseteq L_{k-1},因此 Lk=Lk1L_k=L_{k-1}

      由归纳假设得到 LkB=LkL_k^B=L_k

    • 若在第 ii 位插入当前 xx,则更高位已经被消去,且当前第 ii 位为 11,所以 h(x)=ih(x)=i

      又因为 xakLk1x\in a_k\oplus L_{k-1},存在 Lk1\ell\in L_{k-1} 使得 x=akx=a_k\oplus \ell

      这里 x=akx=a_k\oplus \ellakLka_k\in L_kLk1Lk\ell\in L_{k-1}\subseteq L_k,所以 xLkx\in L_k

      同时 ak=xa_k=x\oplus \ell,因为 xLkBx\in L_k^BLk1BLkB\ell \in L_{k-1}^B\subseteq L_k^B,所以 akLkBa_k\in L_k^B

      因为 Lk1B=Lk1LkL_{k-1}^B=L_{k-1}\subseteq L_k,且 xLkx\in L_k,所以 LkBLkL_k^B\subseteq L_k

      同时 Lk1=Lk1BLkBL_{k-1}=L_{k-1}^B\subseteq L_k^B,且 akLkBa_k\in L_k^B,所以 LkLkBL_{k}\subseteq L_{k}^B

      因此 LkB=LkL_k^B=L_k

  3. 结合线性无关性,{bibi0}\{b_i\mid b_i\neq 0\}LnL_n 的一组基。

规约

对于由线性基 {bibi0}\{b_i\mid b_i\neq 0\} 张成的空间 LL,定义规约函数 R:IBIBR:I_B\to I_B:从高到低枚举位 ii,若 biti(x)=1\operatorname{bit}_i(x)=1bi0b_i\neq 0,那么令 xxbix\gets x\oplus b_i,最终值为 R(x)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]; // 实际上可以不判 b[i] != 0, 不影响答案
}
return x;
}

下证 R(x)R(x) 是陪集 xLx\oplus L 中的最小元素:

证明

  1. R(x)=x1R(x)=x\oplus \ell_1,其中 1L\ell_1\in L,那么任取 yxLy\in x\oplus L,存在一个 2L\ell_2\in L 使得 y=x2y=x\oplus \ell_2

    代换 xx,得到 y=R(x)12y=R(x)\oplus \ell_1\oplus \ell_2

    根据空间的性质,有 =12L\ell=\ell_1\oplus \ell_2\in L,即 y=R(x)y=R(x)\oplus \ell

  2. P={ibi0}P=\{i\mid b_i\neq 0\},设 =iSbi\ell=\bigoplus_{i\in S} b_i,其中 SPS\subseteq P

    根据规约函数的定义,iP,biti(R(x))=0\forall i\in P,\operatorname{bit}_i(R(x))=0

    S=S=\varnothing,那么 y=R(x)y=R(x)

    SS\neq \varnothing,取 j=maxSj=\max S,那么 bitj(R(x))=1\operatorname{bit}_j(R(x)\oplus \ell)=1

    同时,对于 k>jk>j,因为 iS,ij<k\forall i\in S,i\le j<k,有 bitk(bi)=0\operatorname{bit}_k(b_i)=0,那么 bitk(R(x))=bitk(R(x))\operatorname{bit}_k(R(x)\oplus \ell)=\operatorname{bit}_k(R(x))

    综上所述,就得到了 y>R(x)y>R(x)

  3. 因此,yxL,yR(x)\forall y\in x\oplus L,y\ge R(x)

同理,如果规约函数 R:IBIBR':I_B\to I_B 的映射规则改为:从高到低枚举位 ii,若 biti(x)=0\operatorname{bit}_i(x)=0bi0b_i\neq 0,那么令 xxbix\gets x\oplus b_i,最终值为 R(x)R'(x),那么 R(x)R'(x) 是陪集 xLx\oplus L 中的最大元素。


上面的证明实际上说明了:若某个元素属于该陪集,且所有主元位为 00,则它就是该陪集最小值。那么我们可以根据这个得到下面的定理:x,yIB,R(xy)=R(x)R(y)\forall x,y\in I_B,R(x\oplus y)=R(x)\oplus R(y)

证明

  1. R(xy)R(x\oplus y)(xy)L(x\oplus y)\oplus L 中的最小元素。

    又因为存在 x,yL\ell_x,\ell_y\in L,使得 R(x)=xx,R(y)=yyR(x)=x\oplus \ell_x,R(y)=y\oplus \ell_y

    那么 R(x)R(y)=xy(xy)(xy)LR(x)\oplus R(y)=x\oplus y\oplus (\ell_x\oplus \ell_y)\in (x\oplus y)\oplus L

    所以 R(xy)R(x)R(y)R(x\oplus y)\le R(x)\oplus R(y)

  2. 又因为对任意主元位 ii,都有 biti(R(x))=0\operatorname{bit}_i(R(x))=0biti(R(y))=0\operatorname{bit}_i(R(y))=0,那么 biti(R(x)R(y))=0\operatorname{bit}_i(R(x)\oplus R(y))=0

    根据前文证明最小值的方法,就能得到 z(xy)L\forall z\in (x\oplus y)\oplus L,有 R(x)R(y)zR(x)\oplus R(y)\le z

    所以 R(x)R(y)R(xy)R(x)\oplus R(y)\le R(x\oplus y)

  3. 因此 R(x)R(y)=R(xy)R(x)\oplus R(y)=R(x\oplus y)

标准化

当需要比较两个空间是否相同时,我们需要对贪心得到的线性基进行标准化。

对应到线性代数的概念,贪心线性基实际上得到的是一个行阶梯矩阵,这里所谓标准化就是把这个行阶梯矩阵进一步化为行最简矩阵。

具体地讲,对 i=0,1,,B1i=0,1,\dots,B-1,若 bi0b_i\neq 0,则从大到小枚举 jj,其中 j<ij<i,若 bitj(bi)=1\operatorname{bit}_j(b_i)=1bj0b_j\neq 0,令 bibibjb_i\gets b_i\oplus b_j

标准化后的贪心线性基张成空间和原空间相等:任意一次 bibibjb_i\gets b_i\oplus b_j 后,因为这两组基可以互相表示,那么张成空间相等。

注意,如果只是说“标准化基”,并不要求它是从贪心线性基得到,只要求下面的事情:

  • PP 是主元位集合,那么 i,jP\forall i,j \in P,有 bitj(bi)=[i=j]\operatorname{bit}_j(b_i)=[i=j]h(bi)=ih(b_i)=i,其中 [][-] 是艾佛森括号。

还可以证明,两个空间相等当且仅当标准化基相等,形式化地,若 b0,b1,,bB1b_0,b_1,\dots,b_{B-1}c0,c1,,cB1c_0,c_1,\dots,c_{B-1} 都是标准化基,令

Pb={ibi0},Pc={ici0}P_b=\{i\mid b_i\neq 0\},\qquad P_c=\{i\mid c_i\neq 0\}

Lb=span{biiPb},Lc=span{ciiPc}L_b=\operatorname{span} \{b_i\mid i\in P_b\},\qquad L_c=\operatorname{span}\{c_i\mid i\in P_c\}

那么

Lb=Lci{0,1,,B1},bi=ciL_b=L_c\Leftrightarrow \forall i\in\{0,1,\dots,B-1\}, b_i=c_i

证明

充分性显然,只证必要性。

我们希望证明 Pb=PcP_b=P_c,这里可以借助取最高位函数 h(x)h(x) 来做到这一点。

具体地讲,令 Hb={h(x)xLb,x0}H_b=\{h(x)\mid x\in L_b, x\neq 0\},我们可以证明 Hb=PbH_b=P_b

任取 h(x)Hbh(x)\in H_b,那么存在非空集合 SPbS\subseteq P_b 使得 x=iSbix=\bigoplus_{i\in S} b_i,那么 h(x)=maxSPbh(x)=\max S\in P_b

反之,任取 iPbi\in P_b,都有 biLbb_i\in L_b 使得 h(bi)=ih(b_i)=i,即 iHbi\in H_b

所以 Hb=PbH_b=P_b,同理 Hc=PcH_c=P_c,又因为 Lb=LcL_b=L_c,所以 Hb=HcH_b=H_c,就得到了 Pb=PcP_b=P_c

现在任取 pPbp\in P_b,我们希望证明 bp=cpb_p=c_p。考虑这是一个标准化基,那么

qPb,bitq(bp)=bitq(cp)={1,p=q0,pq\forall q\in P_b,\operatorname{bit}_q(b_p)=\operatorname{bit}_q(c_p)=\begin{cases} 1,\quad p=q\\ 0,\quad p\neq q \end{cases}

z=bpcpz=b_p\oplus c_p,根据 Lb=LcL_b=L_c 和张成空间的封闭性,我们有 zLbz\in L_b

z0z\neq 0,那么 h(z)Hb=Pbh(z)\in H_b=P_b,又因为 qPb,bitq(z)=0\forall q\in P_b,\operatorname{bit}_q(z)=0,矛盾,于是 z=0z=0

即对于所有的 pPbp\in P_b,都有 bp=cpb_p=c_p;对不在 PbP_b 中的下标,由定义有 bp=cp=0b_p=c_p=0