拓展欧几里得 + 线性同余方程

匿名 (未验证) 提交于 2019-12-02 23:49:02

1. 辗转相除法(欧几里得算法)的证明:

1 int gcd(int a,int b){ 2    return b?gcd(b,a%b):a; 3 } 4 // 不用考虑a,b大小,会自己交换的

Ex_gcd用途:求关于 ax + by =gcd(a,b) 的所有整数解

     思路:令g=gcd(a,b) ,若我们已知该方程一个特解x0,y0,则我们可以用某种方式求出所有整数解。

3.①怎么求出这个特解?

  已知gcd(a,b) = gcd(b, a%b) 接下来讨论下两式有无关系


  b * x2 + (a%b) * y2 = g(b,a%b)

可知:a * x1 + b * y1 = b * x2 + (a%b) * y2=b * x2 + (a - (a / b) * b) * y2= a * y2 + b * (x2 - (a / b) * y2)

则知道x2, y2 就可以知道x1, y1了。

因为最终辗转相除法递归出口是b=0,a为GCD,所以对 a*x+b*y=gcd(a,b) 来说,x=1,y=0;得到这个特解,在回溯回去,就可以得出原方程的一个特解

 ②如何由该特解推出其他整数解?

 

 1 void e_gcd(int a,int b,int &gcd,int &x,int &y)  2 {  3     if(b==0)  4     {  5         x=1;  6         y=0;  7         gcd=0;  8     }  9     else 10     { 11         e_gcd(b,a%b,gcd,y,x); // x2=y1-(a-b)*y2, y2=x1 12         y-=x*(a/b); 13     } 14 }

4.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!