线性基

一些线性代数前置知识口胡

我是蒟蒻,可能(一定)不严谨,dalao们可以去啃书QAQ。

线性空间:在一个域(比如实数域,复数域)内有加法和数乘,加法和数乘都封闭。

线性相关&无关:若 n n 个向量能组成 0 向量,那么这 n n 个向量线性相关,反之无关。

基:若 n 个向量可以组成线性空间中所有向量,且任意 n1 n − 1 个向量不行,那么这 n n 个向量就是一组基,比如在平面直角坐标系里的一组基就是 (0,1),(1,0) n n 就是该线性空间的维数。

基的一些性质:1.线性无关(线性相关的话删掉一个向量肯定还满足,就不符合基定义了)。2.加任意一个向量一定会线性相关(基可以表示出所有向量,所以加了向量肯定线性相关)。

OI中的线性基

异或显然是封闭的“加法”,那么我们可以把一个整数的二进制看成一个 01 向量,这就是一个线性空间了。

因为是以异或为加法,所以有个特殊的性质:若 a1,a2,a3,,ai,,aj,,an a 1 , a 2 , a 3 , ⋯ , a i , ⋯ , a j , ⋯ , a n 是一组线性基,那么任意一个元素异或另一个元素得到的 a1,a2,a3,,ai xor aj,,aj,,an a 1 , a 2 , a 3 , ⋯ , a i   x o r   a j , ⋯ , a j , ⋯ , a n 也是一组线性基(显然)。

既然是线性空间,就可以求出线性基(干嘛要求线性基?因为有很多性质嘛:P,下面会提到),根据上面的性质,我们可以想到一个构造方法:

  • 想尽办法把新加入的数 x x 搞成 0 (雾),这样就可以确定这个数该不该加入线性基了。
  • 所以我们可以把 x x 与之前的数异或,但是肯定要按照一定的顺序。
  • loga loga l o g a 维的向量 Mi M i (一个矩阵),如果 k k x 的最高位,但 Mk M k 不为 0 0 ,那么就把 x xor Mk ,否则令 Mk=x M k = x

上代码:

inline void Insert(LL x){
    for (int j=Log;~j;j--)
        if (x>>j&1)
            if (M[j]) x^=M[j]; else{
                M[j]=x;for (int k=0;k<j;k++) if (M[j]>>k&1) M[j]^=M[k];
                for (int k=j+1;k<Log;k++) if (M[k]>>j&1) M[k]^=M[j];break;
            }
}

下面两个循环有什么用啊?是用来把矩阵消成对角矩阵的,非必要时可以不写。

线性基的性质

1.能组成的数与原数组相同。

2.最高位为 i i 的数至多只有一个。

3.消成对角矩阵之后,最高位为 i 的数至多只有一个,且其他数第 i i 位为 0

4.原数组内的一个数能用线性基唯一的表示出来(线性无关)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值