【发布时间】:2015-08-20 17:16:15
【问题描述】:
我用 python 写了两个素数测试。第一个是基于试验划分,第二个是埃拉托色尼筛。我的理解是 sieve 的时间复杂度应该比 Trial 小,所以 sieve 应该渐近更快。
但是当我运行它时,试用分区要快得多。例如,当n = 6*(10**11)、is_prime(n) 用时不到一秒,但is_prime_sieve(n) 实际上永远不会结束!我是不是把筛子写错了?
我的代码是:
# determines if prime using trial division
def is_prime(n):
d = {}
u = math.floor(math.sqrt(n))
i = 2
# trial division: works pretty well for determining 600 billion
while (i <= u):
if (n % i == 0):
return False
i += 1
return True
# primality test with sieve
def is_prime_sieve(n):
# first find all prime numbers from 2 to u
# then test them
u = math.floor(math.sqrt(n))
prime = {}
lst = range(2, int(u)+1)
for i in lst:
j = 2
prime[i] = True
while (i*j <= u):
prime[i*j] = False
j += 1
while (u >= 2):
if (u not in prime) or (prime[u]):
if (n % u == 0):
return False
u -= 1
return True
【问题讨论】:
-
FWIW:
return all(n % i for i in range(2, int(n**0.5)+1)).
标签: python primality-test