欧几里得算法
作者:互联网
欧几里得算法
1. 算法简介
欧几里得算法是用来求解两个正整数的最大公约数(Greatest Common Divisor)的算法。
2. 算法过程
来源于百度百科。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
3. 算法证明
证明:\(gcd(a, \ b) = gcd(b,\ a \ \ mod \ \ b)\) 。
假设 \(a = kb + r\)。(\(a, b, k, r\) 都是正整数,且 \(r < b\))
那么 \(r = a \ \ mod \ \ b\)。
假设 \(d\) 是 \(a, \ b\) 的一个公约数,而 \(r = a - kb\)。
那么有 \(\frac{r}{d} = \frac{a}{d} - \frac{kb}{d} = m\)。由等式右边可知:\(m\) 是一个正整数。
因此 \(d\) 是 \(r\) 的因子,也就是说 \(d\) 是 \(b\) 和 \((a \ \ mod \ \ b)\) 的公约数。
因此 \((a, \ b)\) 和 \((b,\ a \ \ mod \ \ b)\) 的公约数是一样的,即 \(gcd(a, \ b) = gcd(b,\ a \ \ mod \ \ b)\) 成立。
4. 具体代码
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
标签:正整数,gcd,欧几里得,最大公约数,615,算法,mod 来源: https://www.cnblogs.com/nonameless/p/14348649.html