扩展欧几里得算法
最大公约数由$gcd(a,b) = gcd(b,a%b)$ 辗转相除法得到,
贝祖定理
存在整数a,b ,那么一定存在整数x,y,使得 $ax+by = gcd(a,b)$
- 可以判断$ax + by = gcd(a,b)$是否有解,或者$ax + by = m$ 且 $m = k * gcd(a,b)$
- 通过求
gcd
时 推x,y
- 首先是一组特解
x = 1 y = 0
假设在辗转求gcd
时满足一组
$bx+(a%b)y$ (注意到此时a=b
b=a%b
**,后面会解释)
(在$c++$中 a%b = a-(a/b)*b
)
带入上式中$b*x+{a-(a/b)*b}*y$ ->
$bx+ay-(a/b)by$->
$ay+b{x-(a/b)y}$. **将此式对比原式***
$ax+by = gcd(a,b)$
得到了x,y的递推方程
- $x = y$
- $y = {x-(a/b)*y}$
- 代码表示就为
1
2
3int temp = y;
y = x - (a/b) * y;
x = temp; - 还要注意到带入的式子$b*x+(a%b)*y$ (此时
a = b
b = a%b
) - 所以我们在递推
x,y
时,当前一步求的x,y
是在下一步中得到,因为下一步a == b , b == a % b
,所以写在递归回溯的地方
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!