这篇文章要讨论的,是有关算法竞赛中的一个主题:线性基。我自己去认识、理解这个问题(指线性基求交),确实花了很大一番功夫。我将梳理我自己的思考认识,包括众多其他博客中所提到的、没提到的方方面面。
线性基
关于线性基是什么、如何构造线性基,相对比较容易理解,不是本文的重点。可以参考这篇博客。
线性空间
一个线性基所表征的线性空间是这个线性基能表示的所有数的集合。
线性基的交
设有三个线性基 A A A、 B B B、 C C C,如果它们所表征的线性空间的关系是: V A ∩ V B = V C V_A\cap V_B=V_C VA∩VB=VC,那么我们称 C C C是 A A A、 B B B的交。
线性无关
和线性代数中的概念类似:如果一组数(在异或意义上)线性无关,那么任意取这组数中的若干个,它们的异或和都不为0。
下面所说的“线性无关”,都指的是这个意思。
线性基的变换
设线性基 A = { a 1 , a 2 , . . . , a n } A=\{a_1,a_2,...,a_n\} A={ a1,a2,...,an},任取 i ≠ j i\neq j i=j,令 a i ′ = a i ⊕ a j a_i'=a_i\oplus a_j ai′=ai⊕aj,然后用 a i ′ a_i' ai′替换 A A A中的 a i a_i ai,那么替换后的 A A A与替换前等价。等价的含义是:变换之后,线性基的元素个数没有改变,并且所表征的线性空间没有变化。
因此,我们可以对一个线性基反复进行上述操作,结果始终都是与最初的线性基等价的。
线性基求交的方法
假设有线性基 A A A、 B B B,我们想求它们的交。首先,将 B B B变换到合适的等价形式 B ′ B' B′,使得 B ′ B' B′满足下列性质:
- 定义 W = { b ∣ b ∈ B ′ , b ∈ V A } W=\{b|b\in B' ,b\in V_A\} W={ b∣b∈B′,b∈VA}, B ′ − W = { b ∣ b ∈ B ′ , b ∉ V A } B'-W=\{ b|b\in B',b\notin V_A\} B′−W={ b∣b∈B′,b∈/VA}。
- ( B ′ − W ) ∪ A (B'-W)\cup A (B′−W)∪A线性无关(小提示:根据上面的定义,参与并操作的 B ′ − W B'-W B′−W与 A A A是没有相同元素的,所以并操作可以简单理解为把这两个集合中的元素都拿出来放到一起)。
那么, W W W即是线性基 A A A与 B B B的交。
理解这个方法有2个要点:第一,如何变换 B B B得到一个合适的 B ′ B' B′?甚至于这样的 B ′ B' B′是否存在?第二,为什么 W W W就是 A A A、 B B B的交?
上述方法的正确性
先假设,我们确实有一种方法,总是可以将 B B B变换到合适的 B ′ B' B′,然后我们考虑如何证明 W W W确实是 A A A与 B B