python 埃氏筛法判断一个数是否为素数

菜鸡一枚欢迎指正

目录

特点

思路

优化

代码


特点

合数都是被他的最小素数因子筛去的

思路

定义两个list : status : 表示整数状态,一开始除0,1外都默认为素数,合数标记为False prime:存放素数

遍历2->n 如果status为True,表示当前为i为素数,加入到prime数组。然后遍历prime列表pj把i*pj标记为合数。

注意:当i为合数,p[j]为i的最小素因子,那么标记完status[i*p[j]] 后就结束对于prime的遍历。例如:当i为4时,此时prime=[2,3], 标记status[i * 2]为False,因为2为4的最小素因子,所以此时结束对prime的遍历

当i大于n的一半后,i*prime[j]都大于n,所以无需再标记合数只需添加后续的素数即可

优化

由于偶数肯定不是素数所以可以只考虑奇数的情况

代码

#判断一个数是否为素数
def is_prime(n):#返回的是最小素因子,如果为素数返回0
    if n == 0 or n==1:
        return 1
    if n == 2:
        return 0
    if n%2==0:#偶数不是素数
        return 2
    m = int(n ** 0.5)
    status = [True for _ in range(int(m / 2) + 1)]  # 3,5,7,9,11,13,15,17,19,21,23
    prime = []
    for i in range(3, m + 1, 2):  
        if status[int((i - 3) / 2)]:
            if n % i ==0:
                return i
            prime.append(i)
        for pj in prime:  # 遍历prime
            if pj * i > m:  # 越界结束遍历
                break
            status[int((pj * i - 3) / 2)] = False
            if i % pj == 0:#p[j]为i的最小素因子,此时结束遍历
                break
    return 0

def prime_list(n):
    if n == 0 or n==1:
        return []
    if n == 2:
        return [2]
    m = int(n ** 0.5)
    status = [True for _ in range(int(n/2) + 1)]  # 3,5,7,9,11,13,15,17,19,21,23
    prime = []
    for i in range(3, n+1, 2):  # 遍历3-m,跳过所有偶数
        if status[int((i - 3) / 2)]:
            prime.append(i)
        for pj in prime:  # 遍历prime
            if pj * i > n:  # 当i大于n的一半后,i*prime[j]都大于n,所以无需再标记合数只需添加后续的素数即可
                break
            status[int((pj * i - 3) / 2)] = False
            if i % pj == 0:  # p[j]为i的最小素因子,此时结束遍历
                break
    return [2]+prime

n=int(input("请输入一个整数:"))
pr=is_prime(n)
if pr:
    print("{0}不是素数,最小素因子为{1}".format(n,pr))
else:
    print("{0}是素数".format(n))
pl=prime_list(n)
print("1到{0}的素数有{1}".format(n,pl))



相关推荐

  1. python 判断一个是否素数

    2024-04-01 22:48:11       41 阅读
  2. Python判断一个是否素数

    2024-04-01 22:48:11       37 阅读
  3. 筛选-判断素数

    2024-04-01 22:48:11       32 阅读
  4. C语言判断一个是否素数的三种方法(详细)

    2024-04-01 22:48:11       47 阅读
  5. C++算法——

    2024-04-01 22:48:11       28 阅读
  6. 用筛选(拉托色尼)求100之内的素数

    2024-04-01 22:48:11       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 22:48:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 22:48:11       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 22:48:11       82 阅读
  4. Python语言-面向对象

    2024-04-01 22:48:11       91 阅读

热门阅读

  1. ChatGPT:让学术写作更高效

    2024-04-01 22:48:11       36 阅读
  2. 大模型日报2024-04-01

    2024-04-01 22:48:11       44 阅读
  3. Leetcode 3097. Shortest Subarray With OR at Least K II

    2024-04-01 22:48:11       40 阅读
  4. C# 值类型和引用类型

    2024-04-01 22:48:11       31 阅读
  5. 数据预处理-平均值插值法

    2024-04-01 22:48:11       34 阅读
  6. AI大模型学习:跨越数学、编程与业务的桥梁

    2024-04-01 22:48:11       43 阅读
  7. c++ 小游戏(2种)

    2024-04-01 22:48:11       29 阅读
  8. 氯丁橡胶衬板是什么

    2024-04-01 22:48:11       32 阅读
  9. 二阶系统与环境相互作用

    2024-04-01 22:48:11       33 阅读
  10. 自定义函数的使用

    2024-04-01 22:48:11       41 阅读
  11. redis -String类型用法

    2024-04-01 22:48:11       35 阅读