如何战俘和国防部巨型数字

时间:2019-04-07 19:40:09

标签: python-3.x pow

我想将一个数字赋予一定的幂,然后将其乘以另一个数字,最后对其进行修改。

Python的pow函数(带有3个参数)无法用于我的用例场景,因此,我正在尝试找到快速的替代方法。

示例:

我知道我能做

9^10%2

pow(9, 10, 2)

但我做不到

(8*9^10)%2

具有相同功能

我已经尝试使用(数字仅供参考,实数更大)

pow(9, 10)*8 % 2 # tooks too long
pow(9, 10, 2)*8  # returns wrong answer

我希望我的数字能很快地计算出来,即使它们不超过10 ^ 18。对于这20个数字,我的时间要求是2秒。

以上所有解决方案都不适用于我,要么它们太慢,要么未返回正确答案。

1 个答案:

答案 0 :(得分:2)

您的第二个解决方案包含一个不正确的假设,即以下情况成立。直观上讲,这是不正确的,因为第一个表达式可能与case filterM p xs of Nothing -> Nothing Just xs' -> Just (x : xs') 一样大,但是第二个表达式必须严格小于c*(n-1)

n

来自Wikipedia的正确身份:

((a^b)%n)*c == (c*a^b))%n

我们可以通过归纳将其概括(证明留给读者练习):

\prod^m_{k=1}{x_k} \mod n = \prod^m_{k=1}{(x_k \mod n)} \mod n

所以您的表情应该是:

ab mod n = [(a mod n)(b mod n)] mod n.