欧几里得算法

欧几里得算法

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)\) 的公约数。

接下来假设 \(d\)\((b,a \ mod \ b)\) 的一个公约数,将 \(r = a - kb\) 两边同时除以 \(d\),即:\(\frac{r}{d} = \frac{a}{d} - \frac{kb}{d}\).

由于 \(r = a \ mod \ b\),即 \(d\)\(r\) 的因子,那么等式右边一定是一个整数,又由于 \(d\)\(b\) 的约数,那么 \(\frac{kb}{d}\) 一定是一个整数,那么 \(\frac{a}{d}\) 也一定是一个整数,即 \(d\)\(a\) 的因子,也就是说 \(d\)\((a,b)\) 的公约数。

那么我们得到结论二:对于任意一个\((b,a\ mod\ b)\) 的公约数,他一定也是\((a,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);
}
posted @ 2021-01-30 12:21  nonameless  阅读(482)  评论(0编辑  收藏  举报