矩阵是个很神奇的东西,可惜我涉猎较少,只能浅谈矩阵的应用。
我们先定义几个符号:
:矩阵 :矩阵 第 行-
:矩阵 第 行第 列的元素 -
:矩阵 去掉第 行和第 列的矩阵(余子式) :矩阵 的转置-
:矩阵 的 次幂 -
:矩阵 的行列式
矩阵乘法
定义矩阵乘法
在这种定义下,矩阵乘法满足交换率的情况:
- 两矩阵相等
- 两矩阵至少有一个为数量矩阵(主对角线为相同的数,其他为
) - 两矩阵的乘积等于两矩阵的和(了解)
矩阵的幂
根据矩阵乘法的定义,只有
矩阵满足结合率,因此可以使用快速幂加速,计算大小为
利用矩阵的幂可以求线性递推式(如 Fibonacci)。
邻接矩阵性质
假设
相当于枚举经过的
如果我们重新定义矩阵乘法
这提示我们可以根据需要重新定义矩阵乘法,但是仍要保证新的定义满足结合率(不用考虑交换率是因为乘数相同已经满足了交换率)。
高斯消元
其实是求解一个线性增广矩阵。
假定有列数为
高斯消元的理论在很多资料和训练指南上都有,因此此处重点分析代码。
1 | void GausElim(){ |
增广矩阵
- 对项
找到系数绝对值最大的一行并交换(减小精度误差) - 对
行之后的每一行 的每个元素 都减去 。为了不破坏 ,需要逆序进行; - 对每一行都操作完毕后,逆序将已有的解代入当前方程组求解。
注意上面的求法是只有唯一解时的求法。如果枚举到某行的某一项
模意义下的高斯消元
边做边模即可。注意因为取模,有可能会出现多解的情况。但是此时若有多解,解的个数是可数的,因此我们往往需要求解的个数。
给出结论:在模
因此像上述一样统计自由元就好了。但是我们很担心
辗转相除法求逆
假设我们要求
- 令
, ; - 令
,交换 ,交换 ; - 当
不为 时重复 1。
原理未知。但看起来过程是扩展欧几里得(上面的过程极有可能是错的)。
异或方程组
模
矩阵求逆
不会。
行列式
定义函数
看起来就不好求。但是我们有性质:
- 若
,则 - 若
,则
具体的证明和文字说明见这里。利用性质六,我们就可以进行高斯消元了。
具体步骤和高斯消元一样。根据性质二,交换两行需要乘
消元完毕后,答案即为主对角线的乘积。因为不选主对角线上的数必定会选中
矩阵树定理
求无向图
然而什么是 Kirchhoff 矩阵?令图
但是这样高斯消元容易有精度误差,解决方法未知,可以考虑分数类。不过一般都是在模意义下的高斯消元,然后就可以采用辗转相除的黑科技保证精度。
可以扩展到有向图上,求出来的是有向树。
特征值及特征多项式
哈?
练习
矩阵乘法
BZOJ3444 ⑨的故事
题意:求
由于矩阵乘法满足分配率,因此当
时间复杂度
矩阵快速幂
HNOI2002 公交车路线
我们能得到递推方程
其中
这个式子线性递推且大小只有
USACO2007NovGold Cow Relays
经过
ZJOI2004 鳄鱼沼泽
仍然是求经过
注意修改矩阵的时候,若
BSOJ3792 做梦
令
Codeforces719E Sasha and Array
题意:要求支持两种操作:区间 Fibonacci 和,区间加法。
好题。明显线段树,然而线段树怎么维护值呢。考虑到 Fibonacci 可以用矩阵快速幂计算,因此我们可以给线段树每个节点都丢一个 Fibonacci 变换矩阵
不难发现对 Fibonacci 数列
因此对一个区间乘上
高斯消元
JSOI2008 球形空间产生器
假设球心坐标,通过球心到
相邻两个方程分别相减得到
BSOJ4544 开关问题
不难发现一个开关要么被开,要么不被开(开两次即以上相当于模
矩阵树定理
SPOJ104 Highways
直接运用定理和高斯消元即可。
HEOI2015 小 Z 的房间
建图求生成树。然而要模
文艺计算姬
题意:求二分图
矩阵长这样。
我们只要
把除了第一行的行都加到第一行上。
显然
另外这道题也可以用 prufer 序列得到式子:
// 有空再写
需要快速乘和快速幂。
总结
矩阵是线性代数的基础之一,其拥有很多性质,如快速幂给我们一种计算线性递推式的方法,行列式可以进行生成树计数。(虽然还有很多性质没有学习)
项的线性递推式可以构造一个 的变换矩阵进行快速幂。如果项中有不能直接从上一次的元素中得到的项(如 次幂),需要将该项的递推式项也加入矩阵,否则可以直接在变换矩阵里写一个常数转移。邻接矩阵的
次幂是一个经过 条边的方案数矩阵。如果有必要,可以重新定义乘法;高斯消元有多解时,若某项及之后的式子该项系数全为
,则需要保持在该行并考察下一项。行列式求值时,交换两行需要乘
。且消元时应该用第 行减去第 行作为第 行的答案。行列式的六个性质:
- 若
,则 - 若
,则
进行行列式化简时,若每一行都刚好有一个元素相同且互不同列,而其他元素也相同,则可以把所有行都加在一行上得到一行相同的数,提出常数得到
,再依次消元。