IT源码网

java之BigInteger 模数不为正异常

youxin 2024年06月20日 程序员 28 0

我有一个函数可以确定给定的 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"); 
} 

请帮我找出哪里出错了。

请您参考如下方法:

在函数开始时将 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 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!