• 【算法】欧拉筛 输出任意范围内的质数


    总所周知,质数(prime number)又称素数,除了1自身外,不能被其他的自然数整除。

    那么我们今天就来看看一个简单的寻找素数的算法,欧拉筛。欧拉筛是在埃氏筛的基础上做了一定的改进,大幅降低时间复杂度。

    欧拉筛

    输入

    • 区间范围n

    输出

    • 素数列表

    思想

    • 通过打表的方式,构建素数表,这张表包含了n个元素,包括素数和合数
    • 素数是无法通过其他素数相乘得到的,利用这一原理,可以将所有能够被素数相乘得到的值设置为合数

    过程

    • 创建一个大小为n的列表isPrime,元素值代表是否为素数。
    • 创建一个新的可变列表prime,元素值代表素数
    • 遍历isPrime,若元素值为1,则将其加入prime列表。
    • 将该元素与prime中的所有素数相乘:
      • 若该元素为素数,那么会遍历prime列表,得到的结果是最小素数相乘的合数
      • 若该元素为合数,那么将为其添加新的最小质数,直到遇到初始质数。(同样也是最小质数相乘)

    算法

    n=int(1e5+1)
    prime=[]
    isPrime=[1 for i in range(n+1)]
    # 欧拉筛构建1-n的所有质数
    for i in range(2,n+1):
        if isPrime[i]==1:
            # 质数加入队列
            prime.append(i)
    
        # 删除质数集构成的合数
        for j in range(len(prime)):
            if prime[j]*i<n:
                # 合数去掉了
                isPrime[prime[j]*i]=0
            else:
                break
            # 通过最小质数来构建即可
            if i%prime[j]==0:
                # 当然第一次遇到还是要乘上去的,这样才会倍增
                break
    print(prime)
    len(prime) # 664579
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    复杂度

    时间复杂度约等于 O ( N ) O(N) O(N),它只对每个元素遍历一次。

  • 相关阅读:
    Windows 修vscode的插件安装和缓存目录 释放C盘空间
    反序列化漏洞(2), 分析调用链, 编写POC
    C++ 炼气期之算术运算符
    Go Mac配置Air热加载
    尚硅谷-Spring Cloud
    震裕转债上市价格预测
    Vue - 图片浏览组件v-viewer
    步进电机驱动板在电机运行中起到什么作用?
    Linux下多线程的操作
    多目标优化算法matlab代码大合集
  • 原文地址:https://blog.csdn.net/qq_45957458/article/details/127640262