线性代数基础
线性代数基础
煎蛋的东西不再赘述。
\(n\) 个向量,若存在向量能被其他向量线性表示,则称这些向量线性相关,否则线性无关。
矩阵的行秩,将矩阵看成若干个行向量,从这些向量中选取尽可能多的向量满足这些向量线性无关,选取的个数 \(k\) 即为矩阵的秩。
矩阵的列秩同理,一般来说,矩阵的秩默认为行秩。
行列式常用定理
定义:对一个 \(n\times n\) 的矩阵 \(A\),其 \(n\) 阶行列式写作 \(\det(A)\)。
\(p\) 为所有可能的排列,\(\tau(p)\) 表示一个排列 \(p\) 的逆序对个数。
定理一:\(\det(A^T)=\det(A)\),即矩阵转置后值不变。
证明:考虑对于原来的每个排列 \(p\) ,在转置后对应的 \(a_{i,p_i}\) 变成 \(a_{p_i,i}\),只需证明两者的逆序对个数相同。
那么考虑如果存在两个下标 \(i,j\) 满足 \(i< j\) 且 \(p_i>p_j\),会对有 \(1\) 的贡献,那么在转置后 \(p_j<p_i\) 且 \(j>i\),也会有 \(1\) 的贡献。
定理二:对换矩阵的某两行行列式的值取相反数。
考虑对于任意一个排列 \(p\),对换矩阵两行的影响相当于对换排列的两个值。
如果这两个值相邻,无论两者谁更大都会对逆序对个数造成 \(\pm 1\) 的贡献。
考虑一般情况,如果中间间隔了 \(k\) 个数,那么对换两个值相当于在中间进行了 \(2m+1\) 次相邻对换,每次相邻对换均会造成 \(\pm 1\) 的贡献,所以最终也会改变排列的奇偶性,即对行列式的贡献取反。
推论:如果有矩阵有两行相同,则行列式值为 \(0\)。
对换两行,那么行列式取值为负,又因为交换两行后矩阵一模一样,即 \(\det(A)=-\det(A)\),推出行列式为 \(0\)。
定理三:
把行列式展开,每一项都有 \((b_{p_i}+c_{p_i})\),再把括号打开即可得到后者。
定理四:将矩阵的某一行乘上一个系数 \(k\),行列式的值也会乘上 \(k\)
证明:还是把行列式展开,把每一项的 \(k\) 都提取出出来即可。
定理五:将某一行加上另外一行常数倍,行列式的值不变。
证明:结合定理三和定理四即可,读者自证不难。
定理六:上三角矩阵的行列式值为主对角线上所有值相乘。
证明:除了主对角线的排列以外其他值都有系数为 \(0\) 的值。
利用以上定理就可以利用高斯消元得到行列式的取值了!
定理七:降价行列式/行列式展开/拉普拉斯展开:行列式的值等于所有元素于他们的代数余子式的乘积之和。
\(n\times n\) 的矩阵 \(a\),定义 \(A_{i,j}\) 为 \(a_{i,j}\) 的代数余子式。
关于矩阵中一个位置 \(a_{i,j}\) 的余子式指的是忽略第 \(i\) 行第 \(j\) 列,剩下的元素拼在一次的行列式的值。
代数余子式指的是余子式再乘 \((-1)^{i+j}\)。
即:
首先很好理解的是余子式乘上当前元素的值,相当于给排列添加了一个元素。
唯一需要证明的是系数 \((-1)^{i+j}\)。
证明:先用定义式将行列式展开,考虑枚举第 \(i\) 行的 \(p_i\) 为 \(j\)。
设 \(1\sim i-1\) 中有 \(x\) 个 \(p_v\) 大于 \(j\),那 \(i+1\sim n\) 中有 \(j-1-(i-1-x)=j-i+x\) 个小于 \(j\) 的。那么对逆序对的贡献为 \(j-i+x+x\)。
那么有 \((-1)^{j-i+x+x}=(-1)^{j-i}=(-1)^{i+j}\)。
有趣的小牛牛题,已知 \(1798,2139,3255,4867\) 为 \(31\) 的倍数,请在不暴力展开行列式的情况下证明其值为 \(31\) 的倍数。
将第一列乘上 \(1000\) 倍,第二列乘上 \(100\) 倍,第三列乘上 \(10\) 倍加到第四列上,再对第四列行列式展开,发现 \(a_{i,j}\) 都为 \(31\) 的倍数。
范德蒙德行列
证明:
用一些定理取化简它,分两步:
第一步:将 \(n-1\) 行的 \(-a_1\) 倍加到第 \(n\) 行,再将第 \(n-2\) 行的 \(-1\) 倍,第 \(1\) 行的 \(-x_1\) 倍加到第 \(2\) 行。 得到:
使用行列式展开把第一列展开,发现值其实是忽略第一行第一列的答案。
在对于右下角的那个矩形,每一列都提取出一个 \((a_i-a_1)\)。
再不断对剩下的矩形做如此操作即可得到答案。
以及一个很优美的式子:
\(\det(AB)=\det(A)\det(B)\)
这是著名的柯西–比内公式,笔者很想去仔细证明,但是各种细节讨论最终放弃了,有兴趣的读者可以去看看。
煎蛋例题:
Random Forest Rank
重新审视矩阵的秩,矩阵的秩的意义,也可以理解为非零子式的最大阶数,也就是说,我们要找到一个最大的子式使得其行列式不为零。
考虑行列式的定义。
这里的矩阵 \(a\) 为邻接矩阵,所以说如果 \(a_{i,p_i}\) 有值,那么存在边 \((i,p_i)\),又因为原图不存在环,所以排列中只能存在长度为 \(2\) 的循环,换言之,每个 \(i\) 只能和一个对应的 \(p_i\) 匹配。
那么就转化为求森林的最大匹配数的两倍的期望。
煎蛋树形 dp 即可,设 \(f_x\) 表示 \(x\) 没有被匹配的概率。
Matrix Rank (Hard Version)
设 \(f_{i,j}\) 表示前 \(i\) 行秩为 \(j\) 的矩阵数量。
即两种情况,当前秩不增加即为前面的行向量组合得来,有 \(p^j\) 种方案,或者当前秩增加,有 \((p^n-p^{j-1})\) 种方案。
最后求得是一行 \(f\) 的所有值。
放到二维平面上,每次可以从 \((i,j)\) 走到 \((i+1,j)\) 水平步,或者 \((i+1,j+1)\) 右上步。
那么对于一个终点 \(f(n,j)\),一定恰好走了 \(j\) 次右上步,每次的贡献都是确定的,考虑设 \(g_{i,j}\) 在 \(1\sim n\) 层走了若干次水平步,在第 \(i\) 层走水平步贡献为 \(p^i\),恰好走了 \(j\) 次水平步的方案数。
那么:
现在考虑求解 \(g\),对每一列直接上生成函数:\(G_i(x)=\sum_{j\ge 0}g_{i,j}x^j\)
记:这里貌似可以使用科技很简便地得到答案。
带入第 \(r\) 次项的系数:
递推从小到大维护 \(f_{n,i}\) 即可。
P10102 [GDKOI2023 提高组] 矩阵
真心煎蛋题,考虑随机一个 \(n\times 1\) 的向量 \(D\)(每一位值非零),我们只需要检查 \(D\times A\times B=D\times C\)
错误概率分析:这个方法本质上检验了 \(D\times (A\times B-C)\) 是否为 \(0\),设 \(G=A\times B-C\)
首先如果 \(G\) 全零,那么一定不会判错。
否则假设最终答案 \((1,v)\) 判错了,即:
先算得前 \(n-1\) 项的答案,最后一项 \(D_{1,i}\) 的取值对应着恰好一个答案的取值,那么错误概率为 \(\dfrac{1}{998244353}\)