我有以下任务:
[...]编写一个程序,该程序接收大于1的正整数并验证它是素数还是复合数。
我想出了以下几点:
n=int(input())
flag=True
for i in range(2,n//2+2):
if n%i==0:
print("Not prime.")
flag=False
break
if flag==True:
print("Prime.")
这似乎是正确的。然后,我决定尝试一下它,看看使用大整数输入会如何工作, 10 ^ 9 + 7 看起来是一个不错的选择。但是,该程序似乎根本无法完成运行,并且一直运行了30秒钟以上,直到我决定终止它。
但是,考虑到算法中的循环最多运行〜 5 * 10 ^ 8 次,并考虑到现代计算机在一秒钟内可以进行的大量计算,运行时间不是很长吗?
这是怎么回事?
在Python中, 10 ^ 9 + 7 是否像在C中一样作为int
类型计算的“上限”,因此以某种方式“溢出了计算” ?还是我的算法有问题?
谢谢!
答案 0 :(得分:0)
当然,在像Python这样的解释语言中,事情会变慢-与等效的C实现相比,有时您可能会失去一两个数量级的性能。但是,您的算法在渐近性上远远超出了必需的算法。您的算法是O(n)
,但是仅检查直到n
的平方根的除数,就可以实现O(sqrt(n))
的时间。您还可以通过实施车轮分解来将其以某些恒定因素加速。轮子{2, 3}
和{2, 3, 5}
相当普遍,但是当您在轮子上添加更多的质数时,收益会递减。使用{2}
滚轮使事情保持简单,我们可以跳过所有偶数(除2外),因为它们都不是质数。
def is_prime(n):
if n < 3:
return n == 2
if not n % 2:
return False
for i in range(3, int(n ** 0.5) + 2, 2):
if not n % i:
return False
return True