扩展欧几里得(Euclid)算法-Exgcd (ACM笔记)

欧几里得算法 - gcd:

int gcd(int a, int b) {
 return b == 0 ? a : gcd(b, a % b);
}

扩展欧几里得算法-Exgcd:

void Exgcd(int a, int b, int& d, int& x, int& y) {
 if (!b) { d = a; x = 1; y = 0; }
 else { Exgcd(b, a % b, d, y, x); y -= x * (a / b); }
}

Exgcd算法证明:

a * x1 + b * y1 == gcd(a,b)

b * x0 + a % b * y0 == gcd(b,a % b)

因为 gcd : gcd(a,b) == gcd(b,a % b)

所以:

a * x1 + b * y1 == b * x0 + a % b * y0

又因为 : a % b == a - floor(a / b) * b

所以:

a * x1 + b * y1 == b * x0 + (a - floor(a / b) * b) * y0

a * x1 + b * y1 == a * y0 + (x0 - floor(a / b) * y0) * b

易得:

x1 == y0
y1 == x0 - floor(a / b) * y0

因为 : Exgcd中 y存储的是下一层的x , x存储的是下一层的y
所以 : y = y(下一层x) - x * (a / b) ;

你可能感兴趣的:(扩展欧几里得(Euclid)算法-Exgcd (ACM笔记))