我想将一个数字赋予一定的幂,然后将其乘以另一个数字,最后对其进行修改。
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秒。
以上所有解决方案都不适用于我,要么它们太慢,要么未返回正确答案。
答案 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
我们可以通过归纳将其概括(证明留给读者练习):
所以您的表情应该是:
ab mod n = [(a mod n)(b mod n)] mod n.