← 回首頁

數學與位元(質數篩 / GCD / 數 1 位元)

電腦處理數字時常需要幾樣「底層基本功」:找出質數、求兩數的最大公因數、數一個數的二進位裡亮著幾個 1。這頁把三招最經典的技巧擺在一起:質數篩像在點名冊上把每個號碼的倍數一個個劃掉,最後沒被劃到的就是質數;輾轉相除法像拿長短兩根繩子反覆截去較短的那一段,剩下的長度就是能同時整除兩數的最大單位;數 1 位元則靠一個巧招,每次一口氣抹掉最右邊那個 1。下面你會看到三者各自的動畫與逐步過程。

三個數論與位元操作的基礎技巧:

1. 埃拉托斯特尼質數篩(Sieve of Eratosthenes,n=50)

初始化 1..n 全部視為候選質數;p 從 2 到 √n,若 p 尚未被劃掉即為質數,劃掉 p² 起、間隔 p 的所有倍數(合數); p 迴圈結束後,掃尾把 √n 以上仍未被劃掉的數字一併加入質數清單。

固定示範:n=50(1..50 排成 10 欄)
劃掉操作數:0 目前 p:
綠色(prime)為已確認的質數;灰色刪除線(crossed)為已被劃掉的合數格。 統計數字為「劃掉操作數」,並非唯一合數個數——同一個合數可能被多個不同質數各劃一次 (例如 30 會分別被 2、3、5 劃掉各一次),因此劃掉操作數會大於實際合數個數。

已確認的質數清單

2. 輾轉相除法(Euclidean Algorithm,GCD,252 與 105)

建立步驟表 [a, b, a mod b];只要 b ≠ 0,就計算 r = a mod b,並把 (a, b) 更新為 (b, r) 再新增一列; 當 b = 0 時迴圈結束,此時的 a 即為兩數的最大公因數。

固定示範(同 gcd.test.js GCD_PAIR):a=252, b=105 → 252=2·105+42 → 105=2·42+21 → 42=2·21+0 → GCD=21
步驟數:0
每一列為一次 a mod b 運算;藍色外框(active)標示本步新增的整列 [a, b, a mod b]。

最大公因數(GCD)

計算中

3. 數 1 位元(Brian Kernighan's Algorithm,n=173)

只要 n ≠ 0,就令 n ← n & (n-1),每次恰好清除最低位的 1,count 加一;當 n 歸零時,count 即為原始 二進位中 1 的個數。迭代次數等於 1 的個數 k,比逐位元檢查更快。

固定示範(同 count-ones.test.js COUNT_ONES_N):n=173(二進位 10101101,5 個 1)
已清除位數:0
反白(active)為本步 n & (n-1) 牽涉到的位(含借位鏈示意):其中只有最低位的 1 真正從 1 變成 0, 其餘同時反白的尾端 0 只是借位運算中會被翻轉、AND 後又立刻歸零的示意位,本身數值並未真正改變。

目前 count

0

n 的變化歷史(二進位)