Pollard Rho对某些数字不起作用吗?

时间:2018-01-10 21:58:56

标签: algorithm factorization

我正在尝试基于我在维基百科上找到的伪代码来实现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对某些数字不起作用吗?它们的特点是什么?或者我做错了什么?

2 个答案:

答案 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函数中的乘积将溢出。