2013-04-25 36 views
0

我目前工作的大國,由此我需要計算像計算通過一些與模

(65^17)模3233的東西值= *

回答上述問題是2790,但是因爲65^17大於Math.pow可以返回的值,它總是給出錯誤的答案。

我已經寫了一個使用BigIntegers(和內置的modPow)的實現,但我想盡可能地避免它們。

是否有避免使用BigIntegers的替代方法?

+5

是的,有一些證據充分的方式來做到這一點,而不涉及任何大整數階段。請參閱:http://en.wikipedia.org/wiki/Modular_exponentiation – duskwuff 2013-04-25 00:49:36

+0

簡單的方法是從1開始,反覆乘以基數並在每次乘法後執行mod。 – 2013-04-25 00:51:40

+0

這讓我想起了在學校的數學課程.... omg – Drogba 2013-04-25 02:00:43

回答

5

如果x = y (mod n)u = v (mod n)然後x.u = y.v (mod n)(其中 '' 表示乘法)

重複的本申請中使用,以減少65^17 MOD 3233,

例如

65 * 65 (mod 3233) = 992 

65 * 992 (mod 3233) = 3053 

3053 * 65 (mod 3233) = 1232 
. 
. 
. 

事實上,我們可以縮短這一點,因爲我們計算65^4 (mod 3233) = 1232

所以,

65^8 (mod 3233) = 1232 * 1232 (mod 3233) = 1547 

65^16 (mod 3233) = 1547 * 1547 = 789 

最後,

65^17 = 789 * 65 (mod 3233) = 2790 
0

什麼米奇小麥的奇妙簡潔而略帶神祕的答案意思是我s表示這應該工作(僞代碼):

res = 1 
    for i in 1 to 17: 
     res = (res * 65) mod 3233 

你並不需要使用的BigInteger在所有的這一點,因爲模運算的數學特性的。

FWIW,使用Math.pow()不起作用的原因是它使用浮點運算計算65 。 pow的結果太大,無法精確表示爲double,因此您將丟失一些最低有效位;即數字的「右手邊」上的那些。不幸的是,這些數字很重要,當你採取模數。


1 - ...如果數學不是你的強技能之一....

+0

現在不那麼簡潔! ;) – 2013-04-25 01:57:15

+0

如果指數是負數,這也可以工作嗎? (怎麼樣?) – Gontroller 2013-04-25 15:48:16