我目前正在研究一些事情,我需要计算像
这样的值(65 ^ 17)mod 3233 = *
上述问题的答案是2790,但是因为65 ^ 17大于Math.pow可以返回的值,所以它总是给出错误的答案。
我已经使用BigIntegers(以及内置的modPow)编写了一个实现,但是如果可能的话我想避免使用它们。
是否有其他方法可以避免使用BigIntegers?
答案 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 - ......如果数学不是你更强大的技能之一......