蛮力BigInteger分解

时间:2013-04-15 01:51:05

标签: java primes biginteger brute-force factorization

正如你可以从标题中看出来的那样,我正在努力试图强化因子为2个素数的大整数的因式分解。我想知道是否有办法在for循环中使用for循环。我知道这是一种可怕的方式,但我还是愿意这样做。 (我打算使用fermats分解定理,但你不能使用一些额外的方法/库而没有一些额外的方法/库而且我不能这样做)所以试着看看你是否可以帮助我做我正在做的事情。有点像这样:

BigInteger n = new BigInteger("270653957405596110781");  // this is what i need the factors of
BigInteger TWO = new BigInteger("2");
for( BigInteger i = new BigInteger("1"); i < n.divide(TWO); i.nextProbablePrime() ){
    for( BigInteger k = new BigInteger("1"); k < n.divide(TWO); k.nextPossiblePrime){
        if(i.Multiply(k) = n){
            //i and k are the factors, and return them
        }
     }
 }

显然那是残暴的,我知道你不能只通过说i.nextPossiblePrime()来增加到下一个素数,你需要它说i = i.nextpossible prime,我只是向你展示我想要的那种它工作;但那就是我要问的原因,因为如果这样的话甚至可能就是idk!

请告诉我这条路线是否可行,以及我如何解决这个糟糕的代码,就像我想象它一样!

谢谢!

2 个答案:

答案 0 :(得分:3)

我拒绝“只是帮助你做你正在做的事情。”它不起作用。

我在我的博客上谦虚地推荐了论文Programming with Prime Numbers。在那里讨论的pollard-rho算法会毫不费力地计算你的数字。包含了使用BigInteger的java实现。

顺便说一下,270653957405596110781 = 7588940707 * 35664260383。

答案 1 :(得分:1)

我还是刚接触计算机科学(8个月),这是我第一次回答问题,很抱歉,如果我没有多大帮助。请纠正我,如果我错了(说真的,我正在努力学习),但我认为你所寻找的是Quadratic Sieve。 http://en.wikipedia.org/wiki/Quadratic_sieve你似乎比我更先进,但我能够用一天的工作来实现它。这对于分解大数字非常有效。

我对Fermat的分解方法一无所知,但是你不能将BigInteger继承到一个新类并自己实现它,并使用平方根函数完成吗?我不知道你需要什么样的准确度,但你总是可以将它从BigDecimal开始。

希望这是有帮助的

编辑:我猜你没有测试你的代码。你不能使用像&lt;这样的运算符。与BigInteger。您需要使用BigInteger.compareTo(BigInteger)