一些线性代数前置知识口胡
我是蒟蒻,可能(一定)不严谨,dalao们可以去啃书QAQ。
线性空间:在一个域(比如实数域,复数域)内有加法和数乘,加法和数乘都封闭。
线性相关&无关:若 n n 个向量能组成 向量,那么这 n n 个向量线性相关,反之无关。
基:若 个向量可以组成线性空间中所有向量,且任意 n−1 n − 1 个向量不行,那么这 n n 个向量就是一组基,比如在平面直角坐标系里的一组基就是 。 n n 就是该线性空间的维数。
基的一些性质:1.线性无关(线性相关的话删掉一个向量肯定还满足,就不符合基定义了)。2.加任意一个向量一定会线性相关(基可以表示出所有向量,所以加了向量肯定线性相关)。
OI中的线性基
异或显然是封闭的“加法”,那么我们可以把一个整数的二进制看成一个 向量,这就是一个线性空间了。
因为是以异或为加法,所以有个特殊的性质:若 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 搞成 (雾),这样就可以确定这个数该不该加入线性基了。
- 所以我们可以把 x x 与之前的数异或,但是肯定要按照一定的顺序。
- 开 个 loga l o g a 维的向量 Mi M i (一个矩阵),如果 k k 是 的最高位,但 Mk M k 不为 0 0 ,那么就把 ,否则令 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 位为 。
4.原数组内的一个数能用线性基唯一的表示出来(线性无关)。