线性丢番图方程的C++实现

来源:互联网 发布:网络邻接权 编辑:程序博客网 时间:2024/06/05 08:42

阅读《密码学与网络安全》这本书,看到线性丢番图方程,就结合之前看到的一些算法,写了一个得到解的程序,加深理解。

也就把代码贴在这里:

void exEuclidean(int a,int b,int &s,int &t){int r1 = a, r2 = b , s1 = 1, s2 = 0, t1 = 0, t2 = 1;//初始化int q,r; while(r2 > 0){        q = r1 / r2;       r = r1 - q * r2; //也就是r = r1%r2;      r1 = r2;       r2 = r;      s = s1 - q * s2;  s1 = s2;  s2 = s;    t = t1 - q * t2;  t1 = t2;  t2 = t; }//gcd(a,b) = r1; s = s1; t = t1;}int gcd(int x,int y){return y == 0 ? x : gcd(y,x%y); } int main(){int a,b,c;printf("请依次输入ax + by = c中的参数a,b,c!\n");scanf("%d %d %d",&a,&b,&c); //首先求出gcd(a,b),利用朴素欧几里得算法 int gcd_a_b = gcd(a,b);if(c % gcd_a_b != 0){printf("c不能整出gcd(a,b),该方程无整数解!\n");return 0; }else{ //会有无穷多个解 int a1 = a / gcd_a_b;int b1 = b / gcd_a_b;//这个时候a1和b1肯定互质了 int c1 = c / gcd_a_b;//变成解方程 a1 * x + b1 * y = c1//利用扩展的欧几里得算法求 a1 * s + b1 * t = 1(注意:1是a1和b1的gcd) int s,t;exEuclidean(a1,b1,s,t); //因为传引用,s和t得到解了//得到特解int x0 = c / gcd_a_b * s , y0 = c / gcd_a_b * t;printf("得到特解:%d 和 %d\n",x0,y0);printf("通解是 x = %d + k * %d 和 y = %d - k * %d,(k为任意整数)\n",x0,b1,y0,a1);}}