【发布时间】:2013-05-28 22:02:50
【问题描述】:
所以我现在正在编写一个 java 代码。我已经让它工作得很好,但是任务的重点是让它分解大数字(超过 30 位)。它会这样做,但是它可能需要超过 15 分钟才能完成,这是不好的。我的教授向我保证,我使用的算法适用于高达 2^70 的数字,并且应该在大约五分钟内完成。我一直在尝试想出一种方法来做到这一点(增加 2 而不是 1 等),但我似乎无法弄清楚如何在不跳过某些因素的情况下让它更快地移动。有任何想法吗?我还认为椭圆曲线方法会更好,但他告诉我现在不要处理这个问题。
这是我的代码(ps,sqrt 是我自己的函数,但我确信它可以工作):
public String factorizer(BigInteger monster){
System.out.println("monster =" + monster);
String factors = "";
BigInteger top = maths.monsterSqrt(monster);
if(monster.mod(two).equals(0));
BigInteger jump = two;
for(BigInteger bi = two; bi.compareTo(top) <= 0; bi = bi.add(jump)){
while(monster.mod(bi).equals(zero)){
factors += "+" + bi + "";
monster = monster.divide(bi);
jump = one;
}
}
if(monster.compareTo(BigInteger.ONE) == 1){
factors += "+" + monster;
}
return factors;
}
【问题讨论】:
-
这个 if 没用 ` if(monster.mod(two).equals(0));` -> 去掉分号 * 如果你检查除以 2 的可分性(?),你应该测试3,5... then * for/while 嵌套循环有点难以理解,您应该以递归方式重写您的函数。 *我会将结果累积在例如一个 ArrayList
,但这是风格问题 :-) -
您可以使用
Stringbuilder代替字符串来表示因子。 Class StringBuilder -
@Gyro 这比没用还糟糕,它使整个算法无效。
-
@Smit 确实如此,但这将是整体性能中的一个非常小的因素(双关语),因为#factors 永远不会超过 70
-
@Arend:对不起,我的评论还没说完(大拇指综合症)
标签: java cryptography rsa factorization