首页 > 其他分享 >一次线性方程组 高斯消元笔记

一次线性方程组 高斯消元笔记

时间:2023-12-23 09:00:28浏览次数:30  
标签:int rep 线性方程组 笔记 cdots vdots 高斯消 mod

高斯消元原理

高斯消元用来解如下形式的方程组:

\[\begin{cases} a_{1, 1} x_1 + a_{1, 2} x_2 + \cdots + a_{1, n} x_n = b_1 \\ a_{2, 1} x_1 + a_{2, 2} x_2 + \cdots + a_{2, n} x_n = b_2 \\ \cdots \\ a_{n,1} x_1 + a_{n, 2} x_2 + \cdots + a_{n, n} x_n = b_n \end{cases} \]

首先将所有系数写成系数矩阵:

\[\begin{bmatrix} a_{1, 1} & a_{1, 2} & \cdots & a_{1, n} & b_{1}\\ a_{2, 1} & a_{2, 2} & \cdots & a_{2, n} & b_{2}\\ \vdots & \vdots & \ddots & \vdots & \vdots\\ a_{n, 1} & a_{n, 2} & \cdots & a_{n, n} & b_{n} \end{bmatrix} \]

接下来可以进行初等行列变换,将矩阵消成下三角矩阵。类似这样:

\[\begin{bmatrix} a'_{1, 1} & a'_{1, 2} & \cdots & a'_{1, n} & b'_{1}\\ 0 & a'_{2, 2} & \cdots & a'_{2, n} & b'_{2}\\ 0 & 0 & \cdots & a'_{3, n} & b'_{3}\\ \vdots & \vdots & \ddots & \vdots & \vdots\\ 0 & 0 & \cdots & a'_{n, n} & b'_{n} \end{bmatrix} \]

然后最后一行就表示 \(a_{n, n} x_n = a_{n, n + 1}\),可以解出 \(x_n\)。

然后往回带,解出 \(x_{n - 1}\),以此类推即可。时间复杂度 \(O(n ^ 3)\)。

void gauss() {
	rep(i, 1, n) {
		rep(j, i, n) if (fabs(a[j][i]) > eps) {
			swap(a[j], a[i]); break;
		} if (fabs(a[i][i]) <= eps) continue;
		rep(j, i + 1, n) {
			if (fabs(a[j][i]) <= eps) continue;
			db inv = (db)a[j][i] / a[i][i];
			rep(k, i, n + 1)
				a[j][k] -= inv * a[i][k];
		}
	}
	for (int i = n; i; i -- ) {
		f[i] = a[i][n + 1] / a[i][i];
		for (int j = i - 1; j; j -- )
			a[j][n + 1] -= a[j][i] * f[i];
	}
}

高斯消元应用

  • 解线性方程组

这个不用我说了吧。。。

  • 在 \(\text{dp}\) 中用于消元

这个用处非常大。举个栗子:P3232 [HNOI2013] 游走

题意:给定 \(n\) 点 \(m\) 边无向简单图。要求给每条边重新编号 \(1 \sim m\),使得每条边编号不同且从 \(1\) 到 \(n\) 经过路径的权值和期望尽可能小。

\(n \le 500, m \le 125000\)。

发现边数很多,所以从点数入手。设 \(f_i\) 表示第 \(i\) 个点被经过的期望次数,那么有:

\[\begin{cases} f_1 = \sum \limits_{(1, v) \in E, v \ne n}^{} \dfrac{f_v}{deg_v} + 1 \\ f_u = \sum \limits_{(u, v) \in E, v \ne n}^{} \dfrac{f_v}{deg_v} + 1 (u \ne 1)\\ \end{cases} \]

当然,\(n\) 号点被我们排除在外,因为到了 \(n\) 就停止了。

然后发现,上面的柿子形成了一个 \(n - 1\) 元方程。用高斯消元解方程就可以得到 \(f_u\)。

然后可以得到每条边被经过的期望次数:\(g_{(u, v)} = \dfrac{f_u}{deg_u} + \dfrac{f_v}{deg_v}\)。根据边被经过的期望次数贪心赋权即可。

其他用高斯消元求解 \(dp\) 的例题:P4321 随机漫游

  • 矩阵求逆

矩阵 \(A\) 的逆矩阵定义为 \(A^{-1}\),满足 \(A^{-1} \times A = I\) 且 \(A ^ {-1} \times A = I\)。其中 \(I\) 表示单位矩阵。

求法:将原矩阵 \(A\) 右面拼上一个单位矩阵 \(I\)。然后对左边一半也就是 \(A\) 做初等行列变换消成单位矩阵,同时对右边做左边同样的操作(左边行加右边也加,左边同乘右边也同乘)。最后得到的右半边就是 \(A ^ {-1}\)。

证明真的不会/kk

int gauss() {
	rep(i, 1, n) {
		rep(j, i, n)
			if (a[j][i] != 0) {
				swap(a[i], a[j]); break;
			}
		if (a[i][i] == 0) return 0;
		rep(j, i + 1, n) {
			if (a[j][i] == 0) continue;
			int inv = a[j][i] * qpow(a[i][i]) % mod;
			rep(k, i, 2 * n) a[j][k] -= inv * a[i][k] % mod,
				a[j][k] = (a[j][k] % mod + mod) % mod;
		}
	}
	rep(i, 1, n) {
		int inv = qpow(a[i][i]);
		rep(j, 1, 2 * n) a[i][j] = a[i][j] * inv % mod;
	}
	dep(i, n, 1) {
		rep(j, 1, i - 1) {
			int inv = a[j][i];
			rep(k, 1, 2 * n) a[j][k] -= a[i][k] * inv % mod,
				a[j][k] = (a[j][k] % mod + mod) % mod;
		}
	} return 1;
}
signed main() {
	read(n); int B = (10 * n + 5) * sizeof(LL);
	rep(i, 0, n + 1) a[i] = (LL*)malloc(B);
	rep(i, 1, n) rep(j, 1, n) read(a[i][j]);
	rep(i, 1, n) a[i][i + n] = 1; int s = gauss();
	if (!s) return puts("No Solution"), 0;
	for (int i = 1; i <= n; i ++ , pc('\n'))
		rep(j, 1, n) write(' ', a[i][j + n]);
	return 0;
}

标签:int,rep,线性方程组,笔记,cdots,vdots,高斯消,mod
From: https://www.cnblogs.com/LcyRegister/p/17922690.html

相关文章

  • 扩展中国剩余定理(Excrt)笔记
    扩展中国剩余定理(excrt)本来应该先学中国剩余定理的。但是有了扩展中国剩余定理,朴素的CRT就没用了。扩展中国剩余定理用来求解如下形式的同余方程组:\[\begin{cases}x\equiva_1\({\rmmod}\b_1)\\x\equiva_2\({\rmmod}\b_2)\\...\\x\equiva_n\({\rmmod}\b_......
  • PySide6学习笔记(一)VSCode配置
    vscode配置(windows)在vscode中安装Python与QTforPython和coderunner插件(推荐)   Python与QTforPython插件开发PySide必备coderunner(可以右键运行py文件)安装PySide6pipinstallPySide6配置QTforpython插件 点击插件设置-拓展设置找到......
  • openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用
    openGauss学习笔记-169openGauss数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表openGauss支持标准的数据库操作语言(DML)命令,对表进行更新。169.1操作步骤假设存在表customer_t,表结构如下:CREATETABLEcustomer_t(c_customer_skinteger,......
  • python自动化学习笔记5-----allure测试报告
    1、运行测试报告 2、allure注解的使用  3、优化测试报告之添加对应的标签 4、注解的使用     5、yaml文件格式 6、更改logo(1)allure目录下找到allure.yml的文件,增加插件    (2)在插件目录下添加要展示的图片    (3)修改styles.cs......
  • python自动化学习笔记6-----jekins环境搭建及使用
        msi版本安装后,要去电脑服务里面设置为自启动,否则重启电脑后使用不了。  web自动化1、实现linux部署jekins,window运行自动化代码,不在同一个机器上运行在执行机(自己的电脑上)访问jekins网址进行相应设置        运行后,进行连接,连接成功后,小......
  • python自动化学习笔记4-----pytest单元测试框架
            ......
  • 《需求分析与系统设计》读书笔记3
      从第八章《数据库设计》中总结了一下知识内容:类模型和BCED类包反映了应用类,而不是存储数据库结构,实体类表示了应用中的永久数据库对象,但不是数据库中的永久类;永久数据库层可以是关系数据库,对象关系数据库或者对象数据库;数据库模型是表示数据库结构的这种抽象,包含三种抽象,分别......
  • Kruskal重构树学习笔记
    挺简单的知识点(?)概念首先Kruskal算法是用来求最小生成树的算法之一,其思想是贪心。而Kruskal重构树就是将整张图重建为二叉树。在跑Kruskal的过程中我们会从小到大加入若干条边。现在我们仍然按照这个顺序。首先新建\(n\)个集合,每个集合恰有一个节点,点权为\(0\)。每......
  • 机器学习笔记(二)使用paddlepaddle,再探波士顿房价预测
    目标用paddlepaddle来重写之前那个手写的梯度下降方案,简化内容流程实际上就做了几个事:数据准备:将一个批次的数据先转换成nparray格式,再转换成Tensor格式前向计算:将一个批次的样本数据灌入网络中,计算出结果计算损失函数:以前向计算的结果和真是房价作为输入,通过算是函数sqare......
  • Burnside 引理 与 Pólya 定理 学习笔记
    为了防止明天就把好不容易听完的东西都还给rabbit_lb了,还是记一点吧。1.群论基础1.1群(group)的定义给定集合\(G\)和\(G\)上的二元运算\(\cdot\),满足下列条件称之为群:封闭性:若\(a,b\inG\),则\(a\cdotb\inG\)。结合律:对于任意\(a,b,c\inG\),有\((a\cdotb)\cd......