我对素数很好奇,我想知道在1000万范围内找到相对较小的素数的最有效方法。我读过一篇文章说,Eratosthenes筛(SOE)是找到更小质数的最有效方法。我使用python实现了SOE,但有几个问题:
我的算法最坏的运行时间似乎是O(n^2)。我还在学习,所以我知道这个算法可以提高效率。
寻找素数的最有效的数学方法和最有效的编程方法有区别吗?从数学上讲,SOE是最快的之一,但是编程方面的SOE有那么快吗?在
def FindPrime(n):
primes = [2, 3]
for num in range(4, n):
notprime = False
for p in primes:
if num % p == 0:
notprime = True
if notprime == False:
primes.append(num)
print primes
print FindPrime(100)
首先,您应该知道您的算法不是sieve of Eratosthenes。你在用审判庭。在
可以对您的实现进行一些改进。在
使用},它是{}。
xrange()
,这是O(1)
内存方面的,而不是{在搜索中跳过偶数:
xrange(4, n, 2)
每次第2步。当
p > sqrt(n)
时,不要测试质数p
是否除以n
。这是不可能的。正如您所预测的,这些更改不会影响复杂性的顺序,但是您将看到一个可靠的性能改进。在
至于更快的算法,首先实现一个真正的Eratosthenes筛,然后尝试更快的sieve of Atkin。在
uʍopǝpısdn是对的,您的代码不是SOE
您可以找到我的SOE实现here
国有企业矿山实施的复杂性
T(0.5·n·DIGAMMA(CEIL(SQRT(n))+0.3511·n)
如果sqrt(N)像代码内注释中建议的那样使用T(3.80*n)
T(4.38*n)
T(4.95*n)
T(5.53*n)
T((0.3516+0.5756*log10(n))*n)
O(n.log(n))
速度(运行时)和复杂性O()之间的差异
t=T(f(n))*c
t=O(f(n))*c
O()
是算法的时间复杂度T()
是任意n的实际运行时方程(不是O()
!!!)在c
是一个固定的时间,它需要处理所有for
中的单个焊道等。。。在O()
并不意味着更快的解决方案n
,仅在treshold where之后O1(f1(n))*c1 < O2(f2(n))*c2
c
常数,那么你就可以击败复杂度更好的算法,达到一个树形图T(n.n/2)
->;O(n^2)
O(n.log(n))
所以对于最有效的数学和编程解决方案之间是否存在差异的问题
你可以使用快速的反根算法,它包含了一点比特黑客攻击,在O(c)中找到一个数的平方根,然后在O(n^(1/2))中找到它是否素数,然后在你的问题中,你可以在O(n*(n^(1/2)))中找到间隔的素数,它比O(n^2)好,如果我们看看你提到的算法,它是列表的最佳方法(有界)0-something)因为它不会对任何值进行两次检查,并且它的时间复杂性可以降低到O((n^(1/2))*log(log(n))/log(n)),并且它可以用于创建查找表,并且您的实现在一定程度上是错误的,所以我用c++编写示例,您可以使用它:
相关问题 更多 >
编程相关推荐