线性基学习笔记
前言: 即西安区域赛A爆炸以后,觉得高斯消元这东西的没学好。耐下性子来读了些东西,总结如下
概述
基(basis)是线性代数中的一个概念,它是描述、刻画向量空间的基本工具。而在现行的 OI 题目中,通常在利用基在异或空间中的一些特殊性质来解决题目,而这一类题目所涉及的知识点被称作「线性基」。
预备知识
这里有一些线性代数的基本知识,以便更好的理解基的概念。
向量空间(vector space)
定义
(F,V,+,⋅)
为向量空间(vector space),其中
F
为域,
线性无关(linearly independent)
对于向量空间中
V
上
a1v1+a2v2+…+anvn=0 ,
则称这 n 个向量线性相关(linearly dependent),否则称为线性无关(linearly independent)。
线性组合(linear combination)
对于向量空间中
a1v1+a2v2+…+anvn ,
其中 a1,…,an∈F 。
一组向量线性无关 ⇔ 没有向量可用有限个其他向量的线性组合所表示
张成(span)
对于向量空间中
V
上
基(basis)
若向量空间
V
中向量组
B 中的元素称为基向量。如果基中元素个数有限,就称向量空间为有限维向量空间,将元素的个数称作向量空间的维数。
性质
设
B
是向量空间
V
的基。则
-
V
是
B 的极小生成集,就是说只有 B 能张成 V ,而它的任何真子集都不张成全部的向量空间。 B 是 V 中线性无关向量的极大集合,就是说B 在 V 中是线性无关集合,而且V 中没有其他线性无关集合包含它作为真子集。-
V
中所有的向量都可以按唯一的方式表达为
B 中向量的线性组合。
第三点尤其重要,感性的理解,基就是向量空间中的一个子集,它可以通过唯一的线性组合,来张成向量空间中所有的向量,这样就可以大大的缩小我们向量空间的大小。
线性相关性引理(Linear Dependent Lemma)
如果
(v1,…,vn)
在
V
中是线性相关的,并且
- vj∈span(v1,…,vj−1) ;
- 如果从
(v1,…,vn)
去掉第
j
项,则剩余向量组的张成仍然等于
span(v1,…,vn) 。
证明:设
(v1,…,vn)
在
V
中是线性相关的,并且
a1v1+…+amvm=0
a2,a3,…,an
不会全为
0
(因为
vj=−a1ajv1−…−aj−1ajvj−1
这就有 (1) 成立。
为了证明 (2) ,设 u∈span(v1,…,vn) ,则存在 c1,…,cn∈F ,使得
u=c1v1+…+cnvn
在上面的等式中,可以用之前的等式右边来代替
vj
。这样
u
包含于从
(v0,…,vn)
去掉第
j
项的张成,因而
ACM 中的线性基
异或运算下的基
求法
对于数
a0,a1,…,an
,将
ai
的二进制表示
(bm…b0)2
看作一个向量
ai=(bm,…,b0)
,为了叙述上的方便,下文称向量
ai
的第
j
位为
向量组 a1,…,an 可以张成一个向量集合 span(a1,…,an) ,加上我们的异或运算和乘法运算(显然满足 8 条公理),即可形成一个向量空间 V=({0,1},span(a1,…,an),⊕,⋅) 。
我们考虑求出向量空间
V
的一个基
第 1 步:如果
a1=0
,则从
B
中去掉
a1
,否则保持
B
不变。
第 j 步:若
aj∈span(a1,…,aj−1)
,则从
B
中去掉
aj
,否则保持
B
不变。
经过
n
步后终止程序,得到一个向量组
利用高斯消元来判断向量能否被前面的向量张成,就可以写出下面的程序:
void cal() {
for (int i = 0; i < n; ++i)
for (int j = MAX_BASE; j >= 0; --j)
if (a[i] >> j & 1) {
if (b[j]) a[i] ^= b[j];
else {
b[j] = a[i];
for (int k = j - 1; k >= 0; --k) if (b[k] && (b[j] >> k & 1)) b[j] ^= b[k];
for (int k = j + 1; k <= MAX_BASE; ++k) if (b[k] >> j & 1) b[k] ^= b[j];
break;
}
}
这个程序实现的非常精妙,我们每次维护一个对角矩阵。执行到第
如果一个向量 ai 能被 a1,…,ai−1 张成 ,它不应添加进 B ,在高斯消元的过程中它必然是已经存在的行向量的线性组合,所以这个方程实际上是多余的,它最后一定会被异或为一个 0 。反之如果向量 ai 不能被 a1,…,ai−1 张成,那么它一定能找到某一个行添加进去。
我们来模拟下这个过程, n=5,a={7,1,4,3,5} 。一开始矩阵是这样的:
⎡⎣⎢000000000⎤⎦⎥
加入 7=(111)2 ,矩阵变为:
⎡⎣⎢100100100⎤⎦⎥
加入 1=(001)2 ,添加到最后一行,同时为了维护对角矩阵,消去第一行的最低位,矩阵变为:
⎡⎣⎢100100001⎤⎦⎥
加入 4=(100)2 ,由于第一行已经有数了,它被异或为 (010)2 ,加入第二行,同时为了维护对角矩阵,消去第一行的第二位,矩阵变为:
⎡⎣⎢100010001⎤⎦⎥
剩下的数都加不上了。
这样所有被选上的
ai
构成一个向量空间
V
的一个基
大家所称的「线性基」一般都指这个方式得到的基,因为这个基具有一个独特的性质,可以应用到 OI 题目中。所以我们一般谈论的线性基,特指高斯消元解出的对角矩阵的非零行构成的向量组。
性质
对于最后得到的矩阵,如果第
对于任意存在于线性基的二进制位 i ,至多只有一个
bj 满足第 i 位为1 。
证明:高斯消元的过程中,我们维护了一个对角矩阵,如果二进制位
i
存在于一个向量
自然,对于不在线性基中的二进制位
i
,那么第
注意
上述高斯消元过程是消成了一个对角矩阵,如果消成上三角矩阵,虽然不具备这个性质,但是仍然能知道那些二进制位 i <script type="math/tex" id="MathJax-Element-156">i</script> 存在于线性基中,有时为了代码的简便,只消成上三角矩阵。下文不做区分,请自行判断。