数论之高斯消元

news2024/9/22 7:40:21

高斯消元:

前置知识:

高斯消元五步骤法

枚举每一列c

  1. 找到绝对值最大的一行

  2. 将该行换到最上面(第r行)

  3. 将该行的第c列数字变为1

  4. 把该行下面的第c列数字全部变为0

  5. 代回求解

#include <bits/stdc++.h>

using namespace std;
const int N = 110;
const double eps = 1e-6;
//因为c++浮点数的一种弊端,所以小于egs时,可以近似的看作是0
int n;
double a[N][N];
// 函数返回值表示解的类型:0表示唯一解,1表示无穷多解,2表示无解
int gauss()
{
	int c, r; // c表示当前列,r表示当前行
	for (c = 0,r = 0; c < n; c++) // 遍历每一列,r初始为0
	{
		int t = r; // t表示当前最大主元行
		// 在当前列c中找到绝对值最大的元素所在的行t
		for (int i = r; i < n; i++)
			if (fabs(a[i][c]) > fabs(a[t][c])) // fabs函数用于计算浮点数的绝对值
				t = i;

		if (fabs(a[t][c]) < eps) continue;
		// 如果找到的主元行小于一个极小值eps,则认为这一列全为0,跳过此列

		// 将第t行与第r行交换,以确保最大的主元行在当前行
		for (int i = c; i <= n; i++) swap(a[t][i], a[r][i]);

		// 将第r行的主元归一化(把这行的第c个数字变为1)
		for (int i = n; i >= c; i--) a[r][i] /= a[r][c];

		// 将第r行下方所有行的当前列c变为0
		for (int i = r + 1; i < n; i++)
			if (fabs(a[i][c]) > eps) // 仅当第i行的当前列c不为0时,进行消元
				for (int j = n; j >= c; j--) // 从右向左进行消元操作
            // 从后往前,当前行的每个数字,都减去对应列 * 行首非0的数字
            //这样就能保证第一个数字是 a[i][0] -= 1*a[i][0],保证第c列的r行下面全部为0
            // a[r][j]在j=c的时候等于1,a[i][c]-=1*a[i][c]->a[i][c] = 0
					a[i][j] -= a[r][j] * a[i][c];

		//out(); // 调试函数,打印当前矩阵状态
		r++; // 处理下一行
	}

	// 检查是否有解
	if (r < n) 
    // 若r小于n,说明剩下方程的个数是小于 n 的,说明不是唯一解,判断是无解还是无穷多解
	{
		for (int i = r; i < n; i++) // 检查右端是否为0
			if (fabs(a[i][n]) > eps)//右端不为0,左端为0,矛盾因此无解
				return 2; // 无解
		return 1; // 有无穷多组解
	}

	// 回代求解
	for (int i = n - 1; i >= 0; i--) // 从最后一行开始回代
		for (int j = i + 1; j < n; j++) // 计算当前行的解
           // 减去已知解对当前方程的影响,a[i][j]是a[j][n]的系数
			a[i][n] -= a[i][j] * a[j][n];

	return 0; // 有唯一解
}
int main()
{
    cin >> n;
    for(int i = 0; i < n;i ++){
        for(int j = 0; j < n + 1; j++){
            cin >> a[i][j];
        }
    }
    int d = gauss();
    if(d == 0){
        for(int i = 0; i < n; i++) printf("%.2lf\n",a[i][n]);
    }else if(d == 1) cout << "Infinite group solutions\n";
    else cout << "No solution\n";
    return 0;
}

 高斯消元解异或线性方程组:

#include <bits/stdc++.h>

using namespace std;
const int N = 110;
int n;
int a[N][N];
int gauss()
{
    int r,c;
    // 循环每一列
    for(c = 0,r = 0; c < n; c++){
        int t = -1;
        for(int i = r; i < n; i++){
            if(a[i][c]){
                t = i;
                break;
            }

        }
        if(t == -1) continue;//没有找到

        //交换
        for(int i = c; i <= n; i++) swap(a[t][i],a[r][i]);
        //把该行以下的所有第c列变为0
        for(int i = r + 1; i < n; i++){
            if(a[i][c]){
                for(int j = n; j >= c; j--){
                    a[i][j] ^= a[r][j];// 每一行的每一列都和主元行异或
                }
            }
        }
        r++;
    }
    if(r < n){
        for(int i = r; i < n; i++){
            if(a[i][n]) return 2;
        }
        return 1;
    }

    for(int i = n - 1; i >= 0; i--){
        for(int j = i + 1; j < n; j ++){
            // &类似于*
            if(a[i][j]) a[i][n] ^= (a[i][j] & a[j][n]);
        }
    }
    return 0;
}

int main()
{
    cin >> n;
    for(int i = 0; i < n;i ++){
        for(int j = 0; j < n + 1; j++){
            cin >> a[i][j];
        }
    }
    int d = gauss();
    if(d == 0){
        for(int i = 0; i < n; i++) printf("%d\n",a[i][n]);
    }else if(d == 1) cout << "Multiple sets of solutions\n";
    else cout << "No solution\n";
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux LVM 详解

Linux LVM 详解 1. 简介 参考链接&#xff1a; https://blog.csdn.net/qq_35745940/article/details/119054949 https://blog.csdn.net/FP202530/article/details/125140176 &#x1f449; LVM&#xff08;Logical Volume Manager&#xff09;逻辑卷管理 是在硬盘分区和文件系…

面向对象02:构造器详解

本节内容视频链接&#xff1a;面向对象05&#xff1a;构造器详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p64&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 构造器&#xff08;‌Constructor&#xff09;‌是一种特殊的方法&#xff0c;‌用于初始…

解决Intel-12代13代14代大小核调用导致VMware虚拟机性能低

0x01 设备信息 近期入手的是一台2023款 y9000p 游戏本&#xff0c;CPU为13500h 显卡为RTX4060。 0x02 VMware虚拟机遇到的性能问题 尤其是windows虚机明显感觉性能非常差&#xff0c;开几个网页都很卡。 我一度怀疑是CPU i5性能差&#xff0c;还没我的轻薄本运行速度快&…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

省时又省力!2024年最新录屏软件快捷键大放送

录屏工具可以帮我们录制教学视频、游戏精彩瞬间等内容。很多时候录制的过程瞬息万变&#xff0c;如果合理使用录屏快捷键就会极大的缓解我们录制时候的慌乱。今天&#xff0c;就让我们一起探索那些“大家都在用的录屏软件快捷键”&#xff0c;看看它们是如何让我们的录制工作变…

centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)

centos7 xtrabackup mysql&#xff08;8&#xff09;压缩 全量备份 还原&#xff08;4&#xff09; 查看版本&#xff1a; xtrabackup --version qpress --help 主机端 mysql -u root -p 1234aA~1 use company_pro; insert into employee(name) value (‘20240823_1401’);…

2024.8.23

130124202408231008 DATE #:20240823 ITEM #:DOC WEEK #:FRIDAY DAIL #:捌月二十 TAGS < BGM "Forest Mixtape&#xff08;Tsuki)" > < theme oi-graph theory Eulerian > < [NULL] > < [空] > < [空] >冰岛的温柔是克莱因蓝再加点…

使用nfs搭建文件共享系统,以及windows环境如何访问linux系统中的文件共享目录

31、简介 在一些场景中&#xff0c;我们需要多台机器进行磁盘文件共享&#xff0c;集群中如果有linux机器&#xff0c;也有windows机器&#xff0c;如何设置进行文件共享&#xff0c;本文将详细说明。 注&#xff1a;本文linux系统使用的是 centos7&#xff0c;windows使用的是…

【Qt】常见控件 —— QWidget

文章目录 QWidget 的基本介绍QWidget 的 enable 属性QWidget 的 geometry属性 QWidget 的基本介绍 Qt 中 的 各种控件 都继承自 QWidget类 在 Qt designer 右侧 就显示出 QWidget的各种属性 并且也可以直接进行编辑 QWidget 的 enable 属性 enable 描述一个控件是否处于可用 …

前端面试题整理-webpack

实现前端模块化&#xff0c;将多个 js&#xff0c;打包成一个 bundle.js (其他类型文件交由各自的 loader 处理) 1. webpack 了解吗&#xff1f;大概介绍一下 一种打包工具&#xff0c;实现前端模块化&#xff0c;将多个 js&#xff0c;打包成一个 bundle.js (其他类型文件交…

Linux中查看端口被哪个进程占用、进程调用的配置文件、目录,address already in use端口被占用杀死并释放端口

1.查看被占用的端口的进程&#xff08;netstat和ss是一样的&#xff0c;较新的系统推荐ss&#xff09;: netstat -antulp | grep 端口号ss -antulp | grep :端口号lsof -i | grep 端口号2. 通过上面的命令就可以列出&#xff0c;这个端口被哪些应用程序所占用&#xff0c;然后找…

Java设计模式之策略模式详细讲解和案例示范

Java设计模式之策略模式详细讲解和案例示范 在软件开发中&#xff0c;策略模式是一种常见且非常有用的设计模式。它允许定义一系列算法&#xff0c;将它们一个个封装起来&#xff0c;并且使它们可以互相替换。策略模式让算法可以独立于使用它们的客户端而变化。本篇文章将详细…

VScode的python虚拟环境

1 创建虚拟环境&#xff08;venv&#xff09; 在VSCode中打开项目文件夹&#xff0c;键盘按住快捷键ctrl shift p&#xff0c;打开命令面板&#xff0c;输入python:创建环境 选择venv&#xff0c;输入解释器路径&#xff0c;此时左侧文件夹内会出现一个.venv文件夹 2 激活虚拟…

未来已来:探索机器学习如何重塑人工智能的未来方向

引言&#xff1a;机器学习室实现人工智能的关键技术手段&#xff0c;应用领域持续延伸 机器学习是人工智能的一个重要分支&#xff0c;主要研究如何让计算机系统通过数据学习并做出决策或预测&#xff0c;而不需要明确的编程。简单来说&#xff0c;就是让计算机利用经验来提高性…

C# 如何实现接口事件:详解与示例

文章目录 实现接口事件的步骤示例&#xff1a;实现接口事件1. 定义接口事件2. 实现接口事件3. 订阅和触发事件4. 使用示例 总结 在C#中&#xff0c;接口&#xff08;interface&#xff09;是一种定义类必须实现的方法和属性的抽象类型。除了方法和属性&#xff0c;接口还可以包…

浅谈红队攻防之道-CobaltStrike钓鱼攻击集锦

打个比方&#xff0c;一片大地上&#xff0c;躺着一群沉睡的人&#xff0c;远处就是火山&#xff0c;马上就要爆发了&#xff0c;你就像个闹钟&#xff0c;面对这些沉睡的人&#xff0c;你想把他们叫醒。 你持续不断地响着&#xff0c;有的睡得浅的人&#xff0c;被你叫醒了&am…

区块链基础通识(1)——分布式系统的共识问题

分布式系统 我们最初了解区块链的时候&#xff0c;很多人会形容这个区块链是一个“分布式的不可篡改账本”&#xff0c;这是一个很形象的说法&#xff0c;但是我认为更为准确的形容是“所有节点共同维护的状态机”。为什么分布式和区块链不能划等号呢&#xff1f; 两种常见的…

Ubuntu 22.04中解决Could not load the Qt platform plugin “xcb“问题解决方法

摘要&#xff1a;在Ubuntu 22.04中安装OpenCV后&#xff0c;遇到“load the Qt platform plugin “xcb” in site-packages/cv2/qt/plugins" even though it was found. 的问题&#xff0c;导致程序无法启动。本文详细探讨了该问题的成因&#xff0c;并介绍了几种常见但无…

在线英语学习小程序App源码开发技术探讨

引言 随着信息技术的飞速发展和全球化进程的加快&#xff0c;英语学习已经成为越来越多人的日常需求。传统的纸质材料和课堂教学已经无法满足现代人灵活、高效的学习需求。因此&#xff0c;开发一款在线英语学习小程序App成为了一个热门话题。本文将从技术角度探讨在线英语学习…

SX_gitlab图形化案例_19

由图形去理解gitlab反而更直观&#xff1a; 圆圈代表着本机代码所在的位置 这就代表着&#xff0c;本机的代码和远程仓库&#xff0c;jhy_gnss的代码是一样的 一个原点代表着一次改动 merge branch ‘jhy_gnss’ of 192.168.91.10:t3000 into jhy_gnss 这条命令是将GitLab服…