符号约定

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

对于 x∈IBx\in I_B,定义取位函数 bit⁡i(x)=⌊x/2i⌋ mod 2\operatorname{bit}_i(x)=\lfloor x/2^i\rfloor\bmod 2。

对于 x∈IB,x≠0x\in I_B,x\neq 0,定义最高位 h(x)=max⁡{i∣bit⁡i(x)=1}h(x)=\max\{i\mid \operatorname{bit}_i(x)=1\}。

对于 a1,a2,…,an∈IBa_1,a_2,\dots,a_n\in I_B,定义张成空间 span⁡{a1,a2,…,an}={⨁i∈Sai∣S⊆{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,…,bm∈IBb_1,b_2,\dots,b_m\in I_B,称它们线性无关,当且仅当对任意 S⊆{1,2,…,m}S\subseteq\{1,2,\dots,m\},若 ⨁i∈Sbi=0\bigoplus_{i\in S} b_i=0,则 S=∅S=\varnothing,这里约定空集的异或和为 00。

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

若 x∈IBx\in I_B,LL 是一个张成的空间,则称 x⊕L={x⊕ℓ∣ℓ∈L}x\oplus L=\{x\oplus \ell\mid \ell\in L\} 为 xx 关于 LL 的陪集。

贪心线性基

贪心线性基用 b0,b1,…,bB−1b_0,b_1,\dots,b_{B-1} 表示,若 bi=0b_i=0 表示 ii 位置没有向量,若 bi≠0b_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\},那么 {bi∣bi≠0}\{b_i\mid b_i\neq 0\} 是 LnL_n 的一组基:先证 {bi∣bi≠0}\{b_i\mid b_i\neq 0\} 线性无关,然后再证 LnB=span⁡{bi∣bi≠0}L_n^B=\operatorname{span}\{ b_i\mid b_i\neq 0\} 与 LnL_n 相等。

证明:

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

    设 S⊆TS\subseteq T 且 S≠∅S\neq \varnothing,设 j=max⁡Sj=\max S。

    那么对任意 i∈Si\in S 且 i≠ji\neq j,那么 h(bi)=i<jh(b_i)=i<j。

    于是 bit⁡j(bi)=0\operatorname{bit}_j(b_i)=0,那么 bit⁡j(⨁i∈Sbi)=⨁i∈Sbit⁡j(bi)=1\operatorname{bit}_j\left(\bigoplus_{i\in S} b_i\right)=\bigoplus_{i\in S}\operatorname{bit}_j(b_i)=1,所以 ⨁i∈Sbi≠0\bigoplus_{i\in S} b_i\neq 0。

    所以原命题成立。

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

    假设插入完前 k−1k-1 个数后成立,即 Lk−1=Lk−1BL_{k-1}=L_{k-1}^B。

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

    • 若插入失败,则最终 x=0x=0,所以 0∈ak⊕Lk−10\in a_k\oplus L_{k-1},从而 ak∈Lk−1a_k\in L_{k-1}。

      此时 LkB=Lk−1BL_k^B=L_{k-1}^B。根据定义,有 Lk−1⊆LkL_{k-1}\subseteq L_k;根据 ak∈Lk−1a_k\in L_{k-1},有 Lk⊆Lk−1L_{k}\subseteq L_{k-1},因此 Lk=Lk−1L_k=L_{k-1}。

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

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

      又因为 x∈ak⊕Lk−1x\in a_k\oplus L_{k-1},存在 ℓ∈Lk−1\ell\in L_{k-1} 使得 x=ak⊕ℓx=a_k\oplus \ell。

      这里 x=ak⊕ℓx=a_k\oplus \ell,ak∈Lka_k\in L_k 且 ℓ∈Lk−1⊆Lk\ell\in L_{k-1}\subseteq L_k,所以 x∈Lkx\in L_k;

      同时 ak=x⊕ℓa_k=x\oplus \ell,因为 x∈LkBx\in L_k^B 且 ℓ∈Lk−1B⊆LkB\ell \in L_{k-1}^B\subseteq L_k^B,所以 ak∈LkBa_k\in L_k^B。

      因为 Lk−1B=Lk−1⊆LkL_{k-1}^B=L_{k-1}\subseteq L_k,且 x∈Lkx\in L_k,所以 LkB⊆LkL_k^B\subseteq L_k;

      同时 Lk−1=Lk−1B⊆LkBL_{k-1}=L_{k-1}^B\subseteq L_k^B,且 ak∈LkBa_k\in L_k^B,所以 Lk⊆LkBL_{k}\subseteq L_{k}^B。

      因此 LkB=LkL_k^B=L_k。

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

规约

对于由线性基 {bi∣bi≠0}\{b_i\mid b_i\neq 0\} 张成的空间 LL,定义规约函数 R:IB→IBR:I_B\to I_B:从高到低枚举位 ii,若 bit⁡i(x)=1\operatorname{bit}_i(x)=1 且 bi≠0b_i\neq 0,那么令 x←x⊕bix\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) 是陪集 x⊕Lx\oplus L 中的最小元素:

证明:

  1. 设 R(x)=x⊕ℓ1R(x)=x\oplus \ell_1,其中 ℓ1∈L\ell_1\in L,那么任取 y∈x⊕Ly\in x\oplus L,存在一个 ℓ2∈L\ell_2\in L 使得 y=x⊕ℓ2y=x\oplus \ell_2。

    代换 xx,得到 y=R(x)⊕ℓ1⊕ℓ2y=R(x)\oplus \ell_1\oplus \ell_2。

    根据空间的性质,有 ℓ=ℓ1⊕ℓ2∈L\ell=\ell_1\oplus \ell_2\in L,即 y=R(x)⊕ℓy=R(x)\oplus \ell。

  2. 令 P={i∣bi≠0}P=\{i\mid b_i\neq 0\},设 ℓ=⨁i∈Sbi\ell=\bigoplus_{i\in S} b_i,其中 S⊆PS\subseteq P。

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

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

    若 S≠∅S\neq \varnothing,取 j=max⁡Sj=\max S,那么 bit⁡j(R(x)⊕ℓ)=1\operatorname{bit}_j(R(x)\oplus \ell)=1。

    同时,对于 k>jk>j,因为 ∀i∈S,i≤j<k\forall i\in S,i\le j<k,有 bit⁡k(bi)=0\operatorname{bit}_k(b_i)=0,那么 bit⁡k(R(x)⊕ℓ)=bit⁡k(R(x))\operatorname{bit}_k(R(x)\oplus \ell)=\operatorname{bit}_k(R(x))。

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

  3. 因此,∀y∈x⊕L,y≥R(x)\forall y\in x\oplus L,y\ge R(x)。

同理,如果规约函数 R′:IB→IBR':I_B\to I_B 的映射规则改为:从高到低枚举位 ii,若 bit⁡i(x)=0\operatorname{bit}_i(x)=0 且 bi≠0b_i\neq 0,那么令 x←x⊕bix\gets x\oplus b_i,最终值为 R′(x)R'(x),那么 R′(x)R'(x) 是陪集 x⊕Lx\oplus L 中的最大元素。


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

证明:

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

    又因为存在 ℓx,ℓy∈L\ell_x,\ell_y\in L,使得 R(x)=x⊕ℓx,R(y)=y⊕ℓyR(x)=x\oplus \ell_x,R(y)=y\oplus \ell_y。

    那么 R(x)⊕R(y)=x⊕y⊕(ℓx⊕ℓy)∈(x⊕y)⊕LR(x)\oplus R(y)=x\oplus y\oplus (\ell_x\oplus \ell_y)\in (x\oplus y)\oplus L。

    所以 R(x⊕y)≤R(x)⊕R(y)R(x\oplus y)\le R(x)\oplus R(y)。

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

    根据前文证明最小值的方法,就能得到 ∀z∈(x⊕y)⊕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(x⊕y)R(x)\oplus R(y)\le R(x\oplus y)。

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

标准化

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

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

具体地讲,对 i=0,1,…,B−1i=0,1,\dots,B-1,若 bi≠0b_i\neq 0,则从大到小枚举 jj,其中 j<ij<i,若 bit⁡j(bi)=1\operatorname{bit}_j(b_i)=1 且 bj≠0b_j\neq 0,令 bi←bi⊕bjb_i\gets b_i\oplus b_j。

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

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

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

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

Pb={i∣bi≠0},Pc={i∣ci≠0}P_b=\{i\mid b_i\neq 0\},\qquad P_c=\{i\mid c_i\neq 0\}

Lb=span⁡{bi∣i∈Pb},Lc=span⁡{ci∣i∈Pc}L_b=\operatorname{span} \{b_i\mid i\in P_b\},\qquad L_c=\operatorname{span}\{c_i\mid i\in P_c\}

那么

Lb=Lc⇔∀i∈{0,1,…,B−1},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)∣x∈Lb,x≠0}H_b=\{h(x)\mid x\in L_b, x\neq 0\},我们可以证明 Hb=PbH_b=P_b:

任取 h(x)∈Hbh(x)\in H_b,那么存在非空集合 S⊆PbS\subseteq P_b 使得 x=⨁i∈Sbix=\bigoplus_{i\in S} b_i,那么 h(x)=max⁡S∈Pbh(x)=\max S\in P_b;

反之,任取 i∈Pbi\in P_b,都有 bi∈Lbb_i\in L_b 使得 h(bi)=ih(b_i)=i,即 i∈Hbi\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。

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

∀q∈Pb,bit⁡q(bp)=bit⁡q(cp)={1,p=q0,p≠q\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=bp⊕cpz=b_p\oplus c_p,根据 Lb=LcL_b=L_c 和张成空间的封闭性,我们有 z∈Lbz\in L_b。

若 z≠0z\neq 0,那么 h(z)∈Hb=Pbh(z)\in H_b=P_b,又因为 ∀q∈Pb,bit⁡q(z)=0\forall q\in P_b,\operatorname{bit}_q(z)=0,矛盾,于是 z=0z=0。

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