2013-06-22 20 views
1

當我做了以下計算(97^23) mod 187在Java中:有大量工作

double ret = (Math.pow (97, 23))% 187; 

RET值74(Math.Pow (97, 23))的值是4.963064143419832E45;

我的問題如下:表達式(97^23) mod 187 = 58的值。嘗試做Windows計算器。我試過使用BigDecimal,仍然無法獲得我需要的值。

在窗口計算器中製作(97^23)它返回4.9630641434198319969863989680919 +45並且更加精確。

如果有人能幫助我,非常感謝!

+0

@greedybuddha的一個顯示? –

+0

我需要值58. @Joni幫助了我。謝謝! – Philippe

回答

2

模塊化電源在BigInteger類實現:

BigInteger a = new BigInteger("97"); 
BigInteger x = new BigInteger("23"); 
BigInteger m = new BigInteger("187"); 
BigInteger result = a.modPow(x, m); // 97^23 % 187 

要得到的結果作爲一個int您可以使用intValue()方法。

+0

非常感謝!那就是我需要的! – Philippe

0

您是否嘗試過考慮問題?即r =(r * 97)%187;並重復23次?下面是一些僞Java的(我沒有編譯器附近,以驗證語法,但我在另一種語言測試的邏輯,似乎OK):

public static abmodn(int a, int b, int n) 
{ 
    int r = 1 % n; 
    while (b-- > 0) 
    { 
    r = (r * a) % n; 
    } 
    return r; 
} 

abmodn(97, 23, 187)回報58

+0

我也會試試這個。謝謝。 – Philippe

+0

我假設你知道,功率除以2並乘以結果('O(對數功率)'而不是'O(功率)')計算得出的正常功率......並且 - 做任何特殊原因'r = 1%n '而不是'r = 1'? –

+0

阿列克謝,我的答案旨在提供信息而不是最優。 r = 1%n旨在強化r =(r * a)%n模式並使用int類型解決問題。 –

0

對於沒有舍入錯誤的數字,您不能指望浮點計算(請參閱here)。 即使你在技術上不BigDecimal對於這一點,因爲你不會有一個小數,它仍然會計算正確,如:

進口java.math.BigDecimal的;

公共類的測試{

public static void main(String []args){ 
    BigDecimal bdn = new BigDecimal(97); 
    BigDecimal bdx = bdn.pow(23); 
    BigDecimal bdr = bdx.remainder(new BigDecimal(187)); 
    System.out.println("bd3: " + bdr); // bd3: 58 
} } 
+0

謝謝。這非常有用! – Philippe