我试图实施Miller-Rabin素性测试,并且很困惑为什么中等数字(~7位数)需要这么长时间(> 20秒).我最终发现以下代码行是问题的根源:
x = a**d % n
Run Code Online (Sandbox Code Playgroud)
(where a,d和n都是相似的,但是不相等的,中等数字,**是取幂运算符,并且%是模运算符)
然后我尝试用以下内容替换它:
x = pow(a, d, n)
Run Code Online (Sandbox Code Playgroud)
相比之下它几乎是瞬间完成的.
对于上下文,这是原始函数:
from random import randint
def primalityTest(n, k):
if n < 2:
return False
if n % 2 == 0:
return False
s = 0
d = n - 1
while d % 2 == 0:
s += 1
d >>= 1
for i in range(k):
rand = randint(2, n - 2)
x …Run Code Online (Sandbox Code Playgroud) 在两个float参数的情况下,Python的内置pow(x, y)(没有第三个参数)和返回的值返回的结果是否有差异.math.pow()
我问这个问题,因为文件的math.pow()暗示pow(x, y)(例如x**y)在本质上是一样的math.pow(x, y):
math.pow(x,y)
返回x上升到幂y.特殊情况尽可能遵循C99标准的附录'F'.特别是,即使x为零或NaN,pow(1.0,x)和pow(x,0.0)也总是返回1.0.如果x和y都是有限的,x是负的,y不是整数,则pow(x,y)是未定义的,并引发ValueError.
在版本2.6中更改:1**nan和nan**0的结果未定义.
注意最后一行:文档暗示行为math.pow()是指数运算符**(因此pow(x, y))的行为.这是官方保证吗?
背景:我的目标是提供一个实现这两个内置的pow()和math.pow()对不确定性的数字,在以同样的方式表现与常规的Python花车(相同的数值结果,同样的例外,拐角情况相同的结果,等等).我已经已经实现的东西,工作得很好,但也有一些角落情况下,需要进行处理.
哪一个使用math.pow或**运算符更有效?我什么时候应该使用另一个?
到目前为止我知道x**y可以返回一个int或者float如果你使用十进制函数pow将返回一个浮点数
import math
print math.pow(10, 2)
print 10. ** 2
Run Code Online (Sandbox Code Playgroud)