使用BigInteger进行Prime检查(参数不匹配)

时间:2016-02-02 03:35:32

标签: java for-loop primes biginteger

我正在尝试创建一个应用程序,以检查特定数字是否为素数。 由于数字大于int或long的值,我不得不使用BigInteger,但我对它的了解很少,所以我就碰壁了。 我正在做的是检查n是否可以被奇数(i)分割,直到我到达n的根。 n(10 ^ 24 + 7)的值是素数,我想检查更大的数字,如10 ^ 128 + 7。我很感激任何帮助。

import javax.swing.*;
import java.math.*;

public class prime {
    public static void main(String[] args) {
        BigInteger n = new BigInteger("1000000000000000000000007");
        BigInteger h = new BigInteger("2");
        int r;

        for(BigInteger i = new BigInteger("3");n.compareTo(i.multiply(BigInteger.valueOf(i)))>=0;i.add(BigInteger.valueOf(h))) {
            if(n.divideAndRemainder(i)==0){
                r=0;
                }else{
                        r=1;}
        }
        if(r=0){
            System.out.println("not prime");}else{
                System.out.println("prime");}
    }       
}

1 个答案:

答案 0 :(得分:0)

正确的操作是BigInteger.mod(BigInteger)(你只关心其余部分); 使用BigInteger.isProbablePrime(int)。将逻辑提取到方法中也更好。像,

static boolean isPrime(BigInteger n) {
    BigInteger TWO = BigInteger.ONE.add(BigInteger.ONE);
    if (n.mod(TWO).equals(BigInteger.ZERO)) {
        return false;
    }
    BigInteger h = TWO.add(BigInteger.ONE);
    // for (; h * h < n; h += 2)
    for (; h.multiply(h).compareTo(n) < 0; h = h.add(TWO)) {
        if (n.mod(h).equals(BigInteger.ZERO)) {
            return false;
        }
    }
    return true;
}