defis_prime(num): if num < 2: returnFalse # 非素数至少有一个小于等于 sqrt(n) 的因数,如果没有,显然也不存在大于1的因数,直接剪枝 for i inrange(2, int(math.sqrt(num)) + 1): if num % i == 0: returnFalse returnTrue
defsieve(n): primes = [] for i inrange(2, n + 1): if is_prime_optimized(i): primes.append(i) return primes
调和级数法
时间复杂度:O(nlogn)
内层的 for 循环使用有剪枝的遍历查找,由于使用了已有素数实现了调和级数,其平均时间复杂度为 O(logn),外层for循环使用直接遍历查找,时间复杂度显然为 O(n),对于该算法的循环结构,平均时间复杂度为 O(nlogn)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
defsieve_harmonic(n): primes = [] for num inrange(2, n + 1): is_prime = True for prime in primes: if prime * prime > num: # 剪枝 break # 利用已有素数进行校验 if num % prime == 0: is_prime = False break if is_prime: primes.append(num) return primes
埃氏筛
时间复杂度:O(nloglogn)
1 2 3 4 5 6 7 8 9 10
defsieve(n): is_prime = [True] * (n + 1) p = 2 while (p * p <= n): if is_prime[p]: for i inrange(p * p, n + 1, p): is_prime[i] = False p += 1 primes = [p for p inrange(2, n + 1) if is_prime[p]] return primes
defsieve(n): is_prime = [True] * (n + 1) primes = [] for p inrange(2, n + 1): if is_prime[p]: primes.append(p) for prime in primes: if p * prime > n: break is_prime[p * prime] = False if p % prime == 0: break return primes