【发布时间】:2014-08-06 01:40:21
【问题描述】:
我对素数很好奇,并想知道找到相对较小的素数的最有效方法,范围可达 1000 万。我读到 Erastosthenes (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)
【问题讨论】:
-
但是普通的 Python 在任何大的和数学上都没有效率。
-
@Jason S - 使用 Python 与算法的渐近 复杂性/效率完全无关,除非它提供了一组特定的方便的现成构建块。假设您使用相同的算法(使用相同的算法构建块),Python 可能会比 C 或 C++ 慢,但仅是常数因素。关于渐近分析(大 O 等)的一个关键点是常数因素是不相关的。
-
该问题询问了数学和编程效率之间的差异。如果它真的只是关于算法,那是一个骗局。
-
人们已经回答了您的问题,但我只想指出,由于素数定理,您的算法的运行时间为 n^2/log n(内循环为 n 阶/log n).
标签: python algorithm primes sieve-of-eratosthenes