基础数论--高斯消元

高斯消元是线性代数的一种算法,可用来求解线性方程组问题。

线性方程三大基本操作:

1)两方程互换,解不变;
2)一方程乘以非零数k,解不变;
3)一方程乘以数k加上另一方程,解不变
 1 #include<iostream>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=110;
 6 const double eps=1e-6;
 7 double a[N][N];
 8 int n;
 9 
10 int gauss(){
11     int r,c;
12     for(r=0,c=0;c<n;c++){
13         //1.找到绝对值最大的
14         int t=r;
15         for(int i=r;i<n;i++)
16         if(fabs(a[i][c])>fabs(a[t][c]))
17             t=i;
18         if(fabs(a[t][c])<eps) continue;
19         //2.把最大的换到上边
20         for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]);
21         //3.把最大的c列变成1
22         for(int i=n;i>=c;i--) a[r][i]/=a[r][c];
23         //4.把下边的c列都变成0
24         for(int i=r+1;i<n;i++)
25             if(fabs(a[i][c])>eps)
26                 for(int j=n;j>=c;j--)
27                     a[i][j]-=a[r][j]*a[i][c];
28         r++;
29     }
30     if(r<n){
31         for(int i=r;i<n;i++){
32             if(fabs(a[i][n])>eps){
33                 return 1;
34             }
35         }
36         return 2;
37     }
38     for(int i=n-1;i>=0;i--){
39         for(int j=i+1;j<n;j++){
40             a[i][n]-=a[i][j]*a[j][n];
41         }
42     }
43     return 0;
44 }
45 int main(void){
46     cin>>n;
47     for(int i=0;i<n;i++){
48         for(int j=0;j<=n;j++){
49             cin>>a[i][j];
50         }
51     }
52     int t=gauss();
53     if(t==0){
54         for(int i=0;i<n;i++){
55             printf("%.2lf
",a[i][n]);
56         }
57     }else if(t==1){
58         cout<<"No solution"<<endl;
59     }else if(t==2){
60         cout<<"Infinite group solutions"<<endl;
61     }
62     return 0;
63 }

异或版本的高斯消元

 1 #include<iostream>
 2 using namespace std;
 3 const int N=110;
 4 int n;
 5 int a[N][N];
 6 int gauss(){
 7     int r,c;
 8     for(r=0,c=0;c<n;c++){
 9         //找到1
10         int t=r;
11         for(int i=r;i<n;i++)
12             if(a[i][c]){
13                 t=i;
14                 break;
15             }
16         if(a[t][c]==0) continue;
17         //换上去
18         for(int i=c;i<=n;i++){
19             swap(a[r][i],a[t][i]);
20         }
21         //异或下边的
22         for(int i=r+1;i<n;i++){
23             if(a[i][c]){
24                 for(int j=c;j<=n;j++){
25                     a[i][j]^=a[r][j];
26                 }
27             }
28         }
29         r++;
30     }
31     if(r<n){
32         for(int i=r;i<n;i++){
33             if(a[i][n]){
34                 return 1;
35             }
36         }
37         return 2;
38     }
39     for(int i=n-1;i>=0;i--){
40         for(int j=i+1;j<n;j++){
41             a[i][n]^=a[i][j]&a[j][n];//a[i][j]为1时异或第j行
42         }
43     }
44     return 0;
45 }
46 int main(void){
47     cin>>n;
48     for(int i=0;i<n;i++){
49         for(int j=0;j<=n;j++){
50             cin>>a[i][j];
51         }
52     }
53     int t=gauss();
54     if(t==0){
55         for(int i=0;i<n;i++){
56             cout<<a[i][n]<<endl;
57         }
58     }else if(t==1){
59         cout<<"No solution";
60     }else if(t==2){
61         cout<<"Multiple sets of solutions";
62     }
63     return 0;
64 }
 
原文地址:https://www.cnblogs.com/greenofyu/p/14138582.html