2015-08-21 26 views
-1

我將modExp函數從int傳遞給BigInteger,但結果不同,這兩個函數有什麼不同?Int到BigInteger,有什麼區別?

謝謝!

用的BigInteger的功能,其結果總是1:

public static BigInteger modExp(BigInteger a, BigInteger b, BigInteger n) { 
    BigInteger two = new BigInteger("2");  
    if (b == BigInteger.ZERO) 
     return BigInteger.ONE; 
    BigInteger t = modExp (a, b.divide(two), n); 
    BigInteger c = (t.pow(2)).mod(n); 
    if (b.mod(two) == BigInteger.ONE) 
     c = (c.multiply(a)).mod(n); 
    return c;  
} 

爲int功能:

public static int modexp(int a, int b, int n) { 
    if (b == 0) return 1; 
    long t = modexp(a, b/2, n); // use long for intermediate computations to eliminate overflow 
    long c = (t * t) % n; 
    if (b % 2 == 1) 
     c = (c * a) % n; 
    return (int) c; 
} 

的功能是計算a^b mod p,例如:

a=4 b=6 p=11 result1 = 1 result2 = 4 
a=9 b=2 p=11 result1 = 1 result2 = 4 
a=5 b=6 p=23 result1 = 1 result2 = 8 ... 
+1

結果有什麼不同?他們在計算中的什麼時候分歧? –

+1

它是否返回1,因爲b == 0 if語句? –

+2

使用'compareTo'而不是'=='。 – Bubletan

回答

3

明顯的區別是intBigInteger

一個區別是int是原始類型,BigInteger是引用類型。因此,比較BigInteger時最好使用equals()。所以b == BigInteger.ZERO應該是BigInteger.ZERO.equals(b)

BigInteger更適合處理大數字,並且可以防止您遇到溢出Java支持的最大值的問題。

溢出可能是您從兩個函數獲得不同結果的原因。發生這種情況時,它不會導致拋出任何異常,但int的值會混淆。

+0

我用它,但它仍然是錯誤的。我也嘗試'b.compareTo(BigInteger.ZERO)== 0',但結果仍然是1. – Stephen

+0

是的,你是對的,我需要改變'b == BigInteger.ZERO'和'b.mod(兩個) == BigInteger.ONE'來compareTo,結果是正確的,謝謝! – Stephen

+0

你是否也改變了這個'b.mod(two)== BigInteger.ONE'的比較?我建議你一步一步地調試兩種方法並追蹤結果如何變化。這是查找錯誤的最簡單方法 –

0

在java中,int可以從-2^31到2^31-1,因爲int被編碼在4個字節以上,但long可以從-2^63到2^63-1,因爲long被編碼爲8以上字節。

在第二種方法與此:

return (int) c; 

,你可能會失去數據(4第一個字節)

這可以解釋爲什麼你的結果是不同的,因爲BigInteger的被編碼在比長得多字節

相關問題