文章目录

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

理论

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

用系数矩阵表示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=20x−2y+3z=66x+4y−3z=5​ ⇒⎝⎛​216​3−24​43−3​2065​⎠⎞​
系数矩阵的运算法则:
• 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} ⎝⎛​216​3−24​43−3​2065​⎠⎞​ ⇒r1​∗21​⎝⎛​116​23​−24​23−3​1065​⎠⎞​ ⇒r2​−r1​,r3​−6r1​⎝⎛​100​23​−27​−5​21−15​10−4−55​⎠⎞​
⇒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​)⎝⎛​100​23​1−5​2−72​−15​1078​−55​⎠⎞​ ⇒r1​−23​r2​,r3​+5r2​⎝⎛​100​010​717​−72​−7115​​758​78​−7345​​⎠⎞​⇒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​)⎝⎛​100​010​717​−72​1​758​78​3​⎠⎞​ ⇒r1​−717​r3​,r2​+72​r3​⎝⎛​100​010​001​123​⎠⎞​
即{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的绝对正确,反正我是过了
错了别打我,至少别打脸(跑ε=ε=ε=( ̄▽ ̄)

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

  1. 中石油训练赛 - Molecules(高斯消元解方程)

    题目链接:点击查看 题目大意:笛卡尔坐标系上给出 n 个点,如果点为 ( -1 , -1 ) 说明该点的位置是不确定的,现在给出 m 个相连接的关系, 规定位置不确定的点会被周围相邻的点拉到平均位置上 ...

  2. 解线性方程组——高斯消元の板子

    ATP记得它在很久以前看过一点点高斯消元的东西然后做过一点点题目..但是当时实在是太zz了所以本来就没有很懂这个东西现在更是忘得差不多了.. 所以现在就当重新学一遍了QwQ 一点口胡的解释 高斯消元. ...

  3. AcWing 883. 高斯消元解线性方程组(高斯消元模板)

    先出裸的模板: #include<bits/stdc++.h>using namespace std; const int N = 110; typedef double db; db a ...

  4. c++用类实现高斯消元法求解线性方程组的解_高斯消元

    高斯消元 众所周知,高斯消元是线性代数中重要的一课.通过矩阵来解线性方程组.高斯消元最大的用途就是用来解多元一次方程组. 前置技能 1.线性方程组 线性方程组是各个方程关于未知量均为一次的方程组(例如 ...

  5. [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题

    [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算 ...

  6. 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解

    (详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...

  7. AcWing 883. 高斯消元解线性方程组 (高斯消元)

    题目链接 : 点击查看 题目描述 : 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n 个未知数的线性方程组示例: 输入输 ...

  8. 【Luogu 3389】【模板】高斯消元法(用高斯消元求解线性方程组)

    1.线性方程组 2.高斯消元法 步骤1:通过一系列的加减消元,得到类似 kx=b 的式子,求得最后一个未知量的结果 步骤2:然后逐一回代求解整个 x 向量 以下列方程为例: 第一次加减消元,用第1式子 ...

  9. 高斯消元——解线性方程组+球形空间产生器+开关问题

    传送门:https://www.acwing.com/activity/content/11/ 思路: 把原矩阵变成阶梯型矩阵解题步骤: 1.找到绝对值最大的一行. 2.将该行和最上面未处理好的一行交 ...

最新文章

  1. bp神经网络算法步流程_基于遗传算法的BP神经网络优化算法模板
  2. JAVA8 Stream方法使用详解reduce、IntStream(二)
  3. java 井字棋 人机_井字游戏 人机对战 java实现
  4. 徐海学院计算机专业好吗,2019中国矿业大学徐海学院专业排名
  5. c语言程序设计教程本科,新编C语言程序设计教程(本科)第5篇.pdf
  6. (转)RabbitMQ学习之spring整合发送同步消息
  7. 【蓝鸥Unity开发基础三】课时3 Terrain地形系统【未完】
  8. html表单转换文档代码,把HTML表单提交的数据转化成XML文件 (转)
  9. 黑苹果论坛被封_给掌上电脑装上黑苹果,买到的人都觉得赚大了
  10. XML和JSON的使用总结
  11. python程序控制结构与分支的实验报告_Python程序设计实验报告三:分支结构程序设计...
  12. 谈谈你对TCP三次握手和四次挥手的理解
  13. js面向对象技术小结
  14. 微信开发者工具的下载以及项目的创建
  15. getch()函数的使用方法及其返回值问题
  16. mindmanager2018官方下载地址
  17. android_iphone和java三个平台一致的加密方法_Android、iPhone和Java三个平台一致的加密工具...
  18. 新版手机离线地图GPS定位程序
  19. google chrome F11全屏快捷键
  20. ppt中只有声音没有图像处理

热门文章

  1. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享
  2. php如果字符串有1 3 5,PHP常用字符串函数小结
  3. 终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令
  4. python中matplotlib库实例_Python Matplotlib库入门指南
  5. java socket send_java socket编程
  6. 织梦手机版list.php,解决织梦一级目录作域名list.php无法跳转到手机站的问题
  7. iar 看时序_IAR 硬件仿真查看运行时间
  8. 云南河道 kml文件_处理能力提升 4 倍 ,大疆智图 4 天完成 5 公里河道建模
  9. Java当中用 javabean和其他容器存入表格数据 或 利用 容器进行存储表格
  10. html位置下移像素点,吃透移动端 1px的具体用法