我用python写了两个素数测试。第一个是基于试验划分,第二个是埃拉托色尼筛。我的理解是 sieve 的时间复杂度应该比 Trial 小,所以 sieve 应该渐近更快。
但是,当我运行它时,试用分区要快得多。例如, when 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