在 C 語言中判斷一個整數 i 是否為素數時,初學者常會寫成 for(j=2; j,但這樣的時間複雜度是 O(n)。實際上,我們只需要檢查到 sqrt(i) 即可,大幅降低計算量。
假設 i = a × b,其中 a ≤ b,那麼 a ≤ √i ≤ b。若 i 有因數,必定存在一個因數 ≤ √i。因此,若在 2 到 √i 之間找不到任何因數,i 必為素數。
for (j = 2; j <= sqrt((double)i); j++) {
if (i % j == 0) y = 0; // 發現因數,非素數
}
(double) 強制轉型是為了讓 sqrt() 接收浮點數參數,避免整數除法導致精度損失。這裡的 y 作為旗標,初始為 1(假設為素數),一旦發現能整除即設為 0。
以判斷 10,000 以內的素數為例:
j < i:約需 5,000 萬次迴圈j <= sqrt(i):僅需約 60 萬次迴圈效能提升超過 80 倍,這在大規模素數篩選中極為關鍵。
原始程式碼進一步應用此演算法,嘗試將偶數 a 分解為兩個素數之和(i + d = a),同樣利用 sqrt 優化雙重素數檢測。