使用pow函数在Python中计算模数

22

那么,如果我想要使用pow函数计算6的8次方mod 5的值,应该在代码中输入什么?

假设您无需先导入pow函数。

我知道pow函数的使用方式是pow(x, y) = pow (6, 8) = 6的8次方

我猜应该输入:

mod.pow(6,8)

谢谢!


2
两种方式,pow(x, y)x**y - Ahsanul Haque
3个回答

46

很简单:pow函数有一个可选的第三个参数用于指定模数。

根据文档

pow(x, y[, z])

返回 x 的 y 次方;如果 z 存在,则返回 x 的 y 次方对 z 取模(比使用 pow(x, y) % z 更高效)。调用 pow(x, y) 函数相当于使用幂运算符:x**y

因此,您想要:

pow(6, 8, 5)

pow(x, y, z)(x ** y) % z 更快,更高效,并且可以轻松处理大量的y值,而不需要使用任意精度算术,假设 z 是一个简单的机器整数。


2
请注意,在版本3.8+中:对于整数操作数,pow的三参数形式现在允许第二个参数为负数,从而允许计算模反元素。现在允许关键字参数。以前,只支持位置参数。 - PM 2Ring
非常感谢!在您的帮助下,我及时计算出了pow(3, 545918790 // 3, 10**9+7)。 - yo1995
1
@ishandutta2007 请尝试使用较小的 xz(例如,小于3000万),以及大的 y - PM 2Ring
1
@ishandutta2007 但是如果x和y很大,(x ** y)会导致MemoryError,因此您不能对任意精度(例如RSA计算)使用该方法。 - PM 2Ring
我不记得我测试时使用的值是多少,但它是一个适中的值,不是很大,我发现 pow** 慢。我的观点是,pow 应该在内部处理所有这些情况,并返回优化后的结果,无论用户如何调用它,至少在 Python3.8 之前不是这样。希望 Guido van Rossum 能看到这条评论。 - ishandutta2007
显示剩余4条评论

8

请查看pow的文档:

pow(6, 8, 5)

做你想要的事情。

不要使用 a ** b % n!虽然这会给出正确的结果,但如果您计算更大的数字,则速度将慢几个数量级。 pow 将在每个步骤中执行模运算,而 ** 将首先在整数中执行指数运算(这可能会导致一个巨大的数字),并仅在最后取模。

现在,如果您对大于32位的数字感兴趣,您可能希望查看 gmpy2 以获得更快的速度。


3
感谢提到gmpy2。另一个值得一看的任意精度包是mpmath,如果您想要花哨的函数、根求解、积分等。顺便说一句,如果可用,mpmath将使用gmpy。 - PM 2Ring

-1
您可以使用“%” 字符来获取取模值。例如:print(pow(6,8) % 5)print(6**8 % 5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接