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!
请告诉我这条路线是否可行,以及我如何解决这个糟糕的代码,就像我想象它一样!
谢谢!
答案 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)