ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】欧拉筛法(线性筛素数)

2021-10-24 18:31:29  阅读:192  来源: 互联网

标签:筛法 pri 素数 最小 因子 必为 线性 引理 欧拉


算法介绍:欧拉筛法是在O(N)线性时间内实现素数筛选的优秀算法。

算法思路:总体上与Eratosthenes筛法类似,也是用较小的数筛去较大的合数。

关键思路在于:每一个合数都保证是被其最小的质因子筛去的,下简称称该条件为线性条件。

结合代码分析:

inline void Euler_Sieve(){
    for(register int i=2;i<=n;i++){
        if(isPrime[i]) pri[++cnt]=i;
        for(register int j=1;j<=cnt&&i*pri[j]<=n;j++){
            isPrime[i*pri[j]]=false;
            if(i%pri[j]==0) break;
        }
    }
}

对每一个数i,无论其是否为质数,都可以用其筛去其他数。

j 循环到 i % Prime[j] = 0就恰好需要break的理由是:

设1<=s<j<t

证明:若最小质因子比pri[j]小,则在循环到j之前就已break,不可能循环至pri[j]。

证明:引理1已证i的最小质因子为pri[j],故i*pri[j]最小质因子也应为pri[j]。引理2保证了被pri[j]筛掉的所有合数都满足线性条件。

证明方法如引理1。引理3保证了j之前所有被筛掉的合数都满足线性条件。

证明方法:由引理1可易证。故若j继续循环增大,则i*pri[t]将被pri[t]筛掉,但pri[t]并非其最小质因子,故不满足线性条件,故需break。

综上,当i%pri[j]==0的时候实行break操作可保证满足线性条件,实现线性筛。

标签:筛法,pri,素数,最小,因子,必为,线性,引理,欧拉
来源: https://www.cnblogs.com/Azurestars/p/15452085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有