拓展欧几里得 + 线性同余方程
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