(转+原)线性基学习总结(详)

(转+原)线性基学习总结(详)

概述

基(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 aiF,满足
a ​ 1 ​ ​ v ​ 1 ​ ​ + a ​ 2 ​ ​ v ​ 2 ​ ​ + … + a ​ n ​ ​ v ​ n ​ ​ = 0 a_​1​​v_​1​​+a_​2​​v_​2​​+…+a​_n​​v_​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 ​ ​ a​1​​v​1​​+a​2​​v​2​​+…+a​n​​v​n​​ a1v1+a2v2++anvn
其中 a 1 , … , a n ∈ F ​ a_1, \ldots, a_n∈F​ a1,,anF

一组向量线性无关 ⇔ \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具有以下性质:

  1. V V V B \mathfrak {B} B 的极小生成集,就是说只有 B \mathfrak {B} B 能张成 V V V,而它的任何真子集都不张成全部的向量空间。
  2. B \mathfrak {B} B V V V 中线性无关向量的极大集合,就是说 B \mathfrak {B} B V V V 中是线性无关集合,而且 V ​ V​ V中没有其他线性无关集合包含它作为真子集。
  3. 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} 使得下列成立:

  1. 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}); vjspan(v1,,vj1)
  2. 如果从 ( 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 (bmb0)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​ aijbj

向量组 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} Ba1,否则保持 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}) ajspan(a1,,aj1),则从 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,,ai1 张成,它不应添加进 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,,ai1张成,那么它一定能找到某一个行添加进去。

我们来模拟下这个过程, 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

https://blog.sengxian.com/algorithms/linear-basis

https://blog.csdn.net/jokerwyt/article/details/81636007

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值