大數因數分解Pollard_rho 演算法
阿新 • • 發佈:2019-01-07
大數分解最簡單的思想也是試除法,這裡就不再展示程式碼了,就是從2到sqrt(n),一個一個的試驗,直到除到1或者迴圈完,最後判斷一下是否已經除到1了即可。
但是這樣的做的複雜度是相當高的。一種很妙的思路是找到一個因子(不一定是質因子),然後再一路分解下去。這就是基於Miller_rabin的大數分解法Pollard_rho大數分解。
Pollard_rho演算法的大致流程是 先判斷當前數是否是素數(Miller_rabin)了,如果是則直接返回。如果不是素數的話,試圖找到當前數的一個因子(可以不是質因子)。然後遞迴對該因子和約去這個因子的另一個因子進行分解。
那麼自然的疑問就是,怎麼找到當前數n的一個因子?當然不是一個一個慢慢試驗,而是一種神奇的想法。其實這個找因子的過程我理解的不是非常透徹,感覺還是有一點兒試的意味,但不是盲目的列舉,而是一種隨機化演算法。我們假設要找的因子為p,他是隨機取一個x1,由x1構造x2,使得{p可以整除x1-x2 && x1-x2不能整除n}則p=gcd(x1-x2,n),結果可能是1也可能不是1。如果不是1就找尋成功了一個因子,返回因子;如果是1就尋找失敗,那麼我們就要不斷調整x2,具體的辦法通常是x2=x2*x2+c(c是自己定的)直到出現x2出現了迴圈==x1了表示x1選取失敗重新選取x1重複上述過程。(似乎還存在一個每次找尋範圍*2的優化,但是不太懂。。。)
這個地方我是不太會做的。