Pollard Rho 大整數分解

http://www.cnblogs.com/jackiesteed/articles/2019910.html

1975年,John M. Pollard提出了第二種因數分解的方法。Pollard rho因數分解方法基於下列幾點:

(1) 假定有兩個整數 和 使得p可以整除-,但是n不能整除 。

(2) 可以證明 。因爲p可以整除,可以寫成 。但是,因爲n不能整除-,很明顯q不能整除n。這就表明 既可以是1也可以是n的一個因數。

下列算法重複選擇,直到求出一個合適的對。

(1) 選擇,一個小的隨機整數稱爲種子。

(2) 運用函數算出,使得n不能整除 。這裏所用的一個函數也許就是 =  (a通常選作1)。

(3) 計算 。如果它不是1,結果是n的一個因數;如果它是1,返回到步驟1並用重複這個過程。現在我們計算 。注意,在下一輪中,我們以開始,如此這般。如果我們運用Pollard rho算法列出x的值,就會發現最終要重複的這個值,創建一個和希臘字母rho ( )一樣的形狀,如圖9-3所示。

圖9-3 Pollard rho連續數

爲了減少反覆的次數,算法做了一些改進。該算法用數對( , )開始,並且用 ,迭代計算 。在每一次迭代中,我們都應用上述函數式運算(從第二步)第一次計算數對中的第一個元素,第二次計算數對中的第二個元素(參看算法9.6)。

算法 9.6 Pollard rho方法的僞代碼

複雜度 這種方法需要算術運算 。不過,因爲我們希望p小於或等於 ,我們希望做 算術運算。這就是說比特操作複雜度是 ,它是指數增長的。

http://blog.sina.com.cn/s/blog_86a9d97201015cj7.html

大整數分解現在任然是個世界級的難題,但卻依舊是個非常重要的研究方向,大整數在公共密鑰的研究上有着重要的作用。

    而對於大整數的分解有很多種算法,性能上各有優異,比如大整數分解的Fermat方法,Pollard rho方法,試除法,以及橢圓曲線法,連分數法,二次篩選法,數域分析法等等。這裏,我主要講解其中兩種算法的原理和操作。
    首先,對於任意的一個偶數,我們都可以提取出一個2的質因子,如果結果仍爲偶數,則可繼續該操作,直至將其化爲一個奇數和2的多少次冪的乘積,那麼我們可以假定這個奇數可以被表示成2*N+1,如果這個數是合數,那麼一定可以寫成N=c*d的形式,不難發現,式中的c和d都是奇數,不妨設c>d,我們可以令a=(c+d)/2,b=(c-d)/2,那麼的可以得到N=a*a-b*b,而這正是Fermat整數分解的基礎;由不等式的關係,我們又可以得到a>=sqrt(c*d)=sqrt(N),那麼,我們就可以枚舉大於N的完全平方數a*a,計算a*a-N的值,判斷計算的結果是否爲一個完全平方數,如果是,那麼a,b都是N的因子,我們就可以將算法遞歸的進行下去,知道求出N的所有質因子。
    容易看出,Fermat分解大數的效率其實並不高,但是比起試除法要好了很多;而且每次的計算都是計算出N的一個因子,更加降低了其效率。這就讓我們想着去嘗試新的算法,那就是Pollard rho算法。
    Pollard rho算法的原理就是通過某種方法得到兩個整數a和b,而待分解的大整數爲n,計算p=gcd(a-b,n),直到p不爲1,或者a,b出現循環爲止。然後再判斷p是否爲n,如果p=n成立,那麼返回n是一個質數,否則返回p是n的一個因子,那麼我們又可以遞歸的計算Pollard(p)和Pollard(n/p),這樣,我們就可以求出n的所有質因子。
    具體操作中,我們通常使用函數x2=x1*x1+c來計算逐步迭代計算a和b的值,實踐中,通常取c爲1,即b=a*a+1,在下一次計算中,將b的值賦給a,再次使用上式來計算新的b的值,當a,b出現循環時,即可退出進行判斷。
    在實際計算中,a和b的值最終肯定一出現一個循環,而將這些值用光滑的曲線連接起來的話,可以近似的看成是一個ρ型的。
    對於Pollard rho,它可以在O(sqrt(p))的時間複雜度內找到n的一個小因子p,可見效率還是可以的,但是對於一個因子很少、因子值很大的大整數n來說,Pollard rho算法的效率仍然不是很好,那麼,我們還得尋找更加的方法了。






發佈了62 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章