[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录

  • 理论
  • 线性方程组整数类型解
  • 线性方程组浮点类型解
  • 模线性方程组
  • 异或方程组
  • 高斯约旦消元
    • 约旦消元
    • 无解
    • 无穷解
    • 唯一解

理论

高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵

用系数矩阵表示n元一次方程,如
{2x+3y+4z=20x−2y+3z=66x+4y−3z=5⇒(234201−23664−35)\begin{cases} 2x+3y+4z=20\\ x-2y+3z=6\\ 6x+4y-3z=5\\ \end{cases} \ ⇒ \begin{pmatrix} 2&3&4&20\\ 1&-2&3&6\\ 6&4&-3&5\\ \end{pmatrix} 2x+3y+4z=20x2y+3z=66x+4y3z=5 2163244332065
系数矩阵的运算法则:
• 1.将某一行同时乘以/除以一个非0常数。
• 2.某一行加上或减去另一行的若干倍


演示过程
在这里插入图片描述
(234201−23664−35)⇒r1∗12(1322101−23664−35)⇒r2−r1,r3−6r1(1322100−721−40−5−15−55)\begin{pmatrix} 2&3&4&20\\ 1&-2&3&6\\ 6&4&-3&5\\ \end{pmatrix} \ ⇒^{r_1*\frac{1}{2}}\begin{pmatrix} 1&\frac{3}{2}&2&10\\ 1&-2&3&6\\ 6&4&-3&5\\ \end{pmatrix}\ ⇒^{r_2-r_1,r_3-6r_1}\begin{pmatrix} 1&\frac{3}{2}&2&10\\ 0&-\frac{7}{2}&1&-4\\ 0&-5&-15&-55\\ \end{pmatrix} 2163244332065 r12111623242331065 r2r1,r36r110023275211510455
⇒r2∗(−27)(13221001−27870−5−15−55)⇒r1−32r2,r3+5r2(1017758701−278700−1157−3457)\ ⇒^{r_2*(-\frac{2}{7})}\begin{pmatrix} 1&\frac{3}{2}&2&10\\ 0&1&-\frac{2}{7}&\frac{8}{7}\\ 0&-5&-15&-55\\ \end{pmatrix}\ ⇒^{r_1-\frac{3}{2}r_2,r_3+5r_2}\begin{pmatrix} 1&0&\frac{17}{7}&\frac{58}{7}\\ 0&1&-\frac{2}{7}&\frac{8}{7}\\ 0&0&-\frac{115}{7}&-\frac{345}{7}\\ \end{pmatrix} r2(72)100231527215107855 r123r2,r3+5r2100010717727115758787345⇒r3∗(−7115)(1017758701−27870013)⇒r1−177r3,r2+27r3(100101020013)\ ⇒^{r_3*(-\frac{7}{115})} \begin{pmatrix} 1&0&\frac{17}{7}&\frac{58}{7}\\ 0&1&-\frac{2}{7}&\frac{8}{7}\\ 0&0&1&3\\ \end{pmatrix} \ ⇒^{r_1-\frac{17}{7}r_3,r_2+\frac{2}{7}r_3} \begin{pmatrix} 1&0&0&1\\ 0&1&0&2\\ 0&0&1&3\\ \end{pmatrix}  r3(1157)100010717721758783 r1717r3,r2+72r3100010001123
{x1=1x2=2x3=3\begin{cases} x_1=1\\ x_2=2\\ x_3=3\\ \end{cases}x1=1x2=2x3=3


算法流程:
• 从1到n枚举i,第i步定未知数i为主元,从上到下找到第一个未知数i不为0的方程定为主方程(如不存在则跳过这一步)
• 通过乘除系数使得主方程未知数i前面的系数为1 • 对于其他方程,若未知数i前面的系数为k,那么该方程减去主方程的k倍,使得该方程未知数i系数为0
• 时间复杂度O(n^3)


一般来讲,n个未知数n个方程在方程之间线性不相关的情况下,恰好有一组解
如果算法结束后,存在一行全为0,那么被消去的未知数可以任意取值,称为自由元
如果有一行前n个数为0,最后一个数不为0,那么方程无解
当方程组数和未知数数不相等时,也可通过上面方法判定解数
在这里插入图片描述
提一句:多解
解的个数等于自由变量的取值范围的幂
若自由变量的取值范围为ppp ,自由变量有mmm个,则解的个数为pmp^mpm

线性方程组整数类型解

int a[maxn][maxn];//增广矩阵 
int ans[maxn];
bool Free[maxn];//标记是否为自由变元 int GCD ( int a, int b ) {if ( ! b )return a;return GCD ( b, a % b );
}
int LCM ( int a, int b ) {return a / GCD ( a, b ) * b;
}
int Fabs ( int x ) {if ( x < 0 )return -x;return x;
}int Gauss ( int equ, int var ) {for ( int i = 0;i <= var;i ++ ) {ans[i] = 0;Free[i] = 1;}int row, col, MaxRow;col = 1;for ( row = 1;row <= equ && col < var;row ++, col ++ ) {MaxRow = row;for ( int i = row + 1;i <= equ;i ++ )//寻找当前列绝对值最大的行 if ( Fabs ( a[i][col] ) > Fabs ( a[MaxRow][col] ) )MaxRow = i;if ( MaxRow != row ) {//与第row行交换 for ( int i = row;i <= var;i ++ )swap ( a[row][i], a[MaxRow][i] );}if ( ! a[row][col] ) {//说明col列第row行及以下都是0,就处理当前行的下一列 row --;continue;}for ( int i = row + 1;i <= equ;i ++ ) {//枚举要删去各自col列的变元的系数的行 if ( a[i][col] ) {int lcm = LCM ( Fabs ( a[i][col] ), Fabs ( a[row][col] ) );int T1 = lcm / Fabs ( a[i][col] );int T2 = lcm / Fabs ( a[row][col] );if ( a[i][col] * a[row][col] < 0 )T2 = -T2;for ( int j = col;j <= var;j ++ )a[i][j] = a[i][j] * T1 - a[row][j] * T2;}}}//无解:化简的增广矩阵中存在(0,0,...,a)这种类型 for ( int i = row;i <= equ;i ++ )if ( a[i][col] )return -1;int temp;//无穷解,矩阵中出现(0,0,...0) if ( row < var ) {for ( int i = row - 1;i > 0;i -- ) {// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的int free_num = 0, idx;//用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元for ( int j = 1;j < var;j ++ )	if ( a[i][j] && Free[j] ) {free_num ++;idx = j;}if ( free_num > 1 ) //无法求解出确定的变元 continue;temp = a[i][var];//说明只有一个不确定的变元,那么就可以解出该变元for ( int j = 1;j < var;j ++ ) {if ( a[i][j] && j != idx )temp -= a[i][j] * ans[j];}ans[idx] = temp / a[i][idx];Free[idx] = 0;}return var - row;//自由变元的个数 }//唯一解的情况,是一个严格的上三角形//1 0 ... 0//0 1 ... 0//0 0 1 . 0 for ( int i = var - 1;i > 0;i -- ) {temp = a[i][var];for ( int j = i + 1;j < var;j ++ )if ( a[i][j] )temp -= a[i][j] * ans[j];//--因为x[i]存的是temp/a[i][i]的值,即是a[i][i]=1时x[i]对应的值
//		if ( temp % a[i][i] )//可以用来判断有浮点数解,无整数解,但这个是整数解模板 
//			return -2;ans[i] = temp / a[i][i];}return 0;
}

线性方程组浮点类型解

#define eps 1e-6
double a[maxn][maxn];
double ans[maxn];
bool Free[maxn];int GCD ( int a, int b ) {if ( ! b )return a;return GCD ( b, a % b );
}
int LCM ( int a, int b ) {return a / GCD ( a, b ) * b;
}int Gauss ( int equ, int var ) {for ( int i = 0;i <= var;i ++ ) {ans[i] = 0;Free[i] = 1;}int row, col, MaxRow;col = 0;for ( row = 0;row < equ && col < var;row ++, col ++ ) {MaxRow = row;for ( int i = row + 1;i < equ;i ++ ) if ( fabs ( a[i][col] ) > fabs ( a[MaxRow][col] ) )MaxRow = i;if ( MaxRow != row ) {for ( int i = row;i <= var;i ++ )swap ( a[row][i], a[MaxRow][i] );}if ( fabs ( a[row][col] ) < eps ) {row --;continue;}for ( int i = row + 1;i < equ;i ++ ) {if ( fabs ( a[i][col] ) > eps ) {double temp = a[i][col] / a[row][col];for ( int j = col;j <= var;j ++ )a[i][j] -= a[row][j] * temp;a[i][col] = 0;}}}for ( int i = row;i < equ;i ++ )if ( fabs ( a[i][col] ) > eps )return -1;double temp;if ( row < var ) {for ( int i = row - 1;i >= 0;i -- ) {int free_num = 0, idx;for ( int j = 0;j < var;j ++ )	if ( a[i][j] && Free[j] ) {free_num ++;idx = j;}if ( free_num > 1 )continue;temp = a[i][var];for ( int j = 0;j < var;j ++ ) {if ( a[i][j] && j != idx )temp -= a[i][j] * ans[j];}ans[idx] = temp / a[i][idx];Free[idx] = 0;}return var - row;}for ( int i = var - 1;i >= 0;i -- ) {temp = a[i][var];for ( int j = i + 1;j < var;j ++ )if ( a[i][j] )temp -= a[i][j] * ans[j];ans[i] = temp / a[i][i];}return 0;
}

模线性方程组

int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y );
}int inv( int x, int m ) {if( x == 0 ) return 0;if( x == 1 ) return 1;return inv( m % x, m ) * ( m - m / x ) % m;
}int Gauss( int equ, int var ) {int row, col = 1;for( row = 1;row <= equ && col < var;row ++, col ++ ) {int MaxRow = row;for( int i = row + 1;i <= equ;i ++ )if( Fabs( a[i][col] ) > Fabs( a[MaxRow][col] ) )MaxRow = i;if( row != MaxRow ) {for( int i = row;i <= var;i ++ )swap( a[row][i], a[MaxRow][i] );}if( ! a[row][col] ) { row --; continue; }for( int i = row + 1;i <= equ;i ++ ) {if( a[i][col] ) {int d = gcd( Fabs( a[row][col] ), Fabs( a[i][col] ) );int lcm = Fabs( a[row][col] ) / d * Fabs( a[i][col] );int T1 = lcm / Fabs( a[i][col] );int T2 = lcm / Fabs( a[row][col] );if( a[i][col] * a[row][col] < 0 ) T2 = -T2;for( int j = col;j <= var;j ++ ) {a[i][j] = a[i][j] * T1 - a[row][j] * T2;a[i][j] = ( a[i][j] % mod + mod ) % mod;}}}}for( int i = row;i <= equ;i ++ )if( a[i][col] ) return -1;if( row < var ) return var - row;for( int i = var - 1;i;i -- ) {int temp = a[i][var];for( int j = i + 1;j < var;j ++ ) {if( a[i][j] ) {temp -= a[i][j] * x[j];temp = ( temp % mod + mod ) % mod;}}x[i] = temp * inv( a[i][i], mod ) % mod;}return 0;
}

异或方程组

int cnt;
int a[maxn][maxn];
int ans[maxn];
bool Free[maxn];int GCD ( int a, int b ) {if ( ! b )return a;return GCD ( b, a % b );
}
int LCM ( int a, int b ) {return a / GCD ( a, b ) * b;
}int Gauss ( int equ, int var ) {int row, col, MaxRow;col = 0;for ( row = 0;row < equ && col < var;row ++, col ++ ) {MaxRow = row;for ( int i = row + 1;i < equ;i ++ ) if ( fabs ( a[i][col] ) > fabs ( a[MaxRow][col] ) )MaxRow = i;if ( MaxRow != row ) {for ( int i = row;i <= var;i ++ )swap ( a[row][i], a[MaxRow][i] );}if ( a[row][col] == 0 ) {row --;Free[++ cnt] = col;continue;}for ( int i = row + 1;i < equ;i ++ ) {if ( a[i][col] ) {for ( int j = col;j <= var;j ++ )a[i][j] ^= a[row][j];}}}for ( int i = row;i < equ;i ++ )if ( a[i][col] )return -1;if ( row < var ) return var - row;for ( int i = var - 1;i >= 0;i -- ) {ans[i] = a[i][var];for ( int j = i + 1;j < var;j ++ )if ( a[i][j] )ans[i] ^= ( a[i][j] && ans[j] );}return 0;
}

高斯约旦消元

约旦消元

void gauss_jordan ( int equ, int var ) {int row, col = 0;for ( row = 0;row < equ && col < var;row ++, col ++ ) {int MaxRow = row;for ( int i = row + 1;i < equ;i ++ )if ( fabs ( a[i][col] ) > fabs ( a[MaxRow][col] ) )MaxRow = i;if ( MaxRow != row ) {for ( int i = 0;i <= var;i ++ )swap ( a[row][i], a[MaxRow][i] );}if ( fabs ( a[row][col] ) < eps ) {row --;continue;}for ( int i = 0;i < equ;i ++ )if ( i != row )for ( int j = var;j >= row;j -- )a[i][j] -= a[i][col] / a[row][col] * a[row][j];}
}

无解

for ( int i = 0;i < equ;i ++ ) {bool flag = 1;for ( int j = i;j < var;j ++ )if ( fabs ( a[i][j] ) > eps )flag = 0;if ( flag && fabs ( a[i][var] ) > eps )return ! printf ( "-1" );}

无穷解

for ( int i = 0;i < equ;i ++ ) {int free_num = 0;for ( int j = i;j < var;j ++ )if ( fabs ( a[i][j] ) > eps )free_num ++;if ( free_num > 1 )return ! printf ( "0" );}

唯一解

for ( int i = 0;i < equ;i ++ )ans[i] = a[i][var] / a[i][i];for ( int i = 0;i < equ;i ++ )if ( fabs ( ans[i] ) < eps )printf ( "x%d=0\n", i + 1 );elseprintf ( "x%d=%.2f\n", i + 1, ans[i] );

温馨提示,不保证code的绝对正确,反正我是过了
错了别打我,至少别打脸(跑ε=ε=ε=( ̄▽ ̄)

在这里插入图片描述

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

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

相关文章

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

文章目录T1&#xff1a;单峰排列题目题解codeT2&#xff1a;历史研究题目题解codeT3&#xff1a;大魔法师题目题解code我可能这辈子都更不出来狂欢赛5了&#xff0c;先咕咕 T1&#xff1a;单峰排列 题目 一个n的全排列A[i]是单峰的&#xff0c;当且仅当存在某个x使得A[1]<…

YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录题目描述数据范围解析代码图片转载自&#xff1a; https://blog.csdn.net/weixin_43346722/article/details/118435430题目描述 平面上有 n个点&#xff0c;用n个大小相同的圆分别将一个点作为圆心&#xff0c;同时满足圆圈不相交&#xff0c;求圆的最大半径。 数据范…

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

一、前言在项目开发中&#xff0c;日志系统是系统的一个重要组成模块&#xff0c;通过在程序中记录运行日志、错误日志&#xff0c;可以让我们对于系统的运行情况做到很好的掌控。同时&#xff0c;收集日志不仅仅可以用于诊断排查错误&#xff0c;由于日志同样也是大量的数据&a…

[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

文章目录引入概念全套模板变量声明updaterotate旋转splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题&#xff1a;P3369 【模板】普通平衡树题目code声明一下&#xff0c;许多代码的注解都在模板代码里面写了的&#xff0c;所以正文…

手写AspNetCore 认证授权代码

在普通的MVC项目中 我们普遍的使用Cookie来作为认证授权方式&#xff0c;使用简单。登录成功后将用户信息写入Cookie&#xff1b;但当我们做WebApi的时候显然Cookie这种方式就有点不适用了。在dotnet core 中 WebApi中目前比较流行的认证授权方式是Jwt (Json Web Token) 技术。…

YBTOJ:采矿战略(线段树维护dp、树链剖分)

文章目录题目描述解析代码题目描述 所谓线段树维护dp&#xff0c;就是在线段树上维护dp &#xff08;逃&#xff09; 解析 把树剖一下后就变成了区间问题 考虑建一棵线段树&#xff0c;每一个结点都是一个背包 这样就能区间查询&#xff0c;也能带修了 这种做法复杂度其实并不…

【用皇宫三十六计生存法则带你走进LCT(动态树)】LCT概念+模板+例题【洛谷P3690 Link Cut Tree(动态树)】

文章目录LCT概念模板rotatoisrootsplayaccessmakerootsplitfindrootlinkcut封装版例题题目code普通版code封装版这篇博客主要是帮助大家理解各个模板及LCTLCTLCT的意思&#xff0c;方便理解&#xff0c;模板写法的理解在代码里有注释详解&#xff0c;如果要看原理的话&#xff…

迈向现代化的 .Net 配置指北

1. 欢呼 .NET Standard 时代我现在已不大提 .Net Core&#xff0c;对于我来说&#xff0c;未来的开发将是基于 .NET Standard&#xff0c;不仅仅是 面向未来 &#xff0c;也是 面向过去&#xff1b;不只是 .Net Core 可以享受便利&#xff0c; .NET Framework 不升级一样能享受…

YBTOJ洛谷P2042:维护数列(平衡树)

文章目录题目描述解析删除区间插入数列修改&翻转区间和&最大子段和代码传送门题目描述 解析 阴间题… 这不是裸的板子吗&#xff1f; 国赛真的有人能把这题写出来吗… 应该算一道练习作用很强的题了 写完这题&#xff0c;各种平衡树维护区间操作的方法可以说是毕业了吧…

CAP 2.4版本发布,支持版本隔离特性

前言自从上次 CAP 2.3 版本发布 以来&#xff0c;已经过去了几个月的时间&#xff0c;这几个月比较忙&#xff0c;所以也没有怎么写博客&#xff0c;趁着2019年到来之际&#xff08;现在应该是2019年开始的时候&#xff09;&#xff0c;CAP也发布了2018年的最后一个大版本 2.4&…

【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客

文章目录T1题目题解codeT2题目题解codeT3题目题解codeT1 题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是TYVJ今年举办了一次线下七夕祭。Vani同学今年成功邀请到了cl同学陪他来共度七夕&#xff0c;于是他们决定去TYVJ七夕祭游玩。 TYVJ七夕祭和11区的夏祭的…

.NET Core 如何为项目提供高性能解决方案?

本系列&#xff0c;我们将探讨.NET Core 的一些好处&#xff0c;以及它如何为市场提供高性能解决方案&#xff0c;为传统.NET 开发人员和技术人员提供帮助。正文前言随着.NET Core 2.0 在 2016 年首次发布&#xff0c;微软拥有了这个通用、模块化、跨平台开源项目的下一个主要版…

[2.9训练]【CF909C】Python Indentation,【CF909D】Colorful Points,【CF909E】Coprocessor

文章目录T1&#xff1a;Python Indentation题目题解codeT2&#xff1a;Colorful Points题目题解codeT3&#xff1a;Coprocessor题目题解codeT1&#xff1a;Python Indentation 题目 题目描述 In Python, code blocks don’t have explicit begin/end or curly braces to mark…

Docker最全教程之使用Tencent Hub来完成CI(十)

本周更新两篇&#xff0c;保证不太监&#xff01;在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、…