接前面
欧几里得算法里面讲了求最大公约数的算法,还有更适用于计算机的算法。
正文
再论最大公约数算法 |
---|
代码
#template<BinaryInteger N>
def even(n):
return 0==n&0x1
def stein_gcd(m,n):
if m<0: m = -m
if n<0: n = -n
if 0==m: return n
if 0==n: return m
#m>0&&n>0
d_m = 0
while even(m):
m >>= 1
d_m += 1
d_n = 0
while even(n):
n >>= 1
d_n += 1
#odd(m)&&odd(n)
while m!=n:
if n>m:n,m=m,n
m -= n
m >>= 1
while even(m):m>>=1
return m << min(d_m,d_n)
判断偶数
用的是位操作,跟之前的odd一样。没有用除以2的方法。
比较
前面文章里同时求出了商和余数,这次只求最大公约数。
比较 |
---|
没有余数的时候,最大公约数是小的数。比如14和7的最大公约数是7。