线性空间与线性基(待整修,现在是史,OIwiki上的史。)
各代数结构定义
群
对于一个集合 \(G\) 和运算 \(\times\),若其满足:封闭性、结合律,具有单位元,对于每个元素都有逆元,则称呼 \((G,\times)\) 为一个群。
阿贝尔群,或交换群是运算满足交换律的群的称呼。半群是运算满足封闭性、结合律加上一个集合的代数结构。
域
对于一个集合 \(K\) 和两个运算 \(+\) 和 \(\times\),满足:
-
\((K,+)\) 是交换群,并记其单位元为 \(0_K\)。
-
\((K-\{0_K\},\times)\) 是交换群。
-
\(\times\) 对 \(+\) 有分配律。
则称 \((K,+,\times)\) 为域。
线性空间
给定域 \((K,+,\times)\) 与某集合 \(V\) 与两种运算 \(\oplus\) 和 \(\cdot\)。
\((V,\oplus)\) 应为阿贝尔群,\(\oplus\) 叫向量加法(实际上不要求 \(V\) 是向量集合)。
\(\cdot\) 称为数乘,\(\cdot:K\cdot V\mapsto V\),记为 \(kv\)。
\(V\) 中元素称为向量,\(K\) 中元素称为标量。称呼 \(K\) 的两种运算为标量加法、标量乘法。
若满足数乘对向量加法、标量加法分配律,且:
数乘结合律:对于 \(a,b\in K,(a\times b)\cdot\mathbf{u}=a\cdot(b\cdot u)\)
标量乘法单位元:对于 \(K\) 的乘法单位元 \(1\),有:\(1\cdot\mathbf{u}=\mathbf{u}\)
则称 \((V,+,\cdot,K)\) 为一线性空间。
不是很严谨地说,标量乘法对应着一种「缩放」,基域 \(K\) 中的元素就代表着缩放的「比例」,向量加法对应「叠加」。同时,\(K\) 中的元素还代表着向量的「坐标」的取值范围。——OI wiki
运算统称为线性运算。
性质:(以下设零向量为 \(\theta\))
- \(\theta\) 唯一
- \(\forall\alpha\in V,-\alpha\) 唯一(这里减法定义为 \(-\oplus\))
- \(\exists 0\in K,\forall\alpha\in V,\) 有 \(0\cdot\alpha=\theta\)
- \(\forall k\in K\), 有 \(k\cdot\theta=\theta\)
- \(\forall\alpha\in V,(-1)\cdot\alpha=-\alpha\)
- 无零因子:\(\forall\alpha\in V,k\in K,k\cdot\alpha=\theta\implies k=0\lor\alpha=\theta\)
- 加法的消去律:\(\forall\alpha,\beta,\gamma\in V,\alpha\oplus\beta=\alpha+\gamma\oplus\beta=\gamma\)
下面,由于可以判断是哪种乘法和哪种加法,统一使用 \(+\) 和 \(\times\)。
线性无关、有关
定义
称 \(a_1,a_2,\dots ,a_n\in V\) 为 \(V\) 的一个向量组。
在此基础上,对于 \(k_1,k_2,\dots,k_n\in K\),称 \(\displaystyle\sum_{i=1}^n k_ia_i\) 为该向量组的一个线性组合;
若向量 \(\beta\in V\) 可以表示为向量组 \(a_1,a_2,\dots,a_n\) 的一个线性组合,则称 \(\beta\) 能被向量组 \(a_1,a_2,\dots,a_n\) 线性表出。
对于 \(k_1,k_2,\dots,k_n\in K\), 若向量组 \(a_1,a_2,\dots,a_n\) 满足\(\displaystyle\sum_{i=1}^nk_ia_i=\theta\iff k_i=0, i=1,2,\dots,n,\) 则称向量组\(a_1,a_2,\dots,a_n\) 线性无关,否则称向量组 \(a_1,a_2,\dots,a_n\) 线性相关。
性质
称两向量组等价,当且仅当一个向量组的所有元素都可以被另外一个向量组线性表出。等价关系是满足传递性的。符号为 \(\cong\)。
替换定理:设线性无关向量组 \(a_1,a_2,\dots,a_n\) 可以由向量组 \(b_1,b_2,\dots,b_m\) 线性表出,则 \(n\le m\),且存在一排列 \(\sigma_1,\sigma_2,\dots,\sigma_m\),使得向量组 \(a_1,a_2,\dots,a_n,b_{\sigma_{n+1}},b_{\sigma_{n+2}},\dots,b_{\sigma_{m}}\) 等价于向量组 \(b_1,b_2,\dots,b_m\)。
证明考虑对 \(n\) 归纳。
可以由替换定理证明,两个等价的线性无关向量组必含有相同个数的向量。这是 OI 线性基的基本原理之一。
有几条性质:
-
若向量组的一部分线性相关,则向量组线性相关。若向量组线性无关,则其任意非空部分均线性无关。
-
含 \(\theta\) 的向量组线性相关。
-
向量组线性相关当且仅当向量组的某个向量可以由其余向量线性表出。
此基础上可以定义极大线性无关向量组。
容易证明,任意极大线性无关向量组的大小相同。记作原向量组的秩。等价的向量组的秩相等。
线性变换
一个线性空间到另一个线性空间的映射。我们可以认为这也就是矩阵乘法。
线性空间的变体
线性包 span
对于线性空间 \((V,+,\cdot,K), \left\{v=\sum_{i=1}^nk_ia_i:a_i\in V,k_i\in K,i=1,2,\dots,n\right\}\) 也构成一线性空间,称为由向量组 \(a_1,a_2,\dots,a_n\) 张成 的线性空间(或 线性包),记作\(\operatorname{span}\{a_1,a_2,\dots,a_n\}\)。
线性子空间
对线性空间 \((V,+,\cdot,K),\) 若代数系统 \((V_1,+,\cdot,K)\) 满足:
- \(\varnothing\ne V_1\)
- \(V_1\subseteq V\)
- \(V_1\) 关于 \(+,\cdot\) 构成 \(K\) 上的线性空间
则称 \(V_1\) 为 \(V\) 的线性子空间,简称子空间,记作 \(V_1\leq V\)。同样有真线性子空间 \(V_1<V\)。
由阿贝尔群的定义,线性空间 \(V\) 的非空子集 \(V_1\) 是其线性子空间当且仅当线性运算在 \(V_1\) 上封闭。
线性空间的和(交)、并、积
对于定义在同一域上的两个线性空间 \(V_1,V_2\):
容易验证,\(V_1\cap V_2\) 是 \(V_1,V_2\) 的线性子空间,称为 \(V_1\) 和 \(V_2\) 的并。
两个线性空间的和 \(V=V_1+V_2\) 满足 \(V=\{a+b|a\in V_1,b\in V_2\}\)。可以证明,\(V\) 是包含 \(V_1\cap V_2\) 的最小线性子空间。
\(V_1\) 与 \(V_2\) 的 直积 \(V_1\times V_2\) 定义为二者的笛卡儿积关于如下的加法和数乘构成 \(K\) 上的线性空间:
\(+:(V_1\times V_2)\times(V_1\times V_2)\mapsto V_1\times V_2; ((u_1,v_1),(u_2,v_2))\to (u_1+u_2,v_1+v_2)\)
\(\cdot:\Bbb{P}\times(V_1\times V_2)\mapsto V_1\times V_2; (k,(u,v))\to (ku,kv)\)
和与并满足交换、结合律。
变种分配律:令 \(V_1,V_2,V_3\) 是关于 \(K\) 的线性空间,线性空间的交与并有如下关系:
对于线性包,显然有:
线性空间同构
设 \(V,V'\) 为定义在同一域上的线性空间且存在同一数乘、向量加法,如果存在双射 \(\sigma:V\mapsto V'\),则称 \(V,V'\) 同构。
比方说可以证明,实数域和复数域不同构。
定义基:线性空间 \(V\) 的某一极大线性无关向量组 \(S\),则称 \(S\) 为 \(V\) 的一个基。维数是基中的向量数,记为 \(\dim V\)。在 OI 中,我们一般研究有限维数的情况。
同构具有性质:同一域上的两线性空间同构当且仅当其维数相等。
所以,\(K^n\) 与 \(K\) 上的 \(n\) 维数线性空间同构。
线性基
性质
上所述基也称线性基。
设一线性空间维数为 \(n\),则有如下(不显然)性质:
\(V\) 中任一向量均可被 \(S=\{a_1,a_2,\dots,a_n\}\) 线性表出 \(\iff\) \(S\) 是 \(V\) 的线性基。
证明:取 \(V\) 的一组线性基 \(T=\{b_1,b_2,\dots,b_n\}\)。
则 \(T\) 可被 \(S\) 线性表出。则:
即证明结论。
同样,任意线性无关组都可以插入一些线性空间中向量使得其变为一组基。
有子集维数公式:\(\dim V_1+\dim V_2=\dim(V_1+V_2)+\dim(V_1\cap V_2)\)
证明不难,略。
异或线性基
若给定线性空间在域 \(\mathbb{Z}_2^n\) 上,则称为异或线性基。
对于异或线性基,插入一个数,可以容易地判断这个数是否可以被表出:某个数在线性基中的形式是第 \(i\) 位为 \(1\),前面为 \(0\),后面随便。
inline void ins(int x){
for(int i=60;i>=0;i--){
if(x&(1ll<<i)){
if(a[i])x^=a[i];
else{
a[i]=x;
return;
}
}
}
}
复杂度是 \(O(n\log V)\) 的。
实数线性基
若给定线性空间在域 \(\mathbb{R}^n\) 上,则称为实数线性基。
对于实数线性基,直接一个一个插入高斯消元,因为任意极大线性无关向量组等价且大小相等。
构造原理:选了这个作为第 \(i\) 维向量的基,就用它去干剩下的未插入的向量。
如果是整数,那么就可以避免 double:用大质数去模。
本题要求线性基代价和最小,那么可以放在一起高斯消元。(动态可以同余最短路?)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=19660813;
int n,m,len=0,s=0;
struct qsy{
int v[505],w;
bool operator <(const qsy &b)const{return w<b.w;}
}a[505];
int q[505];
int qp(int a,int b){
if(b==0)return 1;
int T=qp(a,b>>1);T=T*T%mod;
return b%2?T*a%mod:T;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)cin>>a[i].v[j];
}
for(int i=1;i<=n;i++)cin>>a[i].w;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!a[i].v[j])continue;
if(!q[j]){
q[j]=i;++len;s+=a[i].w;
break;
}
int d=a[i].v[j]*qp(a[q[j]].v[j],mod-2)%mod;
for(int k=j;k<=m;k++)a[i].v[k]=(a[i].v[k]-d*a[q[j]].v[k]%mod+mod)%mod;
}
}
cout<<len<<" "<<s<<endl;
return 0;
}
当然,不管哪种线性基,都满足线性基的线性代数性质。
线性基求交
设 \(A,B\) 是两线性基,\(V_A=span(A),V_B=span(B)\)。
容易证明,\(V_C=V_A\cap V_B\) 是线性空间,\(C\) 是其线性基,称 \(A,B\) 线性基交为 \(C\)。
设存在一线性基 \(W=\{b\mid b\in B,b\in V_A\}\)。
其需要满足:\(V_{B-W}\cap V_A=\{0\}\)。
下证明:\(V_W=V_A\cap V_B\)。
显然 \(V_W\subseteq V_A\cap V_B\)。只需证明:\(\forall u\in V_A\cap V_B,u\in V_W\)。
反证;设 \(u\not\in V_W,u\in V_A\cap V_B\)。
设 \(\oplus \{b_i\}=u,b_i\in B\)。分为两部分 \(\alpha=\{b_i\}\cap W,\beta=\{b_i\}\cap(B-W)\),\(\oplus \alpha=s,\oplus \beta=t\)。
则 \(s\in V_W,t\in V_{B-W},u=s\oplus t\)。故 \(t=u\oplus s\in V_A\),因为 \(u\in V_A,s\in V_W\subseteq V_A\).
而 \(V_{B-W}\cap V_A=\{0\}\),故 \(t=0,u=s\in V_W\),矛盾。
所以:\(W\) 是待求的线性基交。
接下来介绍求线性基交的算法。
依次遍历 \(b_i\),若 \(b_i\in span(V_A\cup\{b_1,b_2\dots,b_{i-1}\})\),则设其为 \(\alpha\oplus \beta\),其中 \(\alpha\in V_A,\beta\in span(\{b_1,b_2,\dots,b_{i-1}\})\)。令 \(b_i\oplus \beta\to b_i\),否则什么都不做。
最后求出 \(W=\{b_i\}\cap V_A\) 即可。容易验证,\(V_{B-W}\cap V_A=\{0\}\),因此这是正确的。
线性基合并
是 trival 的,把一边的元素插进另一边即可。