线性基小记

文章介绍了如何构造和维护一个线性基,特别是在二进制表示有限的情况下。线性基用于表示数集S中的数,保证一个数能被表示为线性基元素的异或和。插入新数时,从高位到低位检查,并通过异或操作更新基。文章还讨论了线性基的性质,包括它与原数集的关系以及其大小不超过K+1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设有数集 SSS,数的二进制表示最高位不超过 KKK.可构造线性基为一最小化的集合 VVV,满足一个数能被表示成若干 SSS 中的数的异或和,当且仅当其能被表示成若干个 VVV 中的数的异或和.VVV 的大小不超过 K+1K+1K+1

1 构造方法.

ViV_iVi 表示线性基中最高位为 iii 的元素.考虑现在插入一个数 aaa.从大到小枚举 iii.若 aaa 在第 iii 位为 000,则跳过;否则若不存在 ViV_iVi,将 aaa 作为 ViV_iVi 并中断枚举,若存在 ViV_iVi,将 aaa 变为 a⊕Via\oplus V_iaVi 并继续枚举.

性质的证明.

(一)一个数能被表示成若干 SSS 中的数的异或和,当且仅当其能被表示成若干个 VVV 中的数的异或和.

归纳证明.设原来的线性基满足性质.考虑在插入 aaa 后,一个被 SSS 中元素表示的数 x=ai1⊕ai2⊕...⊕aik⊕a\displaystyle x=a_{i_1} \oplus a_{i_2} \oplus...\oplus a_{i_k}\oplus ax=ai1ai2...aika
我们做如下分类:

  • aaa 最终没有被插入线性基,则 a 可以被线性基中原来的元素表示出.x=ai1⊕ai2⊕...⊕aik⊕aj1⊕aj2⊕...⊕ajk′\displaystyle x=a_{i_1} \oplus a_{i_2} \oplus...\oplus a_{i_k}\oplus a_{j_1} \oplus a_{j_2} \oplus...\oplus a_{j_{k^{'}}}x=ai1ai2...aikaj1aj2...ajk.显然可以被原来的线性基表示出.
  • aaa 被插入了线性基,设其为 VaV_aVa.则有
    Va=a⊕aj1⊕aj2⊕...⊕ajk′V_a=a \oplus a_{j_1} \oplus a_{j_2} \oplus...\oplus a_{j_{k^{'}}}Va=aaj1aj2...ajk
    a=Va⊕aj1⊕aj2⊕...⊕ajk′a=V_a \oplus a_{j_1} \oplus a_{j_2} \oplus...\oplus a_{j_{k^{'}}}a=Vaaj1aj2...ajk
    x=ai1⊕ai2⊕...⊕aik⊕ax=a_{i_1} \oplus a_{i_2} \oplus...\oplus a_{i_k}\oplus ax=ai1ai2...aika
          =Va⊕aj1⊕aj2⊕...⊕ajk′⊕ai1⊕ai2⊕...⊕aik\;\;\;=V_a \oplus a_{j_1} \oplus a_{j_2} \oplus...\oplus a_{j_{k^{'}}} \oplus a_{i_1} \oplus a_{i_2} \oplus...\oplus a_{i_k}=Vaaj1aj2...ajkai1ai2...aik

这是 S→VS \rightarrow VSV 的证明,同理也有 V→SV \rightarrow SVS 的证明.

当然,可以用 线性代数 理解.我们将 SSS 中的数看作 K+1K+1K+1 维的向量.那么 SSS 可以看做一个向量空间.这样一个向量空间显然不超过 K+1K+1K+1 维(这个是性质二).然后我们发现 VVV 其实是维护了一组极小的线性无关向量构成的上三角矩阵.我们插入 aaa 的过程其实是对新矩阵做高斯消元.

(二)VVV 的大小不超过 k+1k+1k+1

这个就很显然了.就不证了.

(三)VVV 是极小的.

这个就不会证了,当然从 线性代数 的角度理解好像可以.

code.

struct linebase{
	int c[Bit+1];
	linebase(){memset(c, 0, sizeof(c));}
	void ins(int x){
		for(int i=Bit; ~i; i--){
			if((x>>i)&1){
				if(!c[i]){c[i]=x; break;}
				x^=c[i];
			}
		}
	}
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值