线性空间与线性基
线性空间
1.基本概念
设向量集合
- 若向量
能由 进行若干次向量加法与标量乘法得到,则称 能被 表出。 能够表示出的所有向量的集合称为一个 线性空间, 称为这个线性空间的 生成子集。- 集合
中若至少存在一个向量能够被其他向量表出,则称这个向量集合 线性相关,否则称这个集合 线性无关。
可以用
它们表示,这个向量由在第
2.线性空间的基底
线性无关的生成子集称为这个线性空间的 基底,简称 基。
Property 1
线性空间的基底不一定唯一,但所有基底的大小均相同。
并不严谨的证明:
假设线性空间中存在两个基底
,满足 。 由基底的定义得,
能够相互表出。 设
,那么 表出了一个 维的空间, 表出了一个 维空间,且 。 则
也能表出一个线性无关的 ,使得 。则有 表出 , 表出 。 由于
线性无关,作为子集的 不能表出 ,这与 “ 为基底” 矛盾。
基底的大小也称为这个线性空间的 维度。
由此得到推论:
- 线性空间的基底加入一个同一线性空间的其他向量后,新集合一定线性相关。
- 以
个向量作为生成子集,得到的线性空间的维数 。 - 在
维线性空间中取一个子集 , 的维数一定 。
Property 2
对于一个线性空间,其所有的生成子集至少存在一个子集是基底。
对于一个生成子集
,若其中一个元素能够被其他若干元素表出,则将其删去。 重复若干次,可以得到一个线性无关的集合
,且 能够表出 。 进一步地,
是一个生成子集,也是一个基底。 由引理 1,
的大小一定也等于线性空间的维数。
Property 3
基底是最小的生成子集。
综合引理 1 2,反证法易得。
Property 4
在线性空间中,线性无关的生成子集,等价于极大线性无关子集。
设线性无关生成子集大小为
,极大线性无关子集大小为 。 假设
。此时所有的线性无关子集都不是生成子集,显然矛盾。 假设
。此时所有的线性无关生成子集都不是极大的,由引理 1 得出矛盾。 则有
,亦可得出等价关系。
3.线性空间与几何
考虑如何为一维、二维、三维空间分别构造一个向量集合,使得这个集合是空间内所有向量的基底。
对每个空间坐标轴取一个单位向量,这些单位向量就是线性空间的一组基底。
考虑三维空间与三维线性空间的联系。
在线性空间中线性相关的
类似地,线性无关的
推广到
另外,我们有:
维空间内 个线性无关的向量构成线性空间的一组基; 维空间的线性空间的基底大小为 。
由此建立了线性空间这一代数上的概念与几何的联系。
4.线性空间与矩阵
对于一个
同理,我们把每一列看作一个
以行向量作为生成子集的线性空间的维度称为这个矩阵的 行秩。类似地,我们有 列秩 的定义。
Theorem
对于任意一个矩阵,其行秩与列秩相等。
Proof
考虑对矩阵
初等行变换分为三种:
- 交换矩阵不同的两行;
- 把矩阵的某一行乘上一个非 0 系数加到另一行上;
- 对某一行乘上一个非 0 系数。
其中第 2,3 种变换对应了行向量的向量加法与标量乘法。
这意味着无论如何对矩阵做初等行变换,行向量表出的线性空间保持不变。
类似于高斯消元,利用初等行变换将原矩阵转化为对角矩阵。
全为 0 的行表示 0 向量,无法表出除 0 向量以外的任意向量,且非 0 行组成的向量集合线性无关。
于是我们得到,矩阵的行秩就是对角矩阵的非 0 行个数。
可以发现,对于这个对角矩阵进行初等列变换,得到列秩也等于非 0 行个数。
接下来需要证明对一个矩阵进行初等行变换之后,列向量表出的线性空间的维度不变。
设
我们把这个方程组写为增广矩阵形式:
对这个矩阵进行初等行变换,不会对
设
对于任意的
不失一般性,删去
假设
由初等行变换的可逆性,逆向地考虑,同理可得
于是有
回到原来的对角矩阵,它的列秩就等于原矩阵的列秩。
我们最终得到,对于任意的矩阵,行秩和列秩分别对应了对角矩阵的行秩与列秩,二者相等。
5.异或空间
设整数集合
- 若
能由 中若干元素经过异或运算得到,则称 能被 表出。 能够表示出的所有整数的集合称为一个 异或空间, 称为这个异或空间的 生成子集。- 集合
中若至少存在一个整数能够被其他整数表出,则称这个集合 线性相关,否则称这个集合 线性无关。 - 异或空间的 基 为异或空间的线性无关生成子集,或异或空间中极大线性无关子集。
考虑如何求出异或空间的基。将每个整数看作一个
类似于普通线性空间,将这
例如
void Gauss(){
int r=1,c=63;
for(;c>=0;c--){
int t=0;
for(int i=r;i<=n;i++){
if(a[i]>>c&1){
t=i;
break;
}
}
if(!t) continue;
swap(a[t],a[r]);
for(int i=1;i<=n;i++){
if((a[i]>>c&1)&&i!=r)
a[i]^=a[r];
}
r++;
}
}
6.异或线性基的应用
Problem A
有
个整数 与 组询问,每个询问给出一个 ,求 中选出若干个数字(不能不选)执行异或运算能够得到的整数集合中(去掉重复的数)第 小的整数是多少。
对这
在高斯消元求基的过程中,每个
首先,在这
如果选了
不选
同理,选择
于是我们可以对
需要注意的是,题目要求的第
如果
题目要求的是一个 “去重异或集合”,但
首先通过
接下来我们在其余的
设其中一个子集进行异或得到的数字为
于是我们得到,”可重异或集合“ 由 ”不重异或集合“ 重复
void Gauss(){
zero=0;
for(int i=1;i<=n;i++){
int t=0; ll mx=0;
for(int j=i;j<=n;j++){
if(a[j]>mx){
mx=a[j];
t=j;
}
}
if(!mx){
zero=1,n=i-1;
break;
}
swap(a[t],a[i]);
for(int p=63;p>=0;p--){
if(!(a[i]>>p)&1) continue;
for(int l=1;l<=n;l++){
if(l!=i&&(a[l]>>p&1))
a[l]^=a[i];
}
break;
}
}
}
void Solve(){
read(n);
for(int i=1;i<=n;i++) read(a[i]);
Gauss();
read(Q);
while(Q--){
ll k; read(k);
if(zero) k--;
if(k>=(1ll<<n)){
puts("-1");
continue;
}
ll ans=0;
for(int i=n-1;i>=0;i--){
if(k>>i&1)
ans^=a[n-i];
}
printf("%lld\n",ans);
}
}
Problem B
给定
个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
对这
7.数据结构与线性基
异或线性基还有一种类似于数据结构的实现方式。
设
考虑如何插入一个
注意我们维护的是一个最简的线性基。插入后,还要遍历其他的
插入形式的线性基本质上与高斯消元相同,异或运算也就等价于模
void Insert(ll x){
for(int i=63;i>=0;i--){
if(!(x>>i&1)) continue;
if(!b[i]){
for(int j=0;j<i;j++){
if(x>>j&1)
x^=b[j];
}
for(int j=i+1;j<=63;j++){
if(b[j]>>i&1)
b[j]^=x;
}
b[i]=x;
return;
}
else x^=b[i];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix