SEARCH

判斷兩數是否互質:深入解析與實踐指南

判斷兩數是否互質

在數論中,“互質”(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,那麼這兩個數就是互質的。

步驟:

  1. 列出第一個數 $a$ 的所有正因數。
  2. 列出第二個數 $b$ 的所有正因數。
  3. 找出所有同時出現在兩個因數列表中的數(即公因數)。
  4. 檢查公因數集合。如果集合中只有 1,則 $a$ 和 $b$ 互質。

缺點:對於較大的數字,列舉所有因數會非常耗時且效率低下。

2. 歐幾里得算法(輾轉相除法)

歐幾里得算法是計算最大公約數最常用且最高效的方法。它的原理是:兩個正整數 $a$ 和 $b$(假設 $a > b$)的最大公約數等於 $b$ 和 $a$ 除以 $b$ 的餘數的最大公約數。這個過程不斷重複,直到餘數為 0,此時除數就是最大公約數。

算法步驟:

  1. 設 $a$ 和 $b$ 是兩個非負整數,且 $a ge b$。
  2. 如果 $b = 0$,則 $gcd(a, b) = a$。
  3. 否則,$gcd(a, b) = gcd(b, a pmod b)$。
  4. 重複步驟 2 和 3,直到餘數為 0。

判斷互質的應用:只需計算 $gcd(a, b)$,如果結果為 1,則 $a$ 和 $b$ 互質。

歐幾里得算法示例:判斷 48 和 18 是否互質

我們要計算 $gcd(48, 18)$。

  1. $48 div 18 = 2$ 餘 $12$。所以 $gcd(48, 18) = gcd(18, 12)$。
  2. $18 div 12 = 1$ 餘 $6$。所以 $gcd(18, 12) = gcd(12, 6)$。
  3. $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)$。

  1. $23 div 17 = 1$ 餘 $6$。所以 $gcd(23, 17) = gcd(17, 6)$。
  2. $17 div 6 = 2$ 餘 $5$。所以 $gcd(17, 6) = gcd(6, 5)$。
  3. $6 div 5 = 1$ 餘 $1$。所以 $gcd(6, 5) = gcd(5, 1)$。
  4. $5 div 1 = 5$ 餘 $0$。所以 $gcd(5, 1) = 1$。

計算結果 $gcd(17, 23) = 1$。因為 GCD 為 1,所以 17 和 23 互質。

3. 質因數分解法

這種方法是先將兩個數分別進行質因數分解,然後比較它們的質因數。如果兩個數沒有共同的質因數,那麼它們就是互質的。

步驟:

  1. 將數 $a$ 分解為質因數的乘積。
  2. 將數 $b$ 分解為質因數的乘積。
  3. 比較兩個數的質因數集合。如果它們沒有任何共同的質因數,則 $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 等加密算法中,選擇互質的數字是算法安全性的基礎。