Pollard Rho无法找到因子

时间:2015-11-04 18:04:52

标签: java algorithm biginteger factorization

所以我试图使用BigInteger类在Java中创建一个Pollard的Rho Factoring算法来支持非常大的整数。代码主要起作用,但找不到4或8的因子(应该是2)。目前我已限制它循环算法10,000,000次仍然无法找到2作为一个因素。 a随机生成(限制在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;


}

1 个答案:

答案 0 :(得分:3)

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。

这是顺便说一句。很容易检查数字是否是整数的适当幂。只需计算第2,第3,第4 ......根,并检查它是否为整数。