gcd(m,n) = gcd(n,m mod n);
证明 :
令 k = gcd(m , n) , j = gcd(n, m mod n);
1
因为 m = pn + (m mod n),p为任意正整数
而 j | n 且 j | ( m mod n),
所以 j 是 m 和 n 的公约数
又因为 k是m,n的最大公约数 所以 j <= k .
2
因为( m mod n) = m- pn,
而 k | n 且 k | (m mod n)
所以k是n 和 (m mod n)的公约数
又因为 j是 n 和 (m mod n)的最大公约数 所以 k<=j.
所以 k = j 即 gcd(m,n) = gcd(n,m mod n);
c 语言实现
//递归
int gcd(int m, int n)
{
return n? gcd(n,m%n) : m;
}
//无递归
int gcd(int m, int n)
{
while (n)
{
n = m^n;
m = m^n;
n = (m^n)%m;
}
return m;
}