高斯消元
时间:2019-11-08
本文章向大家介绍高斯消元,主要包括高斯消元使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ll逆元版
//by Saber Alter Official
//Erishikigal & Ishtar
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
typedef long long ll;
typedef unsigned long long ull;
const int N = 515, mod = 1000000007;
ll n, m;//n个方程, m个元
//用来求逆元的快速幂,不多嗦了
inline ll QuickPow(ll a, ll b) {
ll Cur = 1;
while(b) {
if(b & 1) {
Cur *= a;
Cur %= mod;
}
a *= a;
a %= mod;
b >>= 1;
}
return Cur;
}
struct Matrix {
ll A[N][N], x[N];//A存的是矩阵,也就是方程的系数 x是用来存解哒
ll Valid;//储存的是消元后,存储的有效方程的个数,也就是有主元的可解方程
Matrix () {
memset(A, 0, sizeof A);
memset(x, 0, sizeof x);
}
inline void FormulaSwap(int i, int j) {//交换……这个不用多说了,1到m的系数全换一遍
for(int k = 1;k <= m;k++) {
ll _temp = A[i][k];
A[i][k] = A[j][k];
A[j][k] = _temp;
}
}
inline void Elimate(int j, int i) {//消元啊!!! A[j][j]是我们找到的主元的系数位置,A[i][j]是我们要消掉那个方程的元的系数
//逆元来消元啊!不是很在意精度或者模数非素就用double直接除啊!
ll Coe = (A[i][j] * QuickPow(A[j][j], mod - 2)) % mod;//我们要找到A[i][j] = k * A[j][j]!也就是k = A[i][j] * A[j][j]!
Coe = (Coe + mod) % mod;//防止倍数变成负的 !
for(int k = j;k <= m;k++) {//从A[i][j]向后开始消元啊!
A[i][k] = (A[i][k] - Coe * A[j][k]) % mod; //都减去对应的主元方程位置处的系数!也就是Coe(k) * A[j][j->m]!注意要全都减掉!我们是在两个方程之间加减!
}
}
inline void Gauss() {//高斯消元
for(int j = 1;j <= m - 1;j++) {//从第一行开始枚举主元!1到m-1!因为只有m-1个未知数!第m个是右侧常数哇
if(!A[j][j]) {//假如我们枚举的这个主元系数是0!那么就要开始向下面找到这个元的第一个系数不是0的方程!交换这两个!然后再进行下去!
for(int i = j + 1;i <= n;i++) {//向下找啊!找到第一个该元系数不是零的位置啊!
if(A[i][j] != 0) {//找到了啊!
FormulaSwap(i, j);//交换啊 !
break;//跳出来啊! 交换完了!到下面去消元了!
}
}
}
if(!A[j][j]) continue;//全走完了,还找不到啊!换吧!这个元不用消啊!
for(int i = j + 1;i <= n;i++) {//从这一行向下消元啊!!!
Elimate(j, i); //消元啊!注意顺序啊!j是我们枚举的主元的位置啊!我们要从主元向下消啊!
}
}
}
inline bool Nosolution() {//无解的判断啊!
bool NoSol = true;//先假设无解啊!
for(int i = n;i >= 1;i--) {//从最后一个方程开始看!
for(int j = 1;j <= m - 1;j++) {//从左到右扫一遍方程左边的系数!
if(A[i][j]) {//左边剩下系数!有解啊!
NoSol = false;//记下来!不是无解!
Valid = i;//记下来!这是消元之后第一次出现有效方程的地方!
break;//跳出来就好了!
}
}
if(!NoSol) return false;//你看我们上面扫了一遍最后一样找到了可解方程啊!
if(A[i][m]) return true;//我们扫完最后一行,没有进入到上面的判断!那就是左边莫得系数!但是!右边不为0!这是无解条件啊!
}
return false;//这句没啥大用……为了防止Wall报而已
}
inline bool ManySolutions() {//求完上面的情况,发现有效方程的数目小于我们有的未知数个数!有自由元啊!
return Valid < m - 1;//记住!我们未知数的个数只有m-1个!第m个是方程右边的常数!
}
inline void Solve() {//开始解方程
for(int i = m - 1;i >= 1;i--) {//从最后一个未知数开始
x[i] = A[i][m] % mod;//先把它设成右边的常数
for(int j = i + 1;j <= m - 1;j++) {//假如说右边有一个元,通过上三角阵形式可以知道,那么它一定已经得出来了解
x[i] = (x[i] - A[i][j] * x[j]) % mod;//移项求解就可以了
x[i] = (x[i] + mod) % mod;//换成正的
}
x[i] = (x[i] * QuickPow(A[i][i], mod - 2)) % mod;//假如说没有右边的未知数,那就是一个Ax=B的方程,直接逆元解就好了
}
for(int i = 1;i <= m - 1;i++) {
printf("%lld\n", x[i]);
}
}
}Ans;
int main() {
scanf("%lld %lld", &n, &m);
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m;j++) {
scanf("%lld", &Ans.A[i][j]);
}
}
Ans.Gauss();
if(Ans.Nosolution()) {
printf("No solution.");
}
else if(Ans.ManySolutions()) {
printf("Many Solutions.");
}
else {
printf("Unique solution.\n");
Ans.Solve();
}
return 0;
}
double除法版
//by Saber Alter Official
//Erishikigal & Ishtar
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
//#define Rin
typedef long long ll;
typedef unsigned long long ull;
const int N = 115;
struct Matrix {
int n, m;//n formula,(m - 1 = n)x, 1 constant
double A[N][N];
double x[N];
int valid;
inline void FormulaSwap(int j, int i) {
for(int k = 1;k <= m;k++) {
double _temp = A[j][k];
A[j][k] = A[i][k];
A[i][k] = _temp;
}
}
inline void Elimate(int j, int i) {
double coe = A[i][j] / A[j][j];
for(int k = 1;k <= m;k++) {
A[i][k] = A[i][k] - coe * A[j][k];
}
}
inline void Gauss() {
for(int j = 1;j <= n;j++) {//枚举方程编号
if(!A[j][j]) {//方程主元系数为0
for(int i = j + 1;i <= n;i++) {
if(A[i][j]) {
FormulaSwap(j, i);
break;
}
}
}
if(!A[j][j]) continue;
for(int i = j + 1;i <= n;i++) {
Elimate(j, i);
}
}
}
inline bool NoSolution() {
bool NoSolu = true;
for(int i = n;i >= 1;i--) {
for(int j = 1;j <= n;j++) {
if(A[i][j]) {
NoSolu = false;
valid = i;
break;
}
}
if(!NoSolu) return false;
if(A[i][m]) return true;
}
return false;
}
inline bool ManySolutions() {
return valid < n;
}
inline void Solve() {
for(int i = n;i >= 1;i--) {//枚举方程
x[i] = A[i][m];//设为右边的常数
for(int j = i + 1;j <= n;j++) {//枚举右边的元
x[i] = x[i] - A[i][j] * x[j];
}
x[i] = x[i] / A[i][i];
}
for(int i = 1;i <= n;i++) {
printf("%.2lf\n", x[i]);
}
}
}Ans;
int main() {
scanf("%d", &Ans.n);
Ans.m = Ans.n + 1;
for(int i = 1;i <= Ans.n;i++) {
for(int j = 1;j <= Ans.m;j++) {
scanf("%lf", &Ans.A[i][j]);
}
}
Ans.Gauss();
if(Ans.NoSolution() || Ans.ManySolutions()) {
#ifdef Rin
printf("%d %d\n", Ans.NoSolution(), Ans.ManySolutions());
printf("%d\n", Ans.valid);
#endif
printf("No Solution\n");
return 0;
}
Ans.Solve();
return 0;
}
原文地址:https://www.cnblogs.com/Fructose-Ryllis/p/11818274.html
- dedecms文章页调用地址(当前文章URL)如何操作?
- 饭团开通一周,3人学会了比特币操作
- Sample K算法
- C#读取“我的文档”等特殊系统路径及环境变量
- winform CheckedListBox实现全选/全不选
- 机器学习该如何入门
- dedecms建的网站如何去掉/index.html
- WPF ContextMenu的使用
- Json的序列化与反序列化以及乱入的k_BackingField
- 亚马逊面试题
- VisualStudio 怎么使用Visual Leak Detector
- Cannot find module 'socket.io'
- 【学术】独热编码如何在Python中排列数据?
- 比特币的私钥【区块链生存训练】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 轻量级定时框架apscheduler,周中定时给自己发送邮件。
- python 舆情分析 nlp主题分析 (1) 待续
- Flutter基础widgets教程-Text篇
- python 舆情分析 nlp主题分析 (2)-结合snownlp与jieba库,提高分词与情感判断 待续
- No qualifying bean of type 'com.pjh.service.Imp.serviceImp' available和Exception in thread "main" jav
- python音频文件中pcm格式提取
- Spring系列之事务的控制 注解实现+xml实现+事务的隔离等级
- Leetcode刷题 237. 删除链表中的节点 两行代码实现
- python提取视频第一帧图片
- Leetcode刷题 206. 反转链表 递归迭代两种方法实现
- airtest本地连接和远程连接
- Flutter基础widgets教程-TextField篇
- poco对象生成的几种方式根据你使用不同的ui决定
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
- SpringMVC系列之SpringMVC快速入门 MVC设计模式介绍+什么是SpringMVC+ SpringMVC的作用及其基本使用+组件解析+注解解析