gcd(a,b)=gcd(b,amodb)的证明
首先假设存在a,b,c这三个数,若其满足a=q∗b+c ,证明:(a,b)=(b,amodb)
证明:
∵首先可以由(a,b)可知,(a,b)∣a,(a,b)∣b ;
∴由上式可知:
c=q1∗(a,b)−q2∗q∗(a,b)=(a,b)∗(q1−q2∗q)
∴可知(a,b)∣c。
∴ 可知(a,b)∣b,(a,b)∣c ;故gcd(a,b) 是b,c的一个公因子;故有:
(a,b)⩽(b,c)
同理,可以知道(a,b)⩾(b,c) ;那么可知(a,b)=(b,c);即gcd(a,b)=gcd(b,amodb) ;
此等式是欧几里得算法能够计算出gcd的保障。
代码实现如下:
通过上述等式来理解,当amodb=0那么就不用递归,直接返回gcd(a,b)=b即可
func gcd(a, b int) int {
if a % b == 0 {
return b
}
return gcd(b, a % b)
}
还有一种写法,就是不断的递归下去,b会等于0 ,那么当b等于0时,直接return a
func gcd(a, b int) int {
if b == 0 {
return a
}
return gcd(b, a % b)
}
Q&A
Q:gcd(a,b)=gcd(a,amodb)成立吗?
A:很显然无法证明。具体证明方法如上。