python求质数

博客介绍了质数的概念,即乘法因子只有1和自身的自然数(2除外为奇数)。阐述判断质数的方法,一个数若为质数则不能被2、3、5、7整除。还给出编程环境为centos 7和python 3.6.6,结果有228574个质数,并对代码部分进行了解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 质数:又称素数,乘法因子只有1和它自身的自然数;显然,素数肯定是奇数(除去2),而奇数却不一定是素数。如:9是奇数,但是它还有3这个乘法因子。
  2. 那么如何判断一个数是否为质数呢?
    先从乘法因子讨论,一个自然数的最小乘法因子必然是一组质数,对吧,比如15,它的乘法因子有3,5(从数学角度上,1也是,但是对于程序没有影响,暂不讨论),而3和5都是质数。
    也就是说,一个数如果是质数的话,它必然不能被2、3、5、7整除,这样就很容易判断一个数是否为质数了。

编程环境:
centos 7
python 3.6.6

这里求的是100万以内的质数
n=4
print(2,3,5,7)
for i in range(2,10**6):
    if i%2!=0:
        if i%3!=0:
            if i%5!=0:
                if i%7!=0:
                    n+=1
                    print('%d,'%i)
print('the number is %d'%n)

结果:共有228574个质数
代码的一些解释;

  1. n=4;是因为2、3、5、7这四个质数,循环中运行的结果不含这几个数,应另外加上。
  2. 在python3中i%2表示求余
  3. python中“**”表示幂运算
### 使用Python实现素数的方法 素数是编程中常见的问题之一,Python 提供了简洁的语法来实现这一功能。以下是几种常用的方法和代码示例。 #### 方法一:基本双重循环 通过双重循环逐一检查每个数字是否为素数。这种方法简单易懂,但效率较低,尤其在处理较大区间时。 ```python def find_primes(a, b): for n in range(a, b): if n > 1: # 素数定义大于1 for x in range(2, n): if n % x == 0: # 如果能被整除,则不是素数 break else: print(n, "是质数") find_primes(2, 10) # 调用函数并设置参数 ``` 这种方法的时间复杂度为 \(O(n^2)\),因为对于每个数字 \(n\),都需要进行 \(n-2\) 次判断[^1]。 #### 方法二:优化后的平方根判断法 根据数学原理,一个合数必然存在一个小于等于其平方根的因子。因此,只需检查从 2 到 \(\sqrt{n}\) 的所有数字即可。 ```python import math def is_prime(num): if num <= 1: return False for i in range(2, int(math.sqrt(num)) + 1): # 只需检查到平方根 if num % i == 0: return False return True def find_primes_optimized(a, b): primes = [] for num in range(a, b): if is_prime(num): primes.append(num) print(primes) find_primes_optimized(2, 100) # 示例调用 ``` 此方法的时间复杂度降低为 \(O(n \sqrt{n})\),适合处理较大的区间数据[^4]。 #### 方法三:使用列表生成式 利用列表生成式可以更简洁地表达逻辑,并结合平方根优化提高效率。 ```python def find_primes_list_comprehension(a, b): return [num for num in range(a, b) if all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1))] print(find_primes_list_comprehension(2, 100)) # 输出结果 ``` 这种方法不仅代码更加紧凑,而且易于阅读和维护[^3]。 #### 方法四:埃拉托色尼筛法(Sieve of Eratosthenes) 这是一种高效的算法,用于生成一定范围内的所有素数。它通过标记非素数的方式来筛选出素数。 ```python def sieve_of_eratosthenes(n): sieve = [True] * (n + 1) sieve[0:2] = [False, False] # 0 和 1 不是素数 for current in range(2, int(math.sqrt(n)) + 1): if sieve[current]: for multiple in range(current*current, n + 1, current): sieve[multiple] = False primes = [num for num, is_prime in enumerate(sieve) if is_prime] return primes print(sieve_of_eratosthenes(100)) # 示例调用 ``` 该方法的时间复杂度为 \(O(n \log \log n)\),适用于需要频繁计算素数的场景[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值