(转+原)线性基学习总结(详)
概述
基(basis是线性代数中的一个概念,它是描述、刻画向量空间的基本工具。而在现行的 OI 题目中,通常在利用基在异或空间中的一些特殊性质来解决题目,而这一类题目所涉及的知识点被称作「线性基」。
预备知识
向量空间(vector space)
定义 ( F , V , + , ⋅ ) ( F , V , + , ⋅ ) ( F , V , + , ⋅ ) (F,V,+,⋅)(F, V, +, \cdot)(F,V,+,⋅) (F,V,+,⋅)(F,V,+,⋅)(F,V,+,⋅) 为向量空间(vector space),其中 F F F为域, V V V 为集合, V V V 中元素称为向量, + + + 为向量加法, ⋅ \cdot ⋅ 为标量乘法,且运算满足 8 条公理(见维基百科)。
线性无关(linearly independent)
对于向量空间中
V
V
V上
n
n
n 个元素的向量组
(
v
1
,
…
,
v
n
)
(\mathbf{v}_1, \ldots, \mathbf{v}_n)
(v1,…,vn),若存在不全为
0
0
0的数
a
i
∈
F
a_i∈F
ai∈F,满足
a
1
v
1
+
a
2
v
2
+
…
+
a
n
v
n
=
0
a_1v_1+a_2v_2+…+a_nv_n=0
a1v1+a2v2+…+anvn=0
则称这
n
n
n个向量线性相关(linearly dependent),否则称为线性无关(linearly independent)。
线性组合(linear combination)
线性组合 - 维基百科
对于向量空间中
V
V
V上
n
n
n个元素的向量组
(
v
1
,
…
,
v
n
)
(\mathbf{v}_1, \ldots, \mathbf{v}_n)
(v1,…,vn),其线性组合(linear combination是如下形式的向量
a
1
v
1
+
a
2
v
2
+
…
+
a
n
v
n
a1v1+a2v2+…+anvn
a1v1+a2v2+…+anvn
其中
a
1
,
…
,
a
n
∈
F
a_1, \ldots, a_n∈F
a1,…,an∈F。
一组向量线性无关 ⇔ \Leftrightarrow ⇔ 没有向量可用有限个其他向量的线性组合所表示
张成(span)
对于向量空间中 V V V上 n n n个元素的向量组 ( v 1 , … , v n ) (\mathbf{v}_1, \ldots, \mathbf{v}_n) (v1,…,vn),其所有线性组合所构成的集合称为 ( v 1 , … , v n ) (\mathbf{v}_1, \ldots, \mathbf{v}_n) (v1,…,vn) 的张成(span),记为 s p a n ( v 1 , … , v n ) \mathrm{span}(\mathbf{v}_1, \ldots, \mathbf{v}_n) span(v1,…,vn)。
基(basis)
若向量空间 V V V中向量组 B \mathfrak {B} B既是线性无关的又可以张成 V V V,则称其为 V V V的基(basis)。
B \mathfrak {B} B中的元素称为基向量。如果基中元素个数有限,就称向量空间为有限维向量空间,将元素的个数称作向量空间的维数。
性质
设 B \mathfrak {B} B 是向量空间 V V V 的基。则 B \mathfrak {B} B具有以下性质:
- V V V 是 B \mathfrak {B} B 的极小生成集,就是说只有 B \mathfrak {B} B 能张成 V V V,而它的任何真子集都不张成全部的向量空间。
- B \mathfrak {B} B 是 V V V 中线性无关向量的极大集合,就是说 B \mathfrak {B} B 在 V V V 中是线性无关集合,而且 V V V中没有其他线性无关集合包含它作为真子集。
- V V V 中所有的向量都可以按唯一的方式表达为 B \mathfrak {B} B中向量的线性组合。
第三点尤其重要,感性的理解,基就是向量空间中的一个子集,它可以通过唯一的线性组合,来张成向量空间中所有的向量,这样就可以大大的缩小我们向量空间的大小。
线性相关性引理(Linear Dependent Lemma)
如果 ( v 1 , … , v n ) (\mathbf{v}_1, \ldots, \mathbf{v}_n) (v1,…,vn) 在 V V V 中是线性相关的,并且 v 1 ≠ 0 \mathbf{v}_1 \neq 0 v1̸=0,则有至少一个 j ∈ { 2 , … , m } j \in \{2, \ldots, m\} j∈{2,…,m} 使得下列成立:
- v j ∈ s p a n ( v 1 , … , v j − 1 ) ; \mathbf{v}_j \in \mathrm{span}(\mathbf{v}_1, \ldots, \mathbf{v}_{j - 1}); vj∈span(v1,…,vj−1);
- 如果从 ( v 1 , … , v n ) (\mathbf{v}_1, \ldots, \mathbf{v}_n) (v1,…,vn) 去掉第 j j j 项,则剩余向量组的张成仍然等于 s p a n ( v 1 , … , v n ) 。 \mathrm{span}(\mathbf{v}_1, \ldots, \mathbf{v_n})。 span(v1,…,vn)。
异或运算下的基
对于数 a 1 , … , a n a_1, \ldots, a_n a1,…,an,将 a i a_i ai 的二进制表示 ( b m … b 0 ) 2 (b_{m}\ldots b_0)_2 (bm…b0)2 看作一个向量 a i = ( b m , … , b 0 ) \mathbf{a}_i = (b_m, \ldots, b_0) ai=(bm,…,b0),为了叙述上的方便,下文称向量 a i 的 第 j 位 为 b j \mathbf{a}_i 的第 j 位为 b_j ai的第j位为bj。
向量组 a 1 , … , a n \mathbf{a}_1, \ldots, \mathbf{a}_n a1,…,an 可以张成一个向量集合 s p a n ( a 1 , … , a n ) \mathrm{span}(\mathbf{a}_1, \ldots, \mathbf{a}_n) span(a1,…,an),加上我们的异或运算和乘法运算(显然满足 8 条公理),即可形成一个向量空间 V = ( { 0 , 1 } , s p a n ( a 1 , … , a n ) , ⊕ , ⋅ ) V = (\{0, 1\}, \mathrm{span}(\mathbf{a}_1, \ldots, \mathbf{a}_n), \oplus, \cdot) V=({0,1},span(a1,…,an),⊕,⋅)
我们考虑求出向量空间 V V V 的一个基 B \mathfrak{B} B,从 B = ( a 1 , … , a n ) \mathfrak{B} = (\mathbf{a}_1, \ldots, \mathbf{a}_n) B=(a1,…,an)开始。
第 1 步 如果
a
1
=
0
\mathbf{a}_1 = \mathbf{0}
a1=0,则从
B
中
去
掉
a
1
\mathfrak{B} 中去掉 \mathbf{a_1}
B中去掉a1,否则保持
B
\mathfrak{B}
B 不变。
第 j 步 若
a
j
∈
s
p
a
n
(
a
1
,
…
,
a
j
−
1
)
\mathbf{a}_j \in \mathrm{span}(\mathbf{a}_1, \ldots, \mathbf{a}_{j - 1})
aj∈span(a1,…,aj−1),则从
B
\mathfrak{B}
B 中去掉
a
j
\mathbf{a}_j
aj,否则保持
B
\mathfrak{B}
B 不变。
经过 n n n步后终止程序,得到一个向量组 B \mathfrak{B} B。由于每一次去掉的向包含于前面诸向量的张成,到最后这个组 B \mathfrak{B} B 仍然可以张成 V V V。而且这一程序确保了 B \mathfrak{B} B 中的任何向量都不包含与它前面诸向量的张成,根据线性相关性引理可知 B \mathfrak{B} B 是线性无关的。于是 B \mathfrak{B} B 是 V V V的一个基。
如果一个向量 a i \mathbf{a}_i ai 能被 a 1 , … , a i − 1 \mathbf{a}_1, \ldots, \mathbf{a}_{i - 1} a1,…,ai−1 张成,它不应添加进 B \mathfrak{B} B,在高斯消元的过程中它必然是已经存在的行向量的线性组合,所以这个方程实际上是多余的,它最后一定会被异或为一个 0 \mathbf{0} 0。反之如果向量 a i \mathbf{a}_i ai 不能被 a 1 , … , a i − 1 \mathbf{a}_1, \ldots, \mathbf{a}_{i - 1} a1,…,ai−1张成,那么它一定能找到某一个行添加进去。
我们来模拟下这个过程, n = 5 , a = { 7 , 1 , 4 , 3 , 5 } n = 5, a = \{7, 1, 4, 3, 5\} n=5,a={7,1,4,3,5}。一开始矩阵是这样的:
[ 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 0 & 0 & 0\\ 0 & 0 & 0\\ 0 & 0 & 0 \end{bmatrix} ⎣⎡000000000⎦⎤
加入 7 = ( 111 ) 2 7 = (111)_2 7=(111)2,矩阵变为:
[ 1 1 1 0 0 0 0 0 0 ] \begin{bmatrix} 1 & 1 & 1\\ 0 & 0 & 0\\ 0 & 0 & 0 \end{bmatrix} ⎣⎡100100100⎦⎤
加入 1 = ( 001 ) 2 1 = (001)_2 1=(001)2,添加到最后一行,同时为了维护对角矩阵,消去第一行的最低位,矩阵变为:
[ 1 1 0 0 0 0 0 0 1 ] \begin{bmatrix} 1 & 1 & 0\\ 0 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix} ⎣⎡100100001⎦⎤
加入 4 = ( 100 ) 2 4 = (100)_2 4=(100)2,由于第一行已经有数了,它被异或为 ( 010 ) 2 (010)_2 (010)2,加入第二行矩阵变为:
[ 1 1 0 0 1 0 0 0 1 ] \begin{bmatrix} 1 & 1 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} ⎣⎡100110001⎦⎤
剩下的数都加不上了。
这样所有被选上的 a i \mathbf{a}_i ai构成一个向量空间 V V V的一个基 B \mathfrak{B} B。同时我们知道高斯消元最后得到的矩阵 b b b是 B \mathfrak{B} B 中的向量构成的矩阵进行若干初等行变换得到的矩阵,而任意初等行变换不会影响向量之间的线性无关性,且任意初等行变换过后,这些向量仍然能够张成原有的向量空间(不难证明)。所以,所有非 0 \mathbf{0} 0的 b i \mathbf{b}_i bi 仍然构成向量空间 V V V 的一个基。
大家所称的「线性基」一般都指这个方式得到的基,因为这个基具有一个独特的性质,可以应用到 OI 题目中。所以我们一般谈论的线性基,特指高斯消元解出的对角矩阵的非零行构成的向量组。
线性基的插入
int a[maxn];
void insert(int val){
for(int i=60;i>=0;i--){
if(val&(1LL<<i)){
if(!a[i]){a[i]=val;break;}
else val^=a[i];
}
}
}
线性基查询最大值
int query(){
int ans=0;
for(int i=60;~i;i--){
if(ans^a[i])>ans) ans^=a[i];
}
return ans;
}
线性基查询最小值
int query(){
for(int i=0;i<=60;i++){
if(a[i]) return a[i];
}
return 0;
}
线性基的对角矩阵形式
int p[maxn],cnt=0;
void rebuild(int n){ //线性基的重建,将上三角矩阵转化为对角矩阵
for(int i=60;i>=0;i--){
for(int j=i-1;j>=0;j--){
if(a[i]&(1LL<<j)) a[i]^=a[j];
}
}cnt=0;
for(int i=60;~i;i--){
if(a[i]) p[cnt++]=a[i];
}
}
线性基查询第k小的值(无重复)
int query(int k,int cnt) //需先化为对角矩阵
int ans=0;
for(int i=0;i<cnt;i++){}
if(k>>i&1LL) ans^=p[i];
}
}
线性基查询q在n个数的任意组合的异或值的排名(有重复)
//n个数,它们随意组合的异或值有2^n个数,但是去重后只有2^r个数,r为线性基的个数。
//所以对于每个数它们出现的次数一定相同,为2^(n-r)次。
void rebuild(int n){ //线性基的重建,将上三角矩阵转化为对角矩阵
for(int i=60;i>=0;i--){
for(int j=i-1;j>=0;j--){
if(a[i]&(1LL<<j)) a[i]^=a[j];
}
}cnt=0;
for(int i=0;i<=60;i++){
if(a[i]) p[cnt++]=i;
}
}
for(int i=0;i<cnt;i++) if(q&(1LL<<p[i])) ans=(ans+(1<<i));
线性基的合并
void merge(int *g){
for(int i=0;i<=60;i++){
if(g[i]) insert(g[i]);
}
}
其他
1、1~n的路径最大异或和可以有任意一条1~n的路径异或图中的一些环来得到。
2、若求 n n n个数任意组合异或值的和或者期望,可以对每个二进制位考虑贡献。
3、若是多次查询类型,可以将所有查询区间按右端点从小到大排序,并且插入到线性基的时候记录这个数插入的位置$ i $,同时靠右的数具有优先插入权。查询的时候只要插入位置大于左端点即可以使用。
参考博客:https://www.cnblogs.com/ljh2000-jump/p/5869991.html
https://www.cnblogs.com/joyouth/p/5645682.html