在这里我们选取的a是2,这样保证了与p互素。
另外补充一点,这个算法存在失败的可能,也就是说有可能找不到N的因子,但这并不妨碍N是个合数的事实。
只要B!取值合理,可以在多项式时间计算出结果。
但是B!必须满足"大于p − 1 p-1p−1的所有因子",如果p − 1的因子很大,选择小的B会造成算法求解失败,选择足够大的B才会增加算法成功的概率,但那样的话算法的复杂度不比试除法好,所以说算法的关键是选取合适的B。
C++代码:
#include <NTL/ZZ.h>
using namespace NTL;
using namespace std;
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <time.h>
#include <stdlib.h>
void pollard(ZZ N) {
cout << "N可以分解为: ";
while (1) {
ZZ B = ZZ(10);
ZZ a = ZZ(2);
a = PowerMod(a, B, N);
ZZ d = GCD(a - 1, N);
if (d > 1 && d < N) {
cout << d << " ";
N = N / d;
}
else {
cout << N;
return;
}
}
}
int main() {
ZZ N;
cout << "请输入待分解的数:";
cin >> N;
pollard(N);
}
Python代码:
#coding:utf-8
# author: Mitchell
import math
def pollard(N):
print('N可以分解为:')
while 1:
B=10
a=2
a=pow(a,B,int(N))
d=math.gcd(a-1,int(N))
if 1<d<N:
print(d,end=' ')
N=N/d
else:
print(int(N))
break
n=int(input('请输入待分解的数:'))
pollard(n)