首先推荐两篇比较好的博客
http://blog.csdn.net/lincifer/article/details/49391175
(然后下面便是一个蒟蒻的总结QAQ)
扩展欧几里德算法
基本算法:
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 ax + by = gcd(a, b) = d。
证明:
设 a > b。
1. 显然当 b = 0,gcd (a,b) = a 时, x = 1,y = 0;
2. ab != 0 时
原式: ax + by = gcd(a, b)(假设a ≥ b)
- 当 b = 0 时有 gcd(a, b) = a, 此时 x = 1, y = 0
- 当b不为0时, 根据欧几里得定理 gcd(a, b) = gcd(b, a mod b) 可得 ax + by = gcd(a, b) = gcd(b, a mod b) = bx′ + (a mod b)y′,
- 即 ax + by = bx′ + (a mod b)y′ = bx′ + (a − b ∗ ⌊a / b⌋)y′
【我们知道 a % b = a - (a / b) * b(这里的 “/” 指的是整除,例如 5 / 2 = 2 , 1 / 3 = 0)】
- 移项得 ax + by = bx′ + (a mod b)y′ = ay′ + b(x′ − ⌊a / b⌋ y′)
根据恒等定理,有
x = y′
y = x′ − ⌊a / b⌋y′
这有什么用呢? x′ 和 y′ 还是不知道呀.
重新来看看我们得到的两个等式.
x 和 y 是 gcd(a, b) = ax + by 的解,
而 x’ 和 y’ 是在对 gcd(a, b) 按欧几里德算法进行一步后的结果对应的贝祖等式 gcd(b, a mod b) = bx′ + (a mod b)y′ 的解。
也就是说, gcd(a, b) 对应的贝祖等式的解 x, y 可以由 gcd(b, a mod b) 对应等式的解 x’, y’ 计算得出。
更进一步,对于任意不定式 ax′ + by′ = c, 只需要在等式 ax + by = gcd(a, b) = d 两边乘上 c /d 即可得到解为 x′ = x ∗ c / d, y′ = y ∗ c / d
扩欧代码:
1 int exgcd(int a, int b, int &x, int &y) { 2 if(b == 0) { 3 x = 1; y = 0; 4 return a; 5 } 6 int ans = exgcd(b, a % b, x, y); 7 int x1 = x; 8 x = y; 9 y = x1 - a / b * y; 10 return ans; 11 }