【发布时间】:2014-03-18 13:34:00
【问题描述】:
这来自math.se post 这里。我正在检查 2^(n-1)+3 是否可以被 n 整除。这是我写的代码,
def ck(n):
c=pow(2,n-1,n)+3
return not c%n
for i in range(10**7,2*10**7):
if ck(i):
print(i)
break
print('Search Complete')
函数ck首先用内置的pow计算2^(n-1)%n,加3,最后得到余数。从数学上讲,这与(2^(n-1)+3)%n 相同,但速度要快得多,因为计算pow(a,b,c) 比pow(a,b)%c 快
我想知道我是否可以进行其他优化(在函数中或在 for 循环中)?
range(10**7,2*10**7) 中的值只是我逐步增加的虚拟值,以便搜索不会失控。
[在有人理解错误之前,我完全没有破解哈希]
【问题讨论】:
-
我建议这样做,
xrange而不是range这么大的范围 -
如果您只使用整数,您可以使用简单的位移来实现平方,而不是调用 pow 函数。
-
@sshashank124 python 3.
range返回一个迭代器。 -
@TimCastelijns 实际上
pow(2,123456789,1000)比(2<<123456788)%1000快 -
@Sabyasachi,啊,我明白了。我错过了 python-3.x 标签。那么您不能执行以下操作:从
i=10**7开始,然后在每个循环结束时使用while 循环执行i *= 2,当您将参数传递给ck时,只需执行ck(i+3)。跨度>
标签: python optimization python-3.x modulus