辗转相除法
原理
1、a和b的最大公因数也是b和r的最大公因数。其中,r是a除以b的余数
证明
计算过程
40和15的最大公约数
40➗15 = 2…10
15➗10 = 1…5
10➗ 5 = 2…0 # 余数为零,得到结果
代码实现
def f(a, b):
if b == 0:
return a
else:
return f(b, a%b)
更相减损法
原理
1、a和b的公因数也是a和a-b的公因数;a和b的公因数也是b和a-b的公因数
计算过程
98 和63的最大公约数
98 - 63 = 35
63 - 35 = 28
35 - 28 = 7
28 - 7 = 21
21 - 7 = 14
14 - 7 = 7 # 减数和差相等,得到结果
代码实现
def fun(a,b):
while a != b:
if a > b:
a = a - b
if a < b:
b = b - a
return a # 循环结束时,a和b相等,任选一个输出
证明
a和b的公因数也是a 和a - b的公因数
设 a和b最大公因数为d,a = md,n = nd,
a-b = (m-n)d, # m,n都是整数,故m-n为整数,d也是a-b的因数