gcd(a, b) = gcd(b, a % b)的证明

191 阅读1分钟
gcd(a,b)=gcd(b,amodb)的证明\huge gcd(a, b)=gcd(b, a \mod b)的证明

首先假设存在a,b,ca,b,c这三个数,若其满足a=qb+ca = q*b + c ,证明:(a,b)=(b,amodb)(a, b) = (b, a \mod b)

证明:

\because首先可以由(a,b)(a, b)可知,(a,b)a(a, b) | a(a,b)b(a, b) | b

\therefore由上式可知:

c=q1(a,b)q2q(a,b)=(a,b)(q1q2q)c=q1*(a, b)-q2*q*(a, b)=(a,b) *(q1 - q2 * q)

\therefore可知(a,b)c(a,b) | c

\therefore 可知(a,b)b,(a,b)c(a,b)|b,(a, b)|c ;故gcd(a,b)gcd(a,b)bbcc的一个公因子;故有:

(a,b)(b,c)(a,b)\leqslant (b,c)

同理,可以知道(a,b)(b,c)(a,b)\geqslant (b,c) ;那么可知(a,b)=(b,c)(a,b)=(b,c);即gcd(a,b)=gcd(b,amodb)gcd(a,b)=gcd(b,a \mod b) ;

此等式是欧几里得算法能够计算出gcdgcd的保障。

代码实现如下:

通过上述等式来理解,当amodb=0a \mod b = 0那么就不用递归,直接返回gcd(a,b)=bgcd(a,b)= b即可

func gcd(a, b int) int {
    if a % b == 0 {
        return b
    }
    return gcd(b, a % b)
}

还有一种写法,就是不断的递归下去,bb会等于00 ,那么当bb等于00时,直接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)gcd(a,b)=gcd(a,a\mod b)成立吗?

A:很显然无法证明。具体证明方法如上。