我编写的代码用于确定声称在某个区间中有素数的任意猜想是否具有反例。
我输入了n n和(n + 1)(n + 1)的任意间隔,这应该是正确的,因为它是一个着名的猜想。
for (int n = 0; n < 100000; n++)
{
int m = 0;
for (int i = n*n; i <= (n+1)*(n+1); i++)
{
int k = 0;
for (int j = 2; j <= Math.sqrt(i); j++)
{
if ((i % j) == 0)
{
k+=1;
break;
}
}
if (k == 0)
{
m+=1;
break;
}
}
if (m == 0)
{
System.out.println("The conjecture has been disproven for n = " + String.valueOf(n));
}
}
吐出“反例”n = 46340,n = 80264。
此代码有任何问题吗?当我在MSE上声称存在反例时,我被告知素数确实存在。所以它显然是有缺陷的。我只是不确定这是Java的模数实现的内部问题,还是我的代码有错误。
答案 0 :(得分:1)
我相信你的算法是正确的。但是,Java中的数据类型int
无法保存较大的数字。具体地说,整数可以具有的最大值是
Integer.MAX_VALUE = 2.147.483.647
有趣的是,选择n = 46340 正是你的算法打破这个障碍的最小n,因为
n*n = 2.147.395.600 < Integer.MAX_VALUE,
(n+1)*(n+1) = 2.147.488.281 > Integer.MAX_VALUE.
作为快速解决方法,您可以使用数据类型long
代替,这可以存储更多的值,直到
Long.MAX_VALUE = 9.223.372.036.854.775.807
如果你想完全避免上层障碍,你应该看看专为此目的而设计的BigInteger类。