intGcd(int a, int b){ if (b == 0) return a; returnGcd(b, a % b); }
裴蜀定理(Bezout)
设 是不全为零的整数,则存在整数 ,使得 。
证明
当 时,。
当 时,因为 ,不妨设 。假设存在一对整数 ,满足 。因为 ,令 ,则有 。
推论
互质的充分必要条件是存在整数 ,使得 。
有解的充分必要条件为 。
设 为 个整数, 是它们的最大公因数,则存在 ,使得 。
扩展欧几里得算法
根据裴蜀定理,可知
写成代码为
1 2 3 4 5 6 7 8
intExGcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1, y = 0; return a; } int gcd = Exgcd(b, a % b, x, y), tmp = x; x = y, y = tmp - y * (a / b); }
也可以写成
1 2 3 4 5 6 7 8 9
intExGcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1, y = 0; return a; } int gcd = Exgcd(b, a % b, y, x); y -= x * (a / b); return gcd; }