最大公约数(Greatest Common Divisor, GCD)是指两个或多个整数共有约数中最大的一个。计算最大公约数最常用的算法是欧几里得算法(又称辗转相除法),其核心思想基于以下性质:
如果 a 和 b 是两个正整数,那么 gcd(a, b) = gcd(b, a mod b),当 b = 0 时,gcd(a, 0) = a。
💻 Java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/** * 使用欧几里得算法计算两个数的最大公约数(GCD) * @param a 第一个整数 * @param b 第二个整数 * @return 两个数的最大公约数 */ publicstaticintgcd(int a, int b) { // 取绝对值以处理负数 a = Math.abs(a); b = Math.abs(b); // 欧几里得算法核心逻辑 while (b != 0) { inttemp= b; b = a % b; a = temp; } return a; }
📝 算法分析
时间复杂度:O(log(min(a, b))),因为每次迭代,较大的数至少减少一半
空间复杂度:O(1),只使用了常数额外空间
应用场景:分数简化、求解线性同余方程、密码学算法等
🔍 最小公倍数(LCM)
🎨 核心思想
最小公倍数(Least Common Multiple, LCM)可以通过最大公约数计算,公式为:
LCM(a, b) = |a × b| / GCD(a, b)
这个公式基于以下原理:两个数的乘积等于它们的最大公约数和最小公倍数的乘积。
💻 Java实现
1 2 3 4 5 6 7 8 9 10 11 12 13
/** * 计算两个数的最小公倍数(LCM) * LCM(a,b) = |a*b| / GCD(a,b) * @param a 第一个整数 * @param b 第二个整数 * @return 两个数的最小公倍数 */ publicstaticintlcm(int a, int b) { if (a == 0 || b == 0) { return0; // 0和任何数的最小公倍数为0 } return Math.abs(a * b) / gcd(a, b); }
/** * 计算一个数的欧拉函数值(小于n且与n互质的正整数的个数) * @param n 输入整数 * @return n的欧拉函数值 */ publicstaticinteulerTotient(int n) { if (n <= 0) { return0; } intresult= n; // 分解质因数并应用欧拉函数公式 for (intp=2; p * p <= n; p++) { if (n % p == 0) { // p是素因数 while (n % p == 0) { n = n / p; } result -= result / p; } } // 如果n本身是素数 if (n > 1) { result -= result / n; } return result; }
📝 算法分析
时间复杂度:O(√n)
空间复杂度:O(1)
应用:密码学中的RSA算法、模运算中的逆元计算等
🔍 互质数判断
🎨 核心思想
两个数互质当且仅当它们的最大公约数为1。因此,可以通过计算两个数的GCD来判断它们是否互质。
💻 Java实现
1 2 3 4 5 6 7 8 9
/** * 判断两个数是否互质 * @param a 第一个整数 * @param b 第二个整数 * @return 如果a和b互质返回true,否则返回false */ publicstaticbooleanareCoprime(int a, int b) { return gcd(a, b) == 1; }
📝 算法分析
时间复杂度:与GCD算法相同,为O(log(min(a, b)))
空间复杂度:O(1)
🔍 扩展欧几里得算法
🎨 核心思想
扩展欧几里得算法是欧几里得算法的扩展,它不仅计算两个数的GCD,还能找到整数x和y,使得 ax + by = gcd(a, b)(贝祖定理)。这个算法在求解线性同余方程和计算模逆元等方面有重要应用。