一 欧几里得辗转相除法算法
设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),又因 r = a mod b,所以 gcd(a,b)=gcd(b,a mod b)。
证明:①证明充分性。
设 d 为 a,b 的公约数,记作 d|a , d|b ,即a和b都可以被d整除
又因 r=a-kb , 两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数, d|r , 即 d 是 (b,a mod b)的公约数,
②证明必要性
设 d 为 b, a mod b 的公约数,则 d|b , d|r
又因 a=r+kb ,所以 d 为 a 的因子,即 d|a ,因此 d 是 a,b 的公约数。
综上,(a,b) 和 (b,a mod b) 的公约数一样,其最大公约数必然相等。
二 扩展欧几里得算法
如果 gcd(a,b)=d , 那么一定存在整数 x,y 满足 ax+by=d.
个人并未在网上搜到关于如上定理的严格证明,大多的关注点是求 x,y 的值。注意因为这是一个不定方程,所以解不只有一组。如果大家有相关证明可以留言讨论。x,y 值的求解:
设存在 ax+by=gcd(a,b)
根据欧几里得定理 gcd(a,b)=gcd( b,a mod b) ,
可得 ax+by = gcd(a,b) = gcd(b,a mod b) = bx′+(a mod b)y′ = bx′+(a?b?[a/b])y′ = ay‘ +b(x‘ - [a/b]y‘),
由恒等定理可知,x=y‘
y=x‘ - [a/b] y‘
可以看到,x,y 的值由 x‘,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’计算得出。
由于欧几里德算法最后一步为 gcd(d,0)=d,此时对应等式存在解 x=1,y=0, 因此只要如上述代码,从 gcd(d,0) 往前处理,在进行欧几里德算法的递归的时候根据相邻两次调用间 x,y 和 x’,y’ 的关系计算即可求出 ax+by=gcd(a,b) 的解。
更进一步,对于任意不定式ax′+by′=c,只需要在等式ax+by=gcd(a,b)=d两边乘上c/d即可得到解为x′=x?c/d,y′=y?c/d
原文地址:https://www.cnblogs.com/travelller/p/8452373.html