算法村第十三关——黄金关卡 互为质数(辗转相除->GCD-> 裴蜀定理->两数互质)

160 阅读1分钟

辗转相除->GCD-> 裴蜀定理->两数互质

辗转相除是:

简单来说,辗转相除就像是用一把尺子不断去量取两个数,每次都是用较小的那个数去量较大的数,然后记录下余数。当余数变成零时,那么较小的那个数就是这两个数的最大公约数。

GCD

int gcd(int a, int b) { // 循环实现最大公约数算法
    int k = 0; // 用于存储余数的变量
    
    do {
        k = a % b; // 得到a除以b的余数
        a = b;     // 根据辗转相除法,把b的值赋给a
        b = k;     // 把余数赋给b
    } while (k != 0); // 当余数为0时,退出循环
    
    return a; // 返回a作为最大公约数
}

裴蜀定理

给定的两个整数a和b,存在整数x和y,使得它们的最大公约数(GCD)等于ax + by。
从这个定理推导出,如果GCD(a, b)等于1,那么a和b是互质的,因为它们没有共同的正因子。

一个不严谨的推导:

  1. 假设a和b的最大公约数等于1,即GCD(a, b) = 1。
  2. 根据裴蜀定理,存在整数x和y,使得1 = ax + by。
  3. 现在考虑a和b的因子。如果a和b有共同的正因子(大于1的因子),那么它们的最大公约数不可能等于1。因为最大公约数是它们共同的因子中最大的一个。
  4. 由于GCD(a, b)等于1,说明a和b没有共同的正因子,除了1。
  5. 因此,a和b没有共同的正因子,它们是互质的。

两数互为质数

public static boolean areCoPrimes(int num1, int num2) { 
    int greatestCommonDivisor = gcd(num1, num2); 
    return greatestCommonDivisor == 1; }