2014-04-02 55 views
1

我有一個函數來決定給定的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; 
} 

在主函數,調用由如下

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

請幫我尋找,我在那裏出了問題。

+0

是否有你沒有使用'BigInteger.isProbablePrime'的原因? –

回答

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_chk2,從而避免你的異常。其他


一個點上,你可以節省大量的循環,如果你限制prime_chk2和平方根測試號之間的。如果你還沒有找到一個除數,它在數學上保證你不會在上面找到一個。正常的方法是(僞代碼,很明顯):

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