首先接触的就是欧几里得求最大公约数(GCD)
1 int gcd(int a, int b){ 2 // b < a 3 while(b){ 4 int t = a%b; 5 a = b; 6 b = t; 7 } 8 return a; 9 }
递归的写法:
1 int gcd(int a, int b){ 2 if(!b) return a; 3 return gcd(b, a%b); 4 }
在扩展欧几里得中,设法求 ax + by = gcd(a, b) 中的一组 x 和 y 的解
当 b = 0 的时候, gcd(a, b) = a,此时的 x = 1, y = 0为其中的一组的解
当 b ≠ 0 的时候 , 设
ax1 + by1 = gcd(a, b)
又辗转相除法得:
gcd(a, b) = gcd(b, a%b)
设 bx2 + (a%b)y2 = gcd(b, a%b) = gcd(a, b)
所以综合得到一个等式: ax1 + by1 = bx2 + (a%b)y2 (想得到x1, y1)
又 a%b = a - (a/b)*b ,带入上式中
得 bx2 + [ a - (a/b)*b]y2 = ax1 + by1
ay2 + bx2 - (a/b)*b*y2 = ax1 + by1
所以在知道x2, y2 之后,便可以推出
x1 = y2
y1 = x2 - (a/b)*y2
然后推回去就行了
1 int ex_gcd(int a, int b, int &x, int &y){ 2 if(b == 0){ 3 x = 1; 4 y = 0; 5 return a; 6 } 7 int r = ex_gcd(b, a%b, x, y); 8 int t = x; 9 x = y; 10 y = t - floor(a/b)*y; 11 return r; 12 }