62,626
社区成员
发帖
与我相关
我的任务
分享




,问题已经解决了,我后来把代码拷贝,在自己的电脑重新试了下,发现有些语法错误。不过让我很纳闷的是,在学校的机房这些代码是可以运行的,不过就是输出结果不完整,"小于一百的素数有"就没了结果,但是在自己的电脑上给我报了有几个位置的括号有问题也就是无法识别,改了以后就好了

public class PrimeTest {
public static void main(String[] args) {
for ( int i = 2 ; i < 100 ; i++ ) {
if ( !MillerRabin.isComposite( i ) ) {
System.out.println( i );
}
}
}
public static class MillerRabin {
public static boolean isComposite(int n) {
if (n < 2) {
throw new IllegalArgumentException("number must greater than or equals 2");
}
if (n == 2 || n == 3 || n == 5 || n == 7) {
return false;
}
if ((n & 1) == 0) {
return true;
}
if (n % 3 == 0) {
return true;
}
if (n % 5 == 0) {
return true;
}
if (n % 7 == 0) {
return true;
}
int s = 0, d = n - 1;
while ((d & 1) == 0) {
d >>= 1;
s++;
}
if (n < 1373653) {
if (loopMillerRabin(s, d, n, 2, 3)) {
return true;
}
} else if (n < 9080191) {
if (loopMillerRabin(s, d, n, 31, 73)) {
return true;
}
} else {
// 4,759,123,141 已经超过 int 的最大值,因此大于等于 9080191 就采用 4,759,123,141 的基准测试
if (loopMillerRabin(s, d, n, 2, 7, 61)) {
return true;
}
}
return false;
}
private static boolean loopMillerRabin(int s, int d, int n, int... t) {
for (int i = 0; i < t.length; i++) {
if (testMillerRabin(t[i], s, d, n)) {
return true;
}
}
return false;
}
private static boolean testMillerRabin(int a, int s, int d, int n) {
if (montgomery(a, d, n) != 1) {
int e = 1;
for (int i = 0; i < s; i++) {
if (montgomery(a, d * e, n) + 1 == n) {
return false;
}
e <<= 1;
}
return true;
}
return false;
}
private static int montgomery(int base, int exp, int mod) {
if (base > 46340 || mod > 46340) {
long temp = 1;
long prod = base % mod;
while (exp > 1) {
if ((exp & 1) != 0) {
temp = (temp * prod) % mod;
}
prod = (prod * prod) % mod;
exp >>= 1;
}
return (int) ((temp * prod) % mod);
} else {
int temp = 1;
int prod = base % mod;
while (exp > 1) {
if ((exp & 1) != 0) {
temp = (temp * prod) % mod;
}
prod = (prod * prod) % mod;
exp >>= 1;
}
return (temp * prod) % mod;
}
}
}
}

兄弟 下次提问的时候记得帖出代码