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.