首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python|欧拉筛法求质数

这个时候就可以使用筛法来求质数,本文介绍的是欧拉筛法。其运用的原理是质数的倍数一定不是质数。因此将质数的倍数直接标记成合数,以达到筛选质数的目的。...同样以此为思路的还有埃氏筛法,但埃氏筛法具有缺陷:对于一个合数,有可能被筛多次,例如20 = 2*10 = 4*5。...而对此进行改进,用合数的最小质因子进行筛选来确保每个合数只被筛选一次,这就是欧拉筛法。 但是具体是怎么做到每个合数只被筛选一次,我们来看下面的代码。...例如:i=2筛选4,i=3筛选6和9,但到i=4的时候,prime先为2,筛掉8,但运行到I % prime == 0这一步的时候就直接break了,也就避免了再遍历prime = 3的时候筛掉12,而...12是由i = 6时,prime = 2时筛掉。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    素数的筛法

    素数的筛法有很多种 在此给出常见的三种方法 以下给出的所有代码均已通过这里的测试 埃拉托斯特尼筛法 名字好长 :joy:  不过代码很短 思路非常简单,对于每一个素数,枚举它的倍数,它的倍数一定不是素数...看来这种算法还是不够优秀 下面我们来探索一下他的优化 另外,这种算法的时间复杂度:$O(n*logn)$ 埃拉托斯特尼筛法优化版 根据唯一分解定理 每一个数都可以被分解成素数乘积的形式 那我们枚举的时候...果然,加了优化之后这种算法快了不少 可以证明,它的复杂度为: 这种算法已经非常优秀了,但是对于 这种极端数据,还是有被卡的风险 那么,还有没有更快的筛法呢? 答案是肯定的!...欧拉筛 我们思考一下第二种筛法的运算过程 不难发现,对于6这个数,它被2筛了一次,又被3筛了一次 第二次筛显然是多余的, 我们考虑去掉这步运算 1 #include 2 #include...时间复杂度:严格 总结 在一般情况下,第二种筛法已经完全够用。 第三种筛法的优势不仅仅在于速度快,而且还能够筛积性函数,像欧拉函数,莫比乌斯函数等。 这个我以后还会讲的

    1.3K60

    欧拉筛法(线性筛)的学习理解

    在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛法,也即 O(n)的线性筛法。...埃氏筛法 埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。...埃氏筛法的缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……那么如何确保每个合数只被筛选一次呢?我们只要用它的最小质因子来筛选即可,这便是欧拉筛法。...欧拉筛法 欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。...因为欧拉筛法的原理便是通过最小素因子来消除。 结语 对于欧拉筛法的学习是先从接触到题开始的,研究了一天才弄懂,很惭愧,再次遇到题也不见得可以游刃有余的解决,在此与大家共勉,学海无涯。

    1.6K20

    【狂热算法篇】解锁筛法密码:埃氏筛与线性筛(欧拉筛)的深度剖析

    本篇简介: 对于素数的筛选法进行优化而得出的埃氏筛,线性筛的引入,一些细节处理,如为什么这么设计,好处在哪等一系列问题的解释,最后设计出代码;以及例题示例。...它在埃氏筛法的基础上进行了优化,能够以线性时间复杂度(即O(n))来求出一定范围内的所有素数。 2.2基本原理: 线性筛的核心思想是每个合数只被它的最小质因数筛掉一次。...这样就避免了埃氏筛法中一个合数可能被多个质因数重复筛选的情况,从而提高了效率。...三·线性筛与埃氏筛的比较: ①埃氏筛法简单易懂,但在筛选过程中会对合数进行多次标记,导致效率在一定程度上较低。...此篇到此也就完美收尾了,此外对于博主对埃氏筛和线性筛的学习此外还要感谢一位博主的博客的启发,对此再次感谢此位博主的分享;下面把博主的博客放下面了: 埃式与线性筛法

    5100

    浅谈积性函数的线性筛法

    前置知识 数论函数及相关基本定义 素数的线性筛 线性筛 线性筛可以在严格$O(n)$的时间内筛出积性函数的值, 它有常见的套路 假设$n = p_1^{a_1} p_2^{a_2} \dots p_k^...p_i)$和$f(p_i^{k+1})$的取值,那么直接套板子就行了 在下文中如无特殊说明,默认$p_i$表示$n$质因数分解之后第$i$个质数,$a_i$表示$p_i$的指数 常见的有以下几种 线性筛素数...GetSumD(1e3); for(int i = 1; i <= tot; i++) printf("%d ", SD[i]); return 0; } 非常见积性函数的筛法...很多情况下我们会遇到求两个积性函数狄利克雷卷积的情况 很显然,这个函数也是积性函数,我们考虑如何求得 为了方便筛,我们需要把问题无限简化, 设$low(i)$表示$p_1^{a_1}$ 考虑筛法中最关键的地方...线性筛约数个数和、约数和 线性筛,积性函数,狄利克雷卷积,常见积性函数的筛法

    59420
    领券