判斷兩數是否互質
在數論中,“互質”(coprime,或 relatively prime)是一個非常重要的概念,它描述了兩個整數之間的一種特殊關係。當兩個整數除了 1 之外,沒有其他公因數時,我們就稱這兩個數互質。這個概念在密碼學、數論算法以及程式設計中都有廣泛的應用。
什麼是互質?
兩個正整數 $a$ 和 $b$ 被稱為互質,如果它們的最大公約數(Greatest Common Divisor, GCD)為 1。也就是說,gcd(a, b) = 1。
這意味著,除了 1 之外,沒有任何大於 1 的整數可以同時整除 $a$ 和 $b$。如果兩個數不互質,那麼它們至少有一個大於 1 的公因數。
互質的例子:
- 6 和 35 是互質的。
- 6 的因數是:1, 2, 3, 6
- 35 的因數是:1, 5, 7, 35
- 它們唯一的公因數是 1,所以 6 和 35 互質。gcd(6, 35) = 1。
- 10 和 21 是互質的。
- 10 的因數是:1, 2, 5, 10
- 21 的因數是:1, 3, 7, 21
- 它們唯一的公因數是 1,所以 10 和 21 互質。gcd(10, 21) = 1。
- 15 和 25 不是互質的。
- 15 的因數是:1, 3, 5, 15
- 25 的因數是:1, 5, 25
- 它們的公因數有 1 和 5。由於存在大於 1 的公因數 5,所以 15 和 25 不互質。gcd(15, 25) = 5。
判斷兩數是否互質的方法
判斷兩數是否互質的核心在於計算它們的最大公約數 (GCD)。如果 GCD 為 1,則兩數互質;否則不互質。以下是幾種常用的方法來計算 GCD,進而判斷是否互質:
1. 窮舉法(列舉因數法)
這種方法是最直觀的。我們分別列出兩個數的所有正因數,然後找出它們的公因數。如果唯一的公因數是 1,那麼這兩個數就是互質的。
步驟:
- 列出第一個數 $a$ 的所有正因數。
- 列出第二個數 $b$ 的所有正因數。
- 找出所有同時出現在兩個因數列表中的數(即公因數)。
- 檢查公因數集合。如果集合中只有 1,則 $a$ 和 $b$ 互質。
缺點:對於較大的數字,列舉所有因數會非常耗時且效率低下。
2. 歐幾里得算法(輾轉相除法)
歐幾里得算法是計算最大公約數最常用且最高效的方法。它的原理是:兩個正整數 $a$ 和 $b$(假設 $a > b$)的最大公約數等於 $b$ 和 $a$ 除以 $b$ 的餘數的最大公約數。這個過程不斷重複,直到餘數為 0,此時除數就是最大公約數。
算法步驟:
- 設 $a$ 和 $b$ 是兩個非負整數,且 $a ge b$。
- 如果 $b = 0$,則 $gcd(a, b) = a$。
- 否則,$gcd(a, b) = gcd(b, a pmod b)$。
- 重複步驟 2 和 3,直到餘數為 0。
判斷互質的應用:只需計算 $gcd(a, b)$,如果結果為 1,則 $a$ 和 $b$ 互質。
歐幾里得算法示例:判斷 48 和 18 是否互質
我們要計算 $gcd(48, 18)$。
- $48 div 18 = 2$ 餘 $12$。所以 $gcd(48, 18) = gcd(18, 12)$。
- $18 div 12 = 1$ 餘 $6$。所以 $gcd(18, 12) = gcd(12, 6)$。
- $12 div 6 = 2$ 餘 $0$。所以 $gcd(12, 6) = 6$。
計算結果 $gcd(48, 18) = 6$。因為 GCD 不為 1,所以 48 和 18 不互質。
歐幾里得算法示例:判斷 17 和 23 是否互質
我們要計算 $gcd(17, 23)$。為了方便,我們將較大的數放在前面,即 $gcd(23, 17)$。
- $23 div 17 = 1$ 餘 $6$。所以 $gcd(23, 17) = gcd(17, 6)$。
- $17 div 6 = 2$ 餘 $5$。所以 $gcd(17, 6) = gcd(6, 5)$。
- $6 div 5 = 1$ 餘 $1$。所以 $gcd(6, 5) = gcd(5, 1)$。
- $5 div 1 = 5$ 餘 $0$。所以 $gcd(5, 1) = 1$。
計算結果 $gcd(17, 23) = 1$。因為 GCD 為 1,所以 17 和 23 互質。
3. 質因數分解法
這種方法是先將兩個數分別進行質因數分解,然後比較它們的質因數。如果兩個數沒有共同的質因數,那麼它們就是互質的。
步驟:
- 將數 $a$ 分解為質因數的乘積。
- 將數 $b$ 分解為質因數的乘積。
- 比較兩個數的質因數集合。如果它們沒有任何共同的質因數,則 $a$ 和 $b$ 互質。
質因數分解法示例:判斷 12 和 35 是否互質
數 12 的質因數分解:$12 = 2 imes 2 imes 3$ (或 $2^2 imes 3$)
數 35 的質因數分解:$35 = 5 imes 7$
比較質因數集合:12 的質因數是 {2, 3},35 的質因數是 {5, 7}。它們沒有共同的質因數,所以 12 和 35 互質。
質因數分解法示例:判斷 20 和 28 是否互質
數 20 的質因數分解:$20 = 2 imes 2 imes 5$ (或 $2^2 imes 5$)
數 28 的質因數分解:$28 = 2 imes 2 imes 7$ (或 $2^2 imes 7$)
比較質因數集合:20 的質因數是 {2, 5},28 的質因數是 {2, 7}。它們有共同的質因數 2,所以 20 和 28 不互質。
缺點:對於非常大的數,質因數分解可能非常困難,是計算機科學中最難解決的問題之一(大數質因數分解難度是 RSA 加密算法的基礎)。因此,在實際應用中,歐幾里得算法通常是首選。
互質的性質和應用
- 質數的性質:任意兩個不同的質數都是互質的。例如,5 和 7 互質,11 和 13 互質。
- 一個質數和一個非其倍數的合數:一個質數 $p$ 和一個不是 $p$ 的倍數的合數 $n$ 總是互質的。例如,7 和 15 互質,因為 15 不是 7 的倍數。
- 連續整數:任意兩個連續的整數 $n$ 和 $n+1$ 都是互質的。這是因為 $gcd(n, n+1) = gcd(n, (n+1) - n) = gcd(n, 1) = 1$。
- 應用於密碼學:在 RSA 公鑰加密算法中,需要選擇兩個大質數 $p$ 和 $q$,然後計算它們的乘積 $N = pq$。公鑰中的指數 $e$ 需要與 $phi(N) = (p-1)(q-1)$ 互質。
- 應用於程式設計:在編寫程式時,我們經常需要判斷兩個數字是否具有公因數,例如在簡化分數時,需要找到分子和分母的最大公約數,然後用它們分別除以最大公約數,使得分數化為最簡形式。這就隱含了互質的概念。
判斷互質在程式中的實現
在大多數程式語言中,都有內建的函數或可以輕鬆實現的函數來計算最大公約數,例如 Python 中的 `math.gcd()` 函數。
以下是一個使用 Python 判斷兩數是否互質的簡單範例:
import math
def are_coprime(a, b):
"""
判斷兩個非負整數 a 和 b 是否互質。
"""
if a < 0 or b < 0:
raise ValueError("輸入必須為非負整數。")
return math.gcd(a, b) == 1
# 測試
num1 = 15
num2 = 28
if are_coprime(num1, num2):
print(f"{num1} 和 {num2} 是互質的。")
else:
print(f"{num1} 和 {num2} 不是互質的。")
num3 = 12
num4 = 18
if are_coprime(num3, num4):
print(f"{num3} 和 {num4} 是互質的。")
else:
print(f"{num3} 和 {num4} 不是互質的。")
常見問題 (FAQ)
如何快速判斷兩個數字是否互質?
最快、最常用的方法是利用歐幾里得算法(輾轉相除法)計算它們的最大公約數 (GCD)。如果計算得到的 GCD 為 1,那麼這兩個數字就是互質的;如果 GCD 大於 1,則它們不是互質的。這個方法對於較大的數字也同樣高效。
為何兩個連續的整數總是互質?
因為如果存在一個大於 1 的公因數 $d$ 同時整除 $n$ 和 $n+1$,那麼 $d$ 也必須整除它們的差,即 $(n+1) - n = 1$。然而,唯一能整除 1 的正整數只有 1。因此,任何大於 1 的公因數都不可能存在,所以 $n$ 和 $n+1$ 的最大公約數一定是 1,它們互質。
判斷互質與判斷質數有何區別?
判斷一個數是否為質數,是指判斷這個數本身是否只能被 1 和它本身整除。而判斷兩個數是否互質,是指判斷這兩個數除了 1 之外,是否沒有其他共同的因數。一個質數和一個非其倍數的合數可以互質,但這個合數本身不是質數。例如,5 是質數,15 不是質數,但 5 和 15 不互質(GCD=5);然而,5 和 14 互質,因為 14 不是 5 的倍數。
在程式設計中,為什麼要判斷兩數是否互質?
判斷兩數是否互質在程式設計中有多種應用。最常見的包括:
- 分數簡化:將分數化為最簡形式時,需要找到分子和分母的最大公約數,然後將它們同時除以該數。
- 演算法優化:在一些圖論或組合學的演算法中,需要判斷兩個節點或兩個狀態之間的關係,互質的概念有時會被用來簡化或識別特定的結構。
- 密碼學應用:如前所述,在 RSA 等加密算法中,選擇互質的數字是算法安全性的基礎。

