浅谈「正交线性基」:解决线性基求交和正交补空间的新利器

· · 算法·理论

0. 摘要

本篇文章源于笔者在役期间的偶然研究成果,希望用通俗的语言呈现线性基的一个变种——正交线性基,并以此解决一些经典问题。碍于学识问题,文中会存在不专业的术语及表达,敬请谅解。

1. 回顾

1.1 线性基

在算法竞赛中,线性基通常指 \mathbb{Z}_2^{n} 下的一组线性无关的向量,而向量用二进制数简易表示。原向量的二元运算能方便地迁移到数上来。

加法 (u + v)

即两个数各个位进行不进位加法,等价于异或运算。

内积 (u · v)

即两个数各个位相乘再累加,等价于 \text{popcount}(u\ \&\ v)_{} \bmod 2,该值为 0u,v 正交。因为是 \mathbb{Z}_2^{n},此处向量意义外的数应 \bmod\,2,下略。

显然,迁移后的定义仍然满足分配律:(u+v)·w=u·w+v·w

下文将用大写字母 (A,B,\ldots) 表示线性基,用 \text{span}(A) 表示线性基 A 张成的空间,即能用若干基的加法得到的数集。

高斯消元

针对线性基的高斯消元,目的在于使各个基的最高 1 位被各自独占,其余基的该位均为 0,以便解决诸如线性基第 k 大等问题。这些最高位称为关键位,其余位即非关键位

1.2 集合幂级数

集合幂级数可以简单理解成 [x^u] 指标 u\mathbb{Z}_2^{n} 下的向量、二进制数的多项式。

快速沃尔什变换 (FWT)

对于集合幂级数 F,记 \hat{F}=\text{FWT}[F]。由算法知,对于 F[x^u] 一项,若 u,w 正交,其对 \hat{F}[x^w] 一项贡献为正,否则为负,系数即 (-1)^{u·w}

FG 的异或卷积 H 时,我们对 \hat{F},\hat{G} 逐项相乘得到 \hat{H} 的本质是什么呢?考察 [x^{u}]F[x^{v}]G 变换到 [x^w] 相乘的情形,由分配律,新系数为 (-1)^{u·w}\times(-1)^{v·w}=(-1)^{(u+v)·w},恰好对应 [x^{u+v}]H 变换到 [x^w] 的系数。用分配律提取加法的思想在下文的证明中会再次出现。

2. 定义

正交线性基的定义可参照线性代数。对于 \mathbb{Z}_2^{n} 下秩为 k 的线性基 A,其正交线性基 A^{\perp} 满足 \text{span}(A^{\perp})\text{span}(A) 的正交补空间,也即,A^{\perp} 的秩为 n-kA 的基与 A^{\perp} 的基一定正交。

与原线性基相反,正交线性基的各个基一般按最低 1 位存储。

正交线性基的构造十分简单,先对 A 高斯消元得到 k 个关键位,A^{\perp}n-k 个正交基各自独占 n-k 个非关键位的 1,其中最低 1 位为第 i 位的正交基第 j 位为 1 当且仅当最高 1 位为第 j 位的原始基第 i 位为 1,类似转置。一种可行实现如下:

// Fennec's Algorithm
for (int i = n - 1; i >= 0; i--) {
    for (int j = i - 1; j >= 0; j--) {
        if (A[i] >> j & 1) { A[i] ^= A[j]; }
    }
}
for (int i = n - 1; i >= 0; i--) {
    if (A[i] == 0) {
        B[i] = 1 << i;
        for (int j = n - 1; j > i; j--) {
            if (A[j] >> i & 1) { B[i] |= 1 << j; }
        }
    }
}

构造算法时间复杂度为 O(n^2)。该算法笔者瞎起名为 \text{Fennec's Algorithm}(耳廓狐的算法),读者大可选择性忽略。

3. 应用

3.1 线性基求「点值」

同为异或相关算法,线性基、快速沃尔什变换先前很难建立起联系,而正交线性基恰巧提供了这个桥梁。

首先,我们不妨定义 \mathbb{Z}_2^{n} 下秩为 k 的线性基 A 的集合幂级数:若 u \in \text{span}(A),则 [x^u]A1,否则为 0。此时对 A\text{FWT} 获得的 \hat{A} 有何价值呢?

引理

对于 \mathbb{Z}_2^{n} 下的任意二进制数 w[x^w]\hat{A} 只可能等于 02^{k}

证明:由线性空间的加法封闭性知,A * A=A \times 2^k,那么 \hat{A} \times \hat{A}=\hat{A} \times 2^k,解得 [x^w]\hat{A} \in \{0,2^k\}

结论

证明:依然考虑 $\text{FWT}$ 的过程,$[x^u]A$ 对 $[x^w]\hat{A}$ 的贡献系数为 $(-1)^{u·w}$,所以 $[x^w]\hat{A}$ 等于 $2^k$ 一定是每个有值的 $[x^u]A$ 均满足 $u,w$ 正交,符合 $w$ 作为正交基的定义。再由分配律提取加法,上述的 $w$ 将构成 $\mathbb{Z}_2^{n}$ 的一个子空间。 综上,线性基的「点值」描述的正是其正交补,而 $A$ 与 $A^{\perp}$ 至少其一的秩小于等于 $\frac{n}{2}$,极大地优化了穷举的时间。在笔者命制的 [CF1336E2 Chiori and Doll Picking (hard version)](https://codeforces.com/contest/1336/problem/E2) 中,便需要利用以上性质解题。 ### 3.2 线性基求交 目前流行的线性基求交算法比较晦涩,且不便于推广。下面将给出基于正交线性基,时间复杂度同为 $O(n^2)$ 的求交算法。 #### 结论 $A\cap B=(A^{\perp}+B^{\perp})^{\perp}$(其中 $+$ 表示两个线性基合并) 证明:可沿用线性代数中的证明。不过,笔者更倾向于结合 3.1 的内容。注意到 $A,B$ 作为集合幂级数时的异或卷积给出的是 $A+B$,而 $\hat{A},\hat{B}$ 逐位相乘求的正是 $A^{\perp} \cap B^{\perp}$,前后等价。反过来理解即可。 因此,对多个线性基求交,等价于合并它们的正交线性基后正交回来。 #### 例题 [UOJ698 【候选队互测2022】枪打出头鸟](https://uoj.ac/problem/698) 只需维护各下标的正交线性基,倒过来合并即可,用 [CF1100F Ivan and Burgers](https://codeforces.com/contest/1100/problem/F) 的 trick 实现「可持久化」。 询问时无需正交回来,直接在正交意义下求解。对于数 $x$ 和位置下标为 $i$ 的基 $u$,仅当 $x,u$ 不正交 ($x·u \neq 0$) 时用 $i$ 更新答案。 时间复杂度为 $O(n \log^2 W+q\log W)$。 #### 例题 [Gym104160M Vulpecula](https://codeforces.com/gym/104160/problem/M) 上题的树上邻域加强版。同样采用正交线性基,但要自下而上、自上而下两次合并。 统计时直接在正交意义下从高位到低位贪心,所有关键位(对原线性基而言)全部置 $1$,非关键位根据如何使其与当前最大值正交来定。 时间复杂度为 $O(n \log^2 W)$。 --- ## 4. 参考文献 [线性基 - OI Wiki](https://oi-wiki.org/math/linear-algebra/basis/)