Java Pollard Rho can';找不到因素

Java Pollard Rho can';找不到因素,java,algorithm,biginteger,factorization,Java,Algorithm,Biginteger,Factorization,因此,我尝试在Java中创建一个Pollard的Rho分解算法,使用BigInteger类来支持非常大的整数。代码基本上可以工作,但找不到4或8的因子(应该是2)。目前,我已经将其限制为在算法中循环10000000次,但仍然无法找到2作为因子随机生成一个(限制在0到1000之间)。这只是Pollard Rho算法中的一个缺陷,还是实现中的某个地方存在错误 传递的n为4 初始a作为一个随机变量进行计算,计算方式与以下代码相同,介于0和1000之间 sqrt(n)方法返回n的平方根的下限(在本例中s

因此,我尝试在Java中创建一个Pollard的Rho分解算法,使用BigInteger类来支持非常大的整数。代码基本上可以工作,但找不到4或8的因子(应该是2)。目前,我已经将其限制为在算法中循环10000000次,但仍然无法找到2作为因子<代码>随机生成一个(限制在0到1000之间)。这只是Pollard Rho算法中的一个缺陷,还是实现中的某个地方存在错误

传递的
n
为4

初始
a
作为一个随机变量进行计算,计算方式与以下代码相同,介于0和1000之间

sqrt(n)
方法返回n的平方根的下限(在本例中
sqrt(sqrt(4))=1

我在最后打印了
count
,以确保它实际迭代了应该迭代的次数

private static BigInteger PollardRho (BigInteger a, BigInteger n) {

    BigInteger gcd = BigInteger.ZERO;

    BigInteger Tort = a;

    BigInteger Hare = a;

    BigInteger count = BigInteger.ZERO;

    BigInteger iterationLim = (sqrt(sqrt(n))).multiply(BigInteger.valueOf(10000000));

    while (count.compareTo(iterationLim)!=0)
    //makes sure that the algorithm does not surpass (4th root of n)*10000000 iterations.
    {

    Tort = ((Tort.pow(2)).add(BigInteger.ONE)).mod(n);

    //System.out.println("Tort: "+Tort);

    Hare = (((Hare.pow(2)).add(BigInteger.ONE).pow(2)).add(BigInteger.ONE)).mod(n);

    //System.out.println("Hare: "+Hare);

    gcd = (Tort.subtract(Hare)).gcd(n);

    //System.out.println("gcd: "+gcd);

    if (gcd.compareTo(BigInteger.ONE) != 0 && gcd.compareTo(n) != 0)
    {
    //  System.out.println("took if, gcd = "+gcd);

        return gcd;
    }

    if (gcd.compareTo(n) == 0)
    {
        a = (BigInteger.valueOf((long) (1000*Math.random())));
        Tort = a;
        Hare = a;
    }

    count = count.add(BigInteger.ONE);

    }

    System.out.println(count);
    return n;


}

Pollard的Rho方法通常只能拆分由不同素数组成的数字。对于素数幂的数字,它在大多数情况下都失败。4和8是单个素数2的幂,因此不太可能用这种方法拆分

该方法的工作原理是迭代一个随机函数f(x)mod n,在这种情况下使用f(x)=x^2+1,但其他函数也可以工作。诀窍是f(x)mod p,其中p是n的素数因子,在不同素数的不同迭代次数后进入一个循环。因此f(x)mod p1可能已经在一个循环中,f(x)mod p2还没有。然后gcd计算能够找到因子p1


顺便说一句,检查一个数字是否是整数的适当幂很容易。只需计算第二、第三、第四……根并检查它是否是整数。

Pollard的Rho方法通常只能拆分由不同素数组成的数字。对于素数幂的数字,它在大多数情况下都失败。4和8是单个素数2的幂因此,不太可能用这种方法进行拆分

该方法的工作原理是迭代一个随机函数f(x)mod n,在这种情况下使用f(x)=x^2+1,但其他函数也可以工作。诀窍是f(x)mod p,其中p是n的素数因子,在不同素数的不同迭代次数后进入一个循环。因此f(x)mod p1可能已经在一个循环中,f(x)mod p2还没有。然后gcd计算能够找到因子p1


顺便说一句,检查一个数字是否是整数的适当幂很容易。只需计算第二、第三、第四……根,然后检查它是否是整数。

您是否单步执行了代码,检查了每个中间结果,并验证它是否在执行您认为应该执行的操作?我有,它将不断找到等于n的gcd,计算新的a,再试一次,循环直到达到迭代极限。似乎你检查了每个中间结果(即每行的结果,而不仅仅是迭代结束时的结果),然后您可以确定哪一行没有按您认为应该的方式工作。如果,也就是说,您了解代码应该执行的操作。您是否单步执行代码,检查每个中间结果并验证它是否执行了您认为应该执行的操作?我有,它将不断找到等于n的gcd,计算新的a,尝试again,循环直到它达到迭代极限。好像你检查了每个中间结果(即每行的结果,而不仅仅是迭代结束时的结果),然后您可以确定哪一行没有按您认为应该的方式工作。如果,也就是说,您了解代码应该做什么。很有趣。我一直认为它只会失败偶数。您有更详细的参考吗?@NiklasB。请参阅编辑,并对该方法的工作原理进行更多解释。谢谢!很好的解释:)@是的,你是对的,这是可能的,但可能性较小。我已经相应地更新了答案。我一直认为它只会失败偶数。你有更详细的参考资料吗?@NiklasB。请参阅编辑,并对该方法的工作原理进行更多解释。谢谢!很好的解释:)@是的,你是对的,这是可能的,但可能性较小。我已相应地更新了答案。