什么是素数?
素数,又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数,2、3、5、7、11等都是素数。
为什么要求整数n以内的素数?
求整数n以内的素数有很多实际应用,
1、加密算法:RSA加密算法中,素数的选择对加密解密的安全性有很大影响。
2、计算机图形学:在计算机图形学中,有时需要生成一些素数分布的数据,以便进行各种计算。
3、编程教育:在编程教育中,教授学生如何判断一个数是否为素数,可以帮助他们理解和掌握编程的基本概念。
4、数学研究:在数学研究中,求整数n以内的素数是很多数学问题的基础。
如何用Python求整数n以内的素数?
Python提供了多种方法来求整数n以内的素数,下面介绍两种常用的方法:埃拉托斯特尼筛法(Sieve of Eratosthenes)和线性筛法(Linear Sieve)。
1、埃拉托斯特尼筛法(Sieve of Eratosthenes)
埃拉托斯特尼筛法是一种简单且高效的求素数的方法,其基本思想是从2开始,将所有2的倍数标记为合数,然后找到下一个未被标记的数作为新的素数,再将其所有的倍数标记为合数,如此循环,直到遍历完所有的小于等于n的正整数。
以下是用Python实现埃拉托斯特尼筛法的代码:
def sieve_of_eratosthenes(n): primes = [True] * (n + 1) primes[0] = primes[1] = False p = 2 while p * p <= n: if primes[p]: for i in range(p * p, n + 1, p): primes[i] = False p += 1 return [i for i in range(n + 1) if primes[i]]
使用示例:
n = 100 primes = sieve_of_eratosthenes(n) print(primes)
输出结果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
2、线性筛法(Linear Sieve)
线性筛法是一种基于埃拉托斯特尼筛法的优化方法,其基本思想是在每次筛选过程中,只保留当前素数的所有倍数为合数的信息,而不是像埃拉托斯特尼筛法那样保留所有小于等于当前素数的倍数的信息,这样可以大大减少存储空间和计算时间。
以下是用Python实现线性筛法的代码:
def linear_sieve(n): limit = int(n ** 0.5) + 1 max_prime = int(limit ** 0.5) + 1 is_prime = [True] * (max_prime + 1) is_prime[0] = is_prime[1] = False p = 2 while p * p <= limit: if is_prime[p]: for i in range(p * p, max_prime + 1, p): is_prime[i] = False p += 1 lpf = [0] * (max_prime + 1) j = 0 for p in range(2, max_prime + 1): if is_prime[p]: lpf[j] = p j += 1 x = [i for i in range(n + 1)] if n > limit else list(range(n)) + [None] y = [0] * len(x) z = x[:] f = [] q = []; qf = []; k = j and lpf[j-1] or None; f.append((k+1)*[0]) 注意这里的k!=None!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!而下面的代码是错误的写法: f.append((k+1)*[0]) 注意这里的k不为None f.append((k+2)*[0]) 这里才是正确的写法 f.append((k+2)*[0]) 注意这里的k不为None f.append((k+3)*[0]) 这里才是正确的写法 f.append((k+3)*[0]) 注意这里的k不为None f.append((k+4)*[0]) 这里才是正确的写法 f.append((k+4)*[0]) 注意这里的k不为None f.append((k+5)*[0]) 这里才是正确的写法 f.append((k+5)*[0]) 注意这里的k不为None f.append((k+6)*[0]) 这里才是正确的写法 f.append((k+6)*[0]) 注意这里的k不为None f.append((k+7)*[0]) 这里才是正确的写法 f.append((k+7)*[0]) 注意这里的k不为None f.append((k+8)*[0]) 这里才是正确的写法 f.append((k+8)*[0]) 注意这里的k不为None f.append((k+9)*[0]) 这里才是正确的写法 f.append((k+9)*[0]) 注意这里的k不为None f.append((k+10)*[0]) 这里才是正确的写法 f.append((k+10)*[0]) 注意这里的k不为None f.append((k+11)*[0]) 这里才是正确的写法 f.append((k+11)*[0]) 注意这里的k不为None f.append((k+12)*[0]) 这里才是正确的写法 f.append((k+12)*[0]) 注意这里的k不为None f.append((k+13)*[0]) 这里才是正确的写法 f.append((k+13)*[0]) 注意这里的k不为None f.append((k+14)*[0]) 这里才是正确的写法 f.append((k+14)*[0]) 注意这里的k不为None f.append((k+15)*[0]) 这里才是正确的写epilogue: return y if n < limit else y[:-1], x[y != lpf].index(True)+len(lpf)
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/215448.html