[笔记]线性基
1.莫比乌斯反演笔记2.欧拉定理 & 扩展欧拉定理 笔记3.高级数据结构笔记4.多项式(Poly)笔记5.扩展中国剩余定理(Excrt)笔记6.一次线性方程组 高斯消元笔记7.群论笔记8.字符串学习笔记9.一些典型的计数10.图论笔记11.高等代数笔记12.[笔记]博弈论 & SG 函数13.[笔记]决策单调性
14.[笔记]线性基
15.[笔记]组合数学的符号化方法16.[笔记]后缀自动机笔记17.[笔记]生成函数及其展开技巧18.[笔记]min25 筛19.[笔记]各种模板20.[笔记]插值21.[笔记]杜教筛 & Powerful Number 筛22.[笔记]动态规划优化(斜率优化,决策单调性优化)23.[笔记]行列式24.[笔记]Stern-Brocot 树25.[笔记]Important Tricks And Lemmas线性基的定义:若干 向量的集合 ,使得 ,不存在 ,使得 。
线性基可以类比于平面向量中的基底。类比向量,线性基中的向量也可以说他们线性无关。
- 怎么求线性基
将线性基们排成矩阵。对矩阵做初等行列变换后得到的仍然是一组线性基。
因此可以将所有初始向量扔到矩阵里,然后进行初等行列变换削成下三角矩阵。根据高斯消元的过程可以发现,线性基的最高位 位置互不相同。因此最后消到为 的时候,前面 的就是线性基。
由此也可以发现线性基大小不超过 。
这个玩意有两种写法。第一种是用上面初等行列变换的思路:
rep(i, 1, n) {
rep(j, i + 1, n)
if (a[j] > a[i]) swap(a[i], a[j]);
if (!a[i]) break;
dep(j, 63, 0) if ((a[i] >> j) & 1) {
rep(k, 1, n) if (k != i and ((a[k] >> j) & 1))
a[k] ^= a[i];
break;
} Base.push_back(a[i]);
}
第二种是基于插入的实现:
auto ins = [&](int x) {
for (auto i : Base) x = min(x, i ^ x);
if (x) Base.push_back(x);
};
rep(i, 1, n) ins(a[i]);
我个人偏向于前一种写法,因为它快得多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示