我有一个函数来决定给定的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");
}
请帮我找到,哪里出错了。
答案 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