首页 > 其他分享 >线性基小记

线性基小记

时间:2024-02-28 14:56:34浏览次数:25  
标签:矩阵 异或 子集 线性 operatorname 向量 小记

Part 0:前置知识

线性空间是一个关于以下两个运算封闭的向量集合:

  • 向量加法 \(a+b\)。
  • 标量乘法 \(k*a\)。

给定一个向量集合 \(A=\{a_1,a_2,\dots,a_k\}\),若向量 \(b\) 能由 \(a_1,a_2,\dots,a_k\) 经过向量加法和标量乘法运算得出,则称向量 \(b\) 能被向量 \(a_1,a_2,\dots,a_k\) 表出。\(a_1,a_2,\dots,a_k\) 能表出的所有向量构成一个线性空间,称作 \(A\) 的张成空间,记作 \(\operatorname{span}(A)\)。\(A\) 被称作这个线性空间的生成子集

任意选出线性空间的若干个向量,如果其中存在一个向量能被其它向量表出,则称这些向量线性相关,否则称这些向量线性无关

线性无关的生成子集被称为线性空间的基底,简称。基的另一种定义是线性空间的极大线性无关子集。一个线性空间的所有基包含的向量个数都相等,这个数被称为向量空间的维数


Part 1:OI 中的线性基

在 OI 中,线性基一般用于解决与异或有关的问题。

异或可以看作 \(\bmod 2\) 意义下的向量加法。因此不难直接将原有的定义推广到异或上。

规定:记 \(k\) 为二进制位长,\(cnt\) 为线性基中基底的个数。

基的构建

从矩阵的角度理解,对于一个 \(n\times m\) 的矩阵,把每一行看作长度为 \(m\) 的行向量。将矩阵看作“系数矩阵”进行高斯消元,得到一个简化阶梯形矩阵。显然,简化阶梯形矩阵的所有非零行向量线性无关。而消元过程又不改变行向量的张成空间。于是,简化阶梯形矩阵的所有非零行向量就是该线性空间的一个基。

现在给定二进制数集合 \(V\),求 \(\operatorname{span}(V)\) 的一组解。

我们集合 \(V\) 写成一个 \(|V|\) 行 \(k\) 列的 \(01\) 矩阵,高斯消元即可。

市面上常见的线性基写法采用增量法,逐个加入向量,若能被之前的基表出则不加入。复杂度 \(\mathcal{O}(|V|k)\)。(其实本质上一样)。

struct Linear_Base
{
	LL e[S];

	Linear_Base(){memset(e,0,sizeof(e));}
	
	void insert(LL x)
	{
		for(int i=61; i>=0; i--)
			if(x&(1LL<<i))
			{
				if(e[i])
					x^=e[i];
				else
					return e[i]=x,void();
			}
	}
}

张成空间判定问题

给出一个线性无关的二进制数集合 \(B\),询问 \(a\) 是否在 \(\operatorname{span}(B)\) 中。

\(a\in \operatorname{span}(B)\) 等价于 \(a,B\) 线性相关。类似基的构建一样将 \(a,B\) 放在一起消元即可判断。

最大子集异或值

P3812 【模板】线性基 - 洛谷

要求实现一个函数 \(\operatorname{query}(x)\),表示查询 \(x\) 与线性基的最大异或和。那么最大子集异或值就是 \(\operatorname{query}(0)\)。

从高位到低位考虑基,若异或后变大,则异或。

由贪心可证明正确性。

LL query(LL x)
{
	for(int i=51; i>=0; i--)
		if((x^e[i])>x)
			x^=e[i];
	return x;
}

\(k\) 小子集异或和

若原有的集合 \(V\) 是线性无关的,则异或不到 \(0\),能得到异或值的个数是 \(2^{cnt}-1\) 。(有时允许选空集则无需考虑)。

反之,能得到 \(0\),则为 \(2^{cnt}\) 个。

特判一下 \(0\),然后重构线性基,将三角基消成对角基,即令 \(e_i\) 的 \(0\sim i-1,i+1\sim k-1\) 都为 \(0\)。并从小到大排序记为 \(b_0,b_1,\dots,b_{cnt}\)。

将 \(k\) 按二进制展开,若第 \(i\) 位为 \(1\),则答案异或上 \(b_i\)。证明同按位贪心。

void rebuild()
{
	int tot=0;
	for(int i=0; i<=61; i++)
	{
	    if(!e[i])
	        continue;
		for(int j=i-1; j>=0; j--)
			if(e[i]&(1LL<<j))
				e[i]^=e[j];
		tmp[tot++]=e[i];
	}
}

LL ask(LL k)
{
	if(k>=(1LL<<cnt))
		return -1;
	LL res=0;
	for(int i=cnt-1; i>=0; i--)
		if(k&(1LL<<i))
			res^=tmp[i];
	return res;
}

线性基合并

由于线性基只有 \(\mathcal{O}(k)\) 个元素,所以暴力插入即可,时间复杂度 \(\mathcal{O}(k^2)\)。

例题

P3265 [JLOI2015] 装备购买

就是求一个价钱最小的极大线性无关子集。同 kruskal 一样按价钱从小到大加入,求解线性基即可。

P4301 [CQOI2013] 新Nim游戏

先手想要找到一个极大的集合,使后手面对这个集合时,无法找到一个子集满足异或和为 \(0\)。因此,这个集合一定是线性无关的 。

P3292 [SCOI2016] 幸运数字

对每个节点 \(x\) 维护 \(g_{x,i}\) 表示从 \(x\) 向上走 \(2^i\) 步所到达的所有节点(不包括 \(x\))的线性基。由于可重复贡献直接树上 RMQ 即可。

P4839 P 哥的桶

使用线段树维护线性基合并。复杂度 \(\mathcal{O}(n\log n\log ^2 V)\)。

标签:矩阵,异或,子集,线性,operatorname,向量,小记
From: https://www.cnblogs.com/xishanmeigao/p/18040384

相关文章

  • Python 线性回归(y=ax+b)
    线性回归主要是拟合一个函数,能预测一个新的样本:(1)数据集如下: (2)预测值:feet=5001#-*-coding:utf-8-*-2importmatplotlib.pyplotasplt3importpandasaspd4fromsklearnimportlinear_model5importos6os.chdir("/Users/xxx/PycharmProjects/dataset/"......
  • C++ 点的线性拟合 y(x)=ax+b
    一、简单分析点的线性拟合是一般实验数据处理最常用的方法。下面考虑一个用n个数据点拟合成直线的问题,直线模型为y(x)=ax+b这个问题称为线性回归。设变量y随自变量x变化,给定n组观测数据(xi,yi),用直线来拟合这些点,其中a,b是直线的斜率和截距,称为回归系数。为确定......
  • 线性回归
    误差项拟合的线性函数如下,\[h_{\theta}(x)=\sum_{i=0}^{n}\theta_{i}x_{i}=\theta^{T}x\]对于每个样本,真实值和预测值之间的偏差,如下,\[y^{(i)}=\theta^{T}x^{(i)}+\varepsilon^{(i)}\]独立同分布误差项是独立同分布的,并且服从均值为0方差为\[\theta^2\]的正态分布。......
  • 线性规划与对偶
    感谢lcw学长的blog,讲的很清晰,受益匪浅。本文使用大量非正式语言,如有需要可以去看原论文。定义称形如\(f(x_1,\cdots,x_n)=\sum\limits_{i=1}^na_ix_i\)的函数为线性函数。称\(f(x_1,\cdots,x_n)\geb,f(x_1,\cdots,x_n)=b,f(x_1,\cdots,x_n)\leb\)为线性约束。称满......
  • 线性数据结构:数组、受限数组(栈、队列)、线性表
    1.数组数组定义  数组(Array)是有序的元素序列。属于线性结构(有且仅有一个前驱、有且仅有一个后继)。数组特点  数组的关键在于在内存中的物理地址对应的是一段连续的内存。这意味着如果想要在任意位置删除/新增一个元素,那么该位置往后的所有元素,都需要往前挪/往后挪一个位......
  • KTT 小记
    来源来自EI的2020年的论文《浅谈函数最值的动态维护》。适用范围给出一些形如\(k_ix_i+b_i\)的一次函数且\(x_i\)为已知值,支持动态对一次函数的\(x_i\)或\(b_i\)区间加,并快速查询一次函数的结果最值。思想与实现使用线段树,记录一个阈值\(\Deltax\)表示“当前......
  • sklearn学习笔记之线性回归
    AI时代扑面而来,在大众面对ChatGPT和Sora发出无数惊叹号的时候,我决定不再只当一个AI时代的API调用者,而是去学习机器学习技术本身。刚好公司也要往人工智能方向发展的计划,于是我开始从基础学习,发现了一个宝藏开源机器学习库:scikit-learn。scikit-learn文档健全,社区生态非常完善,这......
  • SAM小记
    构建其实也写了,但没放上来直接放题吧【模板】后缀自动机(SAM)首先我们求出SAM然后,我们对于每一个前缀对应的节点的edp+1,因为这个串是最长的串(为叶子)然后dfs子树求和,求出edp,然后就可以做了P2408不同子串个数SAM中一个节点代表的串的个数是\(len[now]-len[link[now]]\),对于每......
  • 线性基学习笔记
    线性基preface需要一点线性空间知识线性相关:在向量空间V的一组向量\(A:a_1,a_2...a_m\)如果存在不全为零的数\(k_1,k_2,···,k_m\),使\(\suma_ik_i=0\)则称向量组A是线性相关的,否则线性无关线性表出:在向量空间V的一组向量\(A:a_1,a_2...a_m\)如果存在一组实数\(k_......
  • 数据结构——线性表
    线性表1.掌握线性表的定义、逻辑结构及其抽象数据类型等基本概念线性表的抽象数据类型定义ADTList{数据对象:D={ai|ai∈ElemSet,i=1,2,...n,n>=0}//任意数据元素的集合数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,3,...n}//除第一个和最后一个外,每个元素都有唯一的前驱和后继基本......