1. 程式人生 > >Pollard's Rho Algorithm——求正整數的質因數

Pollard's Rho Algorithm——求正整數的質因數

Pollard Monte Carlo factorization method 是J. M. Pollard 於1975提出的一種質因數分解的方法。由於其演算法中迭代公式形成的序列點集合X={x1,x2,x3...xn}形狀與希臘字母ρ相似,因此也叫Pollard’s rho algorithm。

迭代的公式為:xn+1=(x2n+1)mod(N)nN;

rho algorithm具體步驟如下所示:

1) 在N-1到0選擇均勻隨機地選取一個數作為x0的初始值,並使y0=x0, 一般會選取2作為初始值;

2) xn+1=(x2n+1)mod(N)yn+1=[(y2n+1)2+1]mo

d(N)

3) m=gcd(abs(xy),N), 若m不為1或N,輸出m;否則n=n+1,重複第二步(注意增加跳出迴圈條件,以防死迴圈;跳出條件一般為m=1)

NOTE: 一般來說,第一遍操作後一般就能得到所需分解的正整數的質因數(一般為最大質因數),而後迴圈操作將會依次得到比較小的質因數,最後為1.

以下是sample code:

#此程式碼僅為得到所需分解的正整數的最大的質因數,若要得到其所有的質因數,只要對分解後非最大質因數那部分再作ρ演算法分解即可。PS: 若第一次迴圈後,m=1,則該數為素數
int Pollard_Rho( int num )
{
    int
y = 2, x = 2, factor = 1; int count=0; if (num == 1) return 1; else if (num % 2 == 0) return 2; else { while (factor == 1) { if (count > 10) //增加跳出條件,純粹安全,可刪除 return num; x = (x*x + 1) % num; y = (((y*y + 1
) % num) ^ 2 + 1) % num; factor = gcd( abs(x - y), num ); count++; } return factor; } } //求a、b的最大公約數 int gcd(int a, int b) { int remainder; while (b != 0) { remainder = a % b; a = b; b = remainder; } return a; }