Factoring
針對大型半素數優化 Pollard 的 Rho 算法
我使用 C++ 和 GMP 庫編寫了 Pollard 的 Rho 因式分解算法的實現。
大數字時它相當快,但是我沒有實現任何形式的循環檢測(我只是試圖避免這個問題,見下文),它在小數字上掙扎。
這是我的實現的虛擬碼:
輸入 n x = 2 y = 2 d = 1 c = 1 z = 1 失敗 = 0 溫度 = 0 而 d == 1 或 d == n z = 1 失敗 = 失敗 + 1 如果失敗 = sqrt(n) c = c + 1 失敗 = 0 重複 100 次: x = x^2 + c mod n 重複兩次: y = y ^ 2 + c mod n 溫度 = 絕對(x - y) z = z * 溫度 d = gcd(z, n)
我想知道如何提高這個算法的效率?如果我使用大半素數,我需要擔心循環檢測嗎?
不妨將此作為答案,足夠的評論。這將回答您的最新問題:
- 我不認為它們必須從 2 開始,但是它們需要從相同的值開始(根據循環檢測算法)。所以 2 是最簡單的選擇,並且由於假設該函式跟踪偽隨機序列,所以從哪裡開始並不重要。
- 該函式可以是任何滿足 Rho 屬性的偽隨機函式(gcd 通過迭代它是守恆的,基本上,只要您擷取一個因子,它就會固有地“記住” $ n $ 無需儲存所有數字,這是核心概念)。但 $ x^2 + c $ 是最簡單的一個,所以它通常是最好的選擇,因為它計算速度很快,並且產生了一個相對混亂的序列模型 $ p $ .
- $ c $ 可以是負數,因為函式取模 $ n $ ,所以負值仍然是正的,但它不能是 $ 0 $ 或者 $ −2 $ (為了防止瑣碎的循環 $ x = 0 $ 和 $ x = \pm 1 $ ).
- 是的,我說“按順序”,這是一種機率算法,所以它通常要麼少一點,要麼多一點..這取決於 $ c $ 和找到的因素。這個想法是它在小因素上非常快(最大約 20 位數的素數,所以我想說 40-50 位數的半素數是您在合理時間內使用 Pollard 的 Rho 得到的最好結果,考慮到這仍然是相當不錯的它的簡單性)