最大公约数 下

来源:互联网 发布:知乎白云先生最新文章 编辑:程序博客网 时间:2024/05/14 05:35

这个算法基于这样一个事实,gcd(a,b) == gcd(b,a%b),这个事实的意义在于两个参数都在->0,它的收敛速度要超过上面的我的算法,所以速度也就更快。这个等式的证明很简单,若c = a % b,则有 c = a - nb,由gcd(a,b) = r

,有a|r, b|r,所以c = a|r - nb|r,即c|r,所以gcd(b,a%b)也为r。

另外这个算法经过扩展可以解决 ax + by = gcd(x,y)这样的一元二次方程的解。
def ext_gcd(a,b,x,y): #a'x + b'y = gcd(a',b') == gcd(a,b) ==r 
    if b == 0:
        x = 1
        y = 0
        return x,y,a
    x,y,r = ext_gcd(b,a%b,x,y)
    x_copy = x #因为a' = b, b' = a - a/b*b (/为trunc所以结果不为a), 将这2个等式带入a'x + b'y = r,我们有bx + ay - ay/b*b,移项有ay + b(x-y/b*b) = r(这样移结果不对a(y-y/b*b) + bx = r),所以我们有x = y,

y = x - y / b * b
    x = y #迭代回去
    y = x_copy - y * a / b #迭代回去
    return x,y,r

 

原创粉丝点击