判斷一個數 n 是否為素數,最直觀的方法是嘗試除以 2 ~ n-1。優化到 n/2 容易理解:因為除數大於一半時商小於 2,不可能整除。但為什麼只需檢查到 √n 就夠了?
定理:若正整數 n 是合數,則它至少有一個質因數 ≤ √n。
n 是合數,可分解為 n = a × b,其中 1 < a ≤ b < n。a > √n 且 b > √n,則 a × b > √n × √n = n,矛盾。a ≤ √n。即**較小的因子必不超過 √n**。將因子對 (a, b) 視為矩形的長寬,面積固定為 n。當長寬相等時(即正方形),邊長為 √n。若一邊超過 √n,另一邊必小於 √n。所以只需檢查「短邊」範圍即可。
// 低效:檢查到 n-1
for (int i = 2; i < n; i++) ...
// 一般優化:檢查到 n/2
for (int i = 2; i <= n/2; i++) ...
// 最優:檢查到 √n
for (int i = 2; i * i <= n; i++) { // 避免浮點運算,用 i*i <= n
if (n % i == 0) return false;
}
return true;
| n 的量級 | 檢查到 n | 檢查到 n/2 | 檢查到 √n |
|---|---|---|---|
| 10⁴ | 10,000 次 | 5,000 次 | 100 次 |
| 10⁶ | 1,000,000 次 | 500,000 次 | 1,000 次 |
| 10⁹ | 10⁹ 次 | 5×10⁸ 次 | 31,623 次 |
理解 √n 邊界的數學本質,不僅能寫出高效的素數判斷,更能啟發解決其他因數分解類問題的思路。