最大公約數演算法

最大公約數(Greatest Common Divisor, GCD)演算法是用來找出兩個或更多整數的最大公約數。這裡介紹幾種常見的GCD演算法:

  1. 循環除法(Euclidean Algorithm): 這是最常用的GCD演算法,由歐幾里得提出。演算法的思路是將較大的數不斷除以較小的數,直到得到的最小非負餘數為0。此時,較小的數就是兩個數的最大公約數。

    def gcd(a, b):
        while b != 0:
            a, b = b, a % b
        return a
  2. 質因數分解法: 將兩個數分別分解成質因數的乘積,然後找出共同的質因數,將它們的次方取最小值,最後將這些質因數相乘得到最大公約數。

    def gcd(a, b):
        prime_factors_a = []
        prime_factors_b = []
        for factor in range(2, int(a**0.5) + 1):
            if a % factor == 0:
                prime_factors_a.append(factor)
                while a % factor == 0:
                    a //= factor
                if b % factor == 0:
                    prime_factors_b.append(factor)
        if a != 1:
            prime_factors_a.append(a)
        if b != 1:
            prime_factors_b.append(b)
        return functools.reduce(lambda x, y: x * y, [min(prime_factors_a.count(p), prime_factors_b.count(p)) * p for p in set(prime_factors_a + prime_factors_b)])
  3. 快速GCD演算法(Stein's Algorithm): 這是一個優化過的GCD演算法,當兩個數字相差很大時,這個演算法會比循環除法更快。

    def gcd(a, b):
        if a == 0:
            return b
        return gcd(b % a, a)

這些演算法中,Euclidean Algorithm是最簡單也是最常用的,而質因數分解法則適用於當兩個數字非常大,且有很多質因數時。快速GCD演算法則是在特定情況下效率更高的選擇。選擇哪種演算法取決於具體的應用場景和數字的性質。