扩展欧几里得

首先接触的就是欧几里得求最大公约数(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 }

 

posted @ 2018-06-02 19:05  ouyang_wsgwz  阅读(167)  评论(0编辑  收藏  举报