對Pollard s Rho演算法的理解

2021-06-22 19:38:10 字數 867 閱讀 1448

之前曾經碰到過要用到pollard's rho演算法的題目,不過當時沒有學這個演算法,只是備忘了一下,這兩天沒事幹把這個算法學了。wiki上說這個演算法是乙個通用的因數分解演算法,對於分解因子較小的組合數特別有用。

對於乙個正整數n,在一般情況下,我們主要使用的是列舉1到n^(1/2)來求n的因子,所以演算法複雜度是o(n^(1/2))。但是實際上有更好的辦法,那就是pollard's rho演算法,這個演算法是乙個隨機化的演算法,簡單的說不是完全靠譜,一般我們認為它的平均演算法複雜度是o(n^(1/4)),在64位範圍內都是很開心的。

這個演算法應用了乙個非常神奇的思想——birthday trick。對於乙個特定的目標值aim,簡單的一次隨機企圖命中它的概率是1/n,但是隨機抽取k個值,這k個值中某兩個值的差值命中aim的概率卻在k約為n^(1/2)時達到1/2。如果我們視n的因子為aim(如果有的話),便可以用這個方法找到它了。

實際上上述演算法的複雜度是o(n),因為有k=n^(1/2)。又總共要比較k*k/2次。於是要優化。這裡乙個重要的思路是對於乙個合數n,設p和q是它的兩個因子,那麼n與p的倍數和q的倍數有最大公約數大於1(為p或q)。現在我們只要要求k個隨機值中某兩個數的差值是p或q的倍數就行了。然後就有k的取值下降到n^(1/4),具體怎麼算出來的我看不懂,就不深究了。

第二個重要優化是如何儲存k個數,實際上沒有必要儲存下來,因為它們是隨機數,我們只要用乙個隨機函式不斷生成它們就好了,這裡一般用f(x) = (x * x + a)  mod n來生成偽隨機數。注意到這裡我們放棄了兩兩比較k個數,只是比較k個數中相鄰的兩個,這樣也可以?我不知道。

在下來的乙個問題是f的生成序列有可能是乙個環,這就要求我們再加乙個floyd的演算法來判環。

這樣就有乙個可以在o(n^(1/4))時間內有1/2概率找出n的因子的演算法了。

演算法 對貪 演算法對研究

貪 演算法是 種求近似解的思想。當能滿 部分最優解時就認為符合邏輯要求。還 找零 這個案例為例,考慮使 貪 演算法解題 如當找零數為 36 時,從硬幣數的最 值 20 開始填充,填充不下後再 10 來填充,以此類推,找到最優解。場景 假如有 1,5,10,20,50,100 的 幣 36 找零數 2...

對演算法的理解

明白了一些,資料結構與演算法,我覺得這應該是兩門科學吧 資料結構裡面有陣列,鍊錶,二叉樹,圖,佇列,棧,堆。這都是對c語言的,c 的我就不清楚了。演算法有回溯法,像n 皇后問題 分治法 像二分查詢,快速排序 貪心法 希望每一步的決策都是正確的,但是這僅是區域性的,結果可能並不是最優的,但是離最優也不...

對A 演算法的改進

對sunway程式中的bug所進行的修改 drew 對這個問題進行了如下修正,當子節點在open表和closed表中時,重新計算估價值後,刪除open表中的老的節點,將有新估價值的節點插入open表中,重新排序,經測試效果良好,修改的 如下,紅色部分為drew新增的 新增程序式的相應部分即可。在函式...