用模量计算大功率

时间:2013-04-25 00:46:59

标签: java math

我目前正在研究一些事情,我需要计算像

这样的值

(65 ^ 17)mod 3233 = *

上述问题的答案是2790,但是因为65 ^ 17大于Math.pow可以返回的值,所以它总是给出错误的答案。

我已经使用BigIntegers(以及内置的modPow)编写了一个实现,但是如果可能的话我想避免使用它们。

是否有其他方法可以避免使用BigIntegers?

2 个答案:

答案 0 :(得分:5)

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

重复应用这个用于减少65 ^ 17 mod 3233,

e.g。

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

答案 1 :(得分:1)

Mitch Wheat的简洁但有些神秘的 1 回答意味着这应该有效(伪代码):

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

由于模数算术的数学属性,你根本不需要使用BigInteger。

FWIW,使用Math.pow()不起作用的原因是它使用浮点算法计算65 17 pow的结果太大而无法准确表示为double,因此您会丢失一些最不重要的数字;即数字“右手端”的那些。不幸的是,当你取模数时,这些数字很重要。


1 - ......如果数学不是你更强大的技能之一......