我是Java的新手,我的一个课程作业是找到一个至少100位数的素数,其中包含数字273042282802155991.
到目前为止我有这个,但是当我编译并运行它时,它似乎是一个连续的循环。
我不确定我是否做错了。
public static void main(String[] args) {
BigInteger y = BigInteger.valueOf(304877713615599127L);
System.out.println(RandomPrime(y));
}
public static BigInteger RandomPrime(BigInteger x)
{
BigInteger i;
for (i = BigInteger.valueOf(2); i.compareTo(x)<0; i.add(i)) {
if ((x.remainder(i).equals(BigInteger.ZERO))) {
x.divide(i).equals(x);
i.subtract(i);
}
}
return i;
}
答案 0 :(得分:4)
一个提示是这些陈述什么都不做:
x.divide(i).equals(x);
i.subtract(i);
与for
循环的一部分相同:
i.add(i)
他们不会自己修改实例,而是返回新值 - 您无法检查并执行任何操作的值。 BigIntegers
是“不可变的”。它们无法改变 - 但它们可以被操作并返回新值。
如果你真的想做这样的事情,你必须这样做:
i = i.add(i);
另外,为什么要从i
中减去i
?难道你不总是期望这是0吗?
答案 1 :(得分:4)
因为这是家庭作业......
BigInteger上有一个方法可以测试素数。这比尝试分解数字要快得多。 (如果你采取的方法涉及尝试分解100位数字,你将失败。因数分析被认为是 NP完全问题。当然,没有已知的多项式时间解决方案。)
问题是当一个素数表示为一个十进制数字序列时,它要求包含给定数字序列的素数。
生成“随机”素数然后测试它们是否包含这些数字的方法是不可行的。 (一些简单的高中数学告诉你,随机生成的100位数字包含给定的18位数序列的概率是...... 82/10 18 。你还没有测试素数...
但还有另一种方法可以做到这一点......想一想!
只有在你脑海中想出你的算法是如何工作的时候才开始编写代码,并完成心理估计以确认它会在合理的时间内给出答案。
当我说不可行时,我的意思是对你不可行。考虑到足够多的计算机,足够的时间和一些高性能的数学,可能可以做这些事情。因此,从技术上讲,它们可能在计算上是可行的。但它们作为家庭作业并不可行。我确信这个练习的目的是让你思考关于如何以聪明的方式做到这一点......
答案 2 :(得分:0)
您需要实现/使用miller-rabin算法
Handbook of Applied Cryptography
第4.24章 http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf