【发布时间】:2021-09-18 11:28:37
【问题描述】:
我尝试比较多种算法以找到“i”下的最大素数。 但是当我测试实现时,“aks”比我幼稚的实现要慢。 我在想 aks 是一个更好的素数测试实现,我弄错了吗?
def expand_x_1(n):
c =1
for i in range(n//2+1):
c = c*(n-i)//(i+1)
yield c
def aks(p):
if p==2:
return True
for i in expand_x_1(p):
if i % p:
return False
return True
def all_factors(x): # naive version
i = 2
s = int(x ** 0.5)
while i < s:
if x % i == 0:
return False
i += 1
return True
def find(i, func) :
while not func(i) :
i -= 1
print(i)
%time find(2**16, aks)
%time find(2**16, all_factors)
我尝试比较两者并获得:
- 为阿克斯
65521
CPU times: user 1.7 s, sys: 3.24 ms, total: 1.7 s
Wall time: 1.7 s
- for all_factor
65521
CPU times: user 81 µs, sys: 0 ns, total: 81 µs
Wall time: 83.9 µs
【问题讨论】:
-
您使用两个单独的值调用它们。是什么让您认为这两个测试用例具有直接可比性?
-
如果您使用
print(i)来查看它执行了多少次while/for循环,那么您会看到幼稚版本的循环更少 - 因为它不使用*和//所以它需要更少的时间。
标签: python cryptography primes