BigInteger模数不是正面异常

时间:2014-04-02 01:37:29

标签: java biginteger

我有一个函数来决定给定的BigInteger是否是素数。在主类中,我通过传递参数调用了该函数。现在,当我尝试编译时,我收到以下错误。

C:\Users\me\Downloads>java RSA_n_prime2_using_int
Exception in thread "main" java.lang.ArithmeticException: BigInteger: modulus not positive
        at java.math.BigInteger.mod(Unknown Source)
        at RSA_n_prime2_using_int.prime_check(RSA_n_prime2_using_int.java:92)
        at RSA_n_prime2_using_int.main(RSA_n_prime2_using_int.java:20)

我的代码看起来像这样

public static boolean prime_check(BigInteger val)
{
    BigInteger prime_chk=new BigInteger("0");
    //System.out.println("in the function");
    boolean isprime=true;
    BigInteger prime_value=val.add(BigInteger.ZERO);

    if(val.equals(BigInteger.ZERO)||val.equals(BigInteger.ONE)) 
        return false;
    for(prime_chk.valueOf(2);prime_chk.compareTo(prime_value)<0;prime_chk.add(BigInteger.ONE))
    {
        if((prime_value.mod(prime_chk)).equals(BigInteger.ZERO))
            {
                isprime=false;
                break;
            }
    }
    return isprime;
}

在main函数中,调用如下

s1 = new BigInteger("1021");//s1=(int)Math.round(Math.random()*1000)%30;
if(prime_check(p1))
{
        System.out.println(p1+" is prime");
}

请帮我找到,哪里出错了。

1 个答案:

答案 0 :(得分:1)

在函数开头将prime_chk设置为零,然后执行:

for (prime_chk.valueOf(2); blah; blah ) {
    if((prime_value.mod(prime_chk)) {
        blah;
    }
}

if语句的第一部分(prime_chk.valueOf(2))实际上更改 prime_chk,它只是评估2并创建一个该值的大整数(你似乎扔掉了)。因此,当您执行prime_value.mod(prime_chk)时,prime_chk 仍然设置为零,因此您的例外(有些可能会争辩,但零既不是负面的也不是肯定 - 无论如何,x mod 0是一个有问题的操作,无论引发的参数如何。)

也许您可能希望将if的初始部分更改为:

for (prime_chk = BigInteger.valueOf(2); blah; blah ) {

这实际上 prime_chk更改为2,从而避免您的例外。


另一点是,如果将prime_chk限制在测试号码的2平方根之间,则可以节省大量周期。如果你还没有找到除数,那么从数学上保证你不会在上面找到一个除数。正常的方法是(伪代码,显然):

def isPrime (val):
    for (chk = 2; chk * chk <= val; chk++):
        if (val % chk) == 0:
            return false
    return true