2013-04-25 82 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