Pollard Rho因子分解算法


  有一類問題,要求我們將一個正整數x,分解為兩個非平凡因子(平凡因子為1與x)的乘積x=ab。

  顯然我們需要先檢測x是否為素數(如果是素數將無解),可以使用Miller-Rabin算法來進行測試。

  Pollard Rho是一個非常玄學的方式,用於在O(n^1/4)的期望時間復雜度內計算合數n的某個非平凡因子。事實上算法導論給出的是O(√p),p是n的某個最小因子,滿足p與n/p互質。但是這些都是期望,未必符合實際。但事實上Pollard Rho算法在實際環境中運行的相當不錯。

  Pollard Rho利用偽隨機數生成公式來提供待測因子,其公式為xi=xi-1^2+c(mod n),其中c是開始時確認的隨機常數。我們只要給出x1,利用這個公式可以生成一系列數值。由於每個數完全依賴於前一個數,因此數值的分布中必定含環,我們設t為環的路口,u為環的周長,那么有xt+i=xt+u+i。而整個數值分布就像一個ρ符號,因此該算法的后綴用Rho來表示。我們將該公式得出的序列視作隨機序列。

  生日悖論中指出一個√d個學生的班級中,期望至少有一對人在同一天生日,其中d是一年中的日期,即365。同樣一個√d個人的班級中,至少有一對人在同一天生日的概率大於50%。我們將n視作一年中的天數,而1~n-1中的每個值都對應一年中的日期,將x1,x2,...視作學生,那么序列中期望有兩個有兩個人相同,只需要序列的長度達到√n即可。因此我們可以認為ρ符號的尾部與環的周長的期望均為√n。

  假設n=ab,其中a與b均不是n的平凡因子,我們假設a<=b,可知a<=√n。我們記yi=xi(mod a)。可知:

$$ y_i=x_i\left(mod\ a\right)=\left(x_{i-1}^2+c\right)\left(mod\ n\right)\left(mod\ a\right)=\left(x_{i-1}^2+c\right)\left(mod\ a\right) $$ $$ =\left(\left(x_{i-1}\left(mod\ a\right)\right)^2+c\right)\left(mod\ a\right)\Rightarrow\left(y_{i-1}^2+c\right)\left(mod\ a\right)=y_i\left(mod\ a\right) $$

  我們依據a為模數建立了新的一個ρ型軌跡,且a的ρ型軌跡的環必然僅出現n的ρ型軌跡的環上的數值(模a的結果)。由同樣的分析可得a的ρ型軌跡的環的尾部和環的長度的期望均為n^(1/4)。對於a的ρ型軌跡的環上的任意一點k,假設其對應的是兩個不同的值xi與xj,即xi<>xj(mod n)但xi=xj(mod a)。此時可以知(xi-xj)=rp(mod n),而gcd(xi-xj, n)的結果必然是n的一個非平凡因子(且能被a整除)。我們可以利用一個特定的變量p先后在迭代到x1,x2,x4,x8,...時記錄這些值,之后每次都校驗gcd(xi-p, n)是否既非1又非n,如果滿足則找到n的非平凡因子,否則繼續迭代。之前說過a的ρ型軌跡的環的尾部和環的長度的期望均為n^(1/4),因此當我們p記錄xh時,其中xh落在a的ρ型軌跡的環上且h大於等於環的周長時,此時我們會沿着a的ρ型軌跡的環進行周而復始的循環迭代,最終在修改p之前xi回到了xh的位置,此時借助gcd(xi-p, n)我們就找到了一個n的非平凡因子。h的期望應該為O(n^(1/4)),因此時間復雜度的期望應該為O(n^(1/4))。

  下面給出代碼:

pollard_rho(x)
    c = random()
    xi = random()
    i = 1
    h = 1
    xh = xi
    while(true)
        xi = (xi * xi + c) % n
        f = gcd(x, abs(xi - xh))
        if(f != 1 && f != n)
            return f
        i = i + 1
        if( i == h * 2)
            h = i
            xh = xi

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM