我正在尝试基于我在维基百科上找到的伪代码来实现Pollard Rho,但它似乎不适用于数字4,8和25,我不知道为什么。
这是我的代码:
long long x = initXY;
long long y = initXY;
long long d = 1;
while (d == 1) {
x = polynomialModN(x, n);
y = polynomialModN(polynomialModN(y, n), n);
d = gcd(labs(x - y), n);
}
if (d == n)
return getFactor(n, initXY + 1);
return d;
这是我的多项式函数:
long long polynomialModN(long long x, long long n) {
return (x * x + 1) % n;
}
这是来自维基百科的示例伪代码:
x ← 2; y ← 2; d ← 1
while d = 1:
x ← g(x)
y ← g(g(y))
d ← gcd(|x - y|, n)
if d = n:
return failure
else:
return d
唯一区别:我没有返回失败,而是尝试不同的初始化变量,因为维基百科也注意到了这一点:
这里x和y对应于x i {\ displaystyle x_ {i}} x_ {i}和x j 关于核心理念的部分中的{\ displaystyle x_ {j}} x_ {j}。注意 即使n是,该算法也可能无法找到非平凡因子 综合。在这种情况下,可以使用a再次尝试该方法 起始值不是2或不同的g(x){\ displaystyle g(x)} g(x)。
Pollard-Rho对某些数字不起作用吗?它们的特点是什么?或者我做错了什么?
答案 0 :(得分:3)
Pollard Rho对偶数不起作用。如果你有一个偶数,首先删除所有因子2,然后应用Pollard Rho找出奇数因子。
Pollard Rho正确地考虑因素25,但它同时发现两个因子为5,因此它返回25的因子。这是正确的,但没有用。所以Pollard Rho不会找到任何力量的因素(方形,立方体等)。
虽然我没有运行它,你的Pollard Rho功能看起来还不错。维基百科改变起点的建议可能有效,但通常不会。维基百科也建议,改变随机函数 g 会更好。最简单的方法是增加加数;而不是 x ²+ 1,使用 x ²+ c ,其中 c 最初为1并增加到2 ,3,...每次失败后。
答案 1 :(得分:0)
在这里,因为x可以等于n-1,所以您的polynomialModN函数中的乘积将溢出。