码迷,mamicode.com
首页 > 其他好文 > 详细

线性基学习笔记

时间:2018-01-01 18:15:12      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:tin   bre   参考资料   mem   ued   target   xor   targe   near   

  来回顾一下对于给出$n$个数,选出$k$个数,使得它们异或和最大的问题。

  当$k = 2$时,可以用Trie上贪心把它水过去。

  那当k自定时呢?

向量和向量空间

  向量是有方向和有大小的量,$n$维向量可以用一个$1\times n$或者$n \times 1$的矩阵来表示,例如

$\vec{a} = \left(a_{1}, a_{2},\cdots, a_{n}\right)$或$\vec{a} = \left(a_{1}, a_{2},\cdots, a_{n}\right)^{T} $

  称$a_{i}$是向量$\vec{a}$的第$i$个坐标或第$i$个分量。

  坐标都是0的向量是零向量,记作$\vec{0}=\left ( 0,0,0,\cdots,0 \right )$。

  向量的加法:将两个$n$维向量对应下标相加

$\vec{a} + \vec{b} = \left ( a_{1} + b_{1}, a_{2}+ b_{2}, \cdots, a_{n} + b_{n}\right )$

  向量的数乘:将数$\lambda $与$n$维向量$\vec{a}$相乘,定义为:

$\lambda \vec{a} = \left ( \lambda a_{1}, \lambda a_{2},\cdots, \lambda a_{n} \right )$

  向量空间:若四元组$\left(P, V,+,\cdot \right)$中$P$为域,$V$为非空$n$维向量集合,+为向量加法,$\cdot$为向量的数乘运算,满足:

  • 向量加法满足对于任意$\vec{a}\in V,\vec{b}\in V$满足$\vec{a}+\vec{b}\in V$
  • 向量的数乘满足对于任意$\vec{a}\in V,\lambda\in P$满足$\lambda\vec{a}\in V$

  则称四元组$\left(P, V,+,\cdot \right)$为一个向量空间。

向量空间的线性相关性和基

  若存在一组系数$k_{1}, k_{2}, \cdots,k_{m}$,使得

$\vec{b} = k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m}$

  则称$\vec{b}$是$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的一个线性组合。或者说,$\vec{b}$能被$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$线性表示

  设向量空间的向量集合为$V = \left \{ \vec{a}_{1},\vec{a}_{2},\cdots,\vec{a}_{m} \right \}$,若存在一组不完全为0的系数$k_{1}, k_{2}, \cdots,k_{m}$使得

$k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m} = \vec{0}$

  则称这个$m$个向量线性相关,否则称它们线性无关

  若向量空间中存在$\mathfrak{B} \in V$,且满足$V$中任意一个向量都能被$\mathfrak{B}$中的所有向量唯一地线性表示,那么称$\mathfrak{B}$是向量空间$\left(P, V,+,\cdot \right)$的一个

  然后用一个定理来结束这一节的内容。

定理1 若$\mathfrak{B}$为向量空间的基,则$\mathfrak{B}$中向量线性无关。

   证明 使用反证法,设$\mathfrak{B}=\left \{ \vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m} \right \}$线性相关,那么存在一组不完全为0的系数$k_{1}, k_{2}, \cdots,k_{m}$使得

$k_{1}\vec{a}_{1}+ k_{2}\vec{a}_{2}+ \cdots+k_{m}\vec{a}_{m} = \vec{0}$

  假如第一个不为0的系数为$k_{t}$,那么移项得到

$\vec{a}_{t} = -\frac{k_{1}}{k_{t}}\vec{a}_{1}-\frac{k_{2}}{k_{t}}\vec{a}_{2}-\cdots-\frac{k_{t-1}}{k_{t}}\vec{a}_{t-1}-\frac{k_{t+1}}{k_{t}}\vec{a}_{t+1}-\cdots-\frac{k_{m}}{k_{m}}\vec{a}_{m}$

  显然$\vec{a}_{t} $还可以通过它自己线性表示。不满足基的定义,与命题矛盾。

  所以$\mathfrak{B}$中向量线性无关。

异或意义下的基

  此处定义以下谈论的向量空间是指四元组$\left ( V,P=\left\{0, 1 \right\},\oplus,\cdot  \right )$,其中$\oplus$为异或运算。

  将每个数二进制拆分后看成一个向量,然后可以通过高斯消元来求解$V$的极大线性无关子集。

  现在希望证明它满足基的另一条定义,即$V$中向量能够被唯一地线性表示。

定理2 若向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一,当且仅当它们线性无关。

  证明 先证明它们线性无关时,向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一。

  假设存在两组不同的系数$\lambda_{1},\lambda_{2},\cdots,\lambda_{m}$和$\mu_{1},\mu_{2},\cdots,\mu_{m}$使得

$\lambda_{1}\vec{a}_{1} + \lambda_{2}\vec{a}_{2} + \cdots\lambda_{m}\vec{a}_{m} = \mu_{1}\vec{a}_{1} + \mu_{2}\vec{a}_{2} + \cdots \mu_{m}\vec{a}_{m}$

  可得

$\left (\lambda_{1} - \mu_{1}  \right )\vec{a}_{1} + \left (\lambda_{2} - \mu_{2}  \right )\vec{a}_{2} + \cdots\left (\lambda_{m} - \mu_{m}  \right )\vec{a}_{m} = \vec{0}$

  因为它们线性无关,所以$\lambda_{1} = \mu_{1} ,\lambda_{2} = \mu_{2}, \cdots,\lambda_{m} = \mu_{m}$。

  与假设矛盾。所以命题成立。

  然后证明向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一时,则它们线性无关。

  假设向量$\vec{a}_{1}, \vec{a}_{2}, \cdots,\vec{a}_{m}$的线性组合唯一,那么对于两组系数$\lambda_{1},\lambda_{2},\cdots,\lambda_{m}$和$\mu_{1},\mu_{2},\cdots,\mu_{m}$,使得

$\lambda_{1}\vec{a}_{1} + \lambda_{2}\vec{a}_{2} + \cdots\lambda_{m}\vec{a}_{m} = \mu_{1}\vec{a}_{1} + \mu_{2}\vec{a}_{2} + \cdots \mu_{m}\vec{a}_{m}$

  那么用同样的方法可以证明它们线性无关。

  因此通过高斯消元得到的极大线性无关子集是向量空间的一个基。

  但是感觉高斯消元代码太长了。有没有代码量小一点的写法?

  由于行向量组进行初等行变换(高斯消元)后得到的阶梯型矩阵,有很多零行,很浪费。

  考虑让第$i$列的主元是$a_{ii}$那么,可以通过尝试向向量组内依次插入每个数,然后套用高斯消元的做法。

  于是得到了较短的代码(其实和高斯消元一样长,只是可以减小常数)

 1 memset(b, 0, sizeof(b));
 2 ll x;
 3 int cnt = 0;
 4 for(int i = 1; i <= n; i++) {
 5     scanf(Auto, &x);
 6     if(cnt < 63)
 7         for(int j = 62; ~j; j--) {
 8             if(x & (1ll << j))    x ^= b[j];
 9             if(x & (1ll << j)) {
10                 b[j] = x;
11                 cnt++;
12                 for(int k = j - 1; ~k; k--)
13                     if(b[j] & (1ll << k))
14                         b[j] ^= b[k];
15                 for(int k = j + 1; k <= 62; k++)
16                     if(k != j && (b[k] & (1ll << j)))
17                         b[k] ^= b[j];
18                 break;
19             }
20         }
21 }

  扯了一大堆,相信读者还是不知道什么是"线性基"。

  那什么是"线性基"呢?我们常说的"线性基"是指在高斯消元后得到的向量组。

  好。然后和开篇提出的问题有什么关系?

  我们考虑贪心地想一想。除了基以外的向量能被基线性表示,那么选取了它不会更优。

  对于基内向量,我们希望高位尽量为1,那么就把线性基内数异或起来得到的数就是最大子集异或和。

  因为我们就线性基的过程已经劲量使得高位劲量为1。

(To be continued...)

参考资料

  《线性代数与空间解析几何(第二版)》 韩流冰 叶建军 何瑞文 编

  线性基学习笔记

 

特别鸣谢

  Doggu

  QJX

  MaxMercer

线性基学习笔记

标签:tin   bre   参考资料   mem   ued   target   xor   targe   near   

原文地址:https://www.cnblogs.com/yyf0309/p/Linear_basis.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!