欧几里得算法的原理
欧几里得算法(Euclidean Algorithm),也称为辗转相除法,是一种用于计算两个整数最大公约数(GCD,Greatest Common Divisor)的经典方法。其核心原理基于一个简单的数学定理:**两个整数的最大公约数等于其中较小的一个数和两数相除余数的最大公约数**。通过反复应用这一性质,算法能够快速、高效地找到两个数的最大公约数。
基本原理
设有两个正整数 (a) 和 (b)(假设 (a > b)),欧几里得算法的核心等式是:GCD(a,b)=GCD(b,amodb)
其中,(a mod b) 表示 (a) 除以 (b) 的余数。这一等式成立的理由是:
- 如果 (d) 是 (a) 和 (b) 的公约数(即 (d \mid a) 且 (d \mid b)),那么 (d) 也能整除 (a mod b)。
- 因为 (a mod b = a - k*b)(其中 (k) 是 (a / b) 的商),若 (d) 能整除 (a) 和 (b),则 (d) 也能整除 (a - k * b),即 (d | (a mod b))。
- 因此,(a) 和 (b) 的所有公约数也是 (b) 和 (a \mod b) 的公约数,反之亦然,最终两者的最大公约数相等。
通过不断迭代这一过程,算法将问题规模逐步缩小,直到余数为 0。此时,(\text{GCD}(a, 0) = a),因为任何数与 0 的最大公约数是它本身。
算法过程
- 初始条件:给定两个正整数 (a) 和 (b)(假设 (a > b))。
- 迭代步骤:
- 结果:最后得到的 (a) 即为 (a) 和 (b) 的最大公约数。
举例说明
以 (a = 48) 和 (b = 18) 为例:
- GCD(48,18)
- 48 mod 18=12 (因为 48=2×18+12)
- 转换为 GCD(18,12)。
- GCD(18,12)
- 18 mod 12=6(因为 18=1×12+6)
- 转换为 GCD(12,6)
- GCD(12,6)
- 12 mod 6=0(因为 12=2×6+0)
- 转换为 GCD(6,0)
- GCD(6,0)=6
因此,GCD(48, 18) = 6。
为什么正确?
欧几里得算法的正确性依赖于以下两点:
- 公约数不变性:每一步中,GCD(a, b) = GCD(b, a mod b)),最大公约数在迭代过程中始终保持不变。
- 必然终止:由于 (a mod b < b),每次迭代使 (b) 的值减小,最终 (b) 会变为 0,算法停止。
总结
欧几里得算法的原理是通过不断取余数,将求两个数的最大公约数转化为一个更小规模的等价问题,最终简化为一个数的最大公约数(即当余数为 0 时)。其数学基础是公约数的传递性,效率则来源于问题规模的对数级缩小。这一简单而优雅的方法不仅适用于基础的 GCD 计算,还为更复杂的数论问题奠定了基础。
迭代代码实现:
public class Main {
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
public static void main(String[] args) {
int a = 48;
int b = 18;
System.out.println("最大公约数是: " + gcd(a, b)); // 输出 6
}
}
递归代码实现:
public class Main {
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
int a = 48;
int b = 18;
System.out.println("最大公约数是: " + gcd(a, b)); // 输出 6
}
}