所以我试图使用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;
}
答案 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 ......根,并检查它是否为整数。