首页 > 其他分享 >【专题】质数筛

【专题】质数筛

时间:2023-08-12 23:33:46浏览次数:20  
标签:prime 专题 log int 质数 tot 复杂度

质数筛

Q:给定自然数 n ,求 [1, n] 区间内的所有质数。

1、原始筛法(时间复杂度:O(n√n)

算法思路:不加思考的暴力枚举,即逐个判断区间内每个数是否是质数。判断单个质数的时间复杂度为 O(√n) ,判断 1 ~ n 是否是质数的时间复杂度为 O(n√n)

代码展示:

int tot, prime[N]; /* prime[i] 为第 i 个质数 */
bool is_prime(int n) { if (n < 2) return false; for (int i = 2; i * i <= n; i ++) if (!(n % i)) return false; return true; }
void prime_sieve() { for (int i = 1; i <= n; i ++) if (is_prime(i)) prime[++ tot] = i; }

2、普通筛法(时间复杂度:O(n log n)

算法思路:和原始筛法相比有改进,一个(大于 1)自然数的 k 倍数(k > 1)都一定不是质数。

代码展示:

bool is_prime[N]; /* is_prime[i] 表示 i 是不是质数,false 即是 */
int tot, prime[N]; /* 共有 tot 个质数,prime[i] 为第 i 个质数 */ 

void prime_sieve() {
  for (int i = 2; i <= n; i ++){
    if (!is_prime[i]) prime[++ tot] = i;
    for (int j = i << 1; j <= n; j += i)
      is_prime[j] = true;
  }
}

3、埃氏筛 形式 1(时间复杂度:O(n log log n)

算法思路:著名的质数筛法,由古希腊数学家 Eratosthenes (埃拉托斯特尼)发明,和普通筛法相比减少了许多冗余,一个质数的 k 倍数(k > 1)都一定不是质数。

代码展示:

bool is_prime[N]; /* is_prime[i] 表示 i 是不是质数,false 即是 */
int tot, prime[N]; /* tot 个质数,prime[i] 为第 i 个质数 */

void Eratosthenes_sieve() {
    for (int i = 2; i <= n; i ++){
        if (!is_prime[i]){
            prime[++ tot] = i;
            for (int j = i << 1; j <= n; j += i)
                 is_prime[j] = true;
        }
    }
}

4、埃氏筛 形式 2(时间复杂度:O(n log log n)

算法思路:埃氏筛的一种不明显的优化,大于 1 的整数的质数倍数不是质数。

代码展示:

bool is_prime[N]; /* is_prime[i] 表示 i 是不是质数,false 即是 */
int tot, prime[N]; /* 共有 tot 个质数,prime[i] 为第 i 个质数 */ 

void Eratosthenes_sieve() { 
  for (int i = 2; i <= n; i ++){ 
    if (!is_prime[i]) prime[++ tot] = i; 
    for (int j = 1; j <= tot && i * prime[j] <= n; j ++) 
      is_prime[i * prime[j]] = true; 
  } 
}

5、欧拉筛(时间复杂度:O(n)

算法思路:最著名、最常用的质数筛!在埃氏筛的形式 2 上多了一行神奇的代码,时间复杂度就从 O(n log log n) 降至 O(n) ,因其是线性复杂度,所以也称线性筛。如果已经被筛过了,则可以终止这轮筛选合数。

代码展示:

bool is_prime[N]; /* is_prime[i] 表示 i 是不是质数,false 即是 */
int tot, prime[N]; /* 共有 tot 个质数,prime[i] 为第 i 个质数 */ 

void Linear_sieve() { 
  for (int i = 2; i <= n; i ++){ 
    if (!is_prime[i]) prime[++ tot] = i; 
    for (int j = 1; j <= tot && i * prime[j] <= n; j ++){
      is_prime[i * prime[j]] = true;
                 if (!(i % prime[j])) break; // beautiful !!!
           }
  } 
}

5、埃氏筛 形式 1 + bitset(时间复杂度:O(n log log n)

算法思路:令人难以置信的是,埃氏筛搭配 C++ 神奇的 bitset 容器(不是 STL),可以让高复杂度的它效率高于低复杂度的欧拉筛!!!

代码展示:

bitset<N> is_prime; /* is_prime[i] 表示 i 是不是质数,true 即是 */
int tot, prime[N]; /* tot 个质数,prime[i] 为第 i 个质数 */

void Eratosthenes_sieve() {
    is_prime.set(); /* 初始化为 true */
    is_prime[0] = is_prime[1] = false;
    for (int i = 2; i <= n; i ++){
        if (!is_prime[i]){
            prime[++ tot] = i;
            for (int j = i << 1; j <= n; j += i)
                 is_prime[j] = false;
        }
    }
}

参考资料:OI Wiki

标签:prime,专题,log,int,质数,tot,复杂度
From: https://www.cnblogs.com/vectorSpace-blog/p/17625843.html

相关文章

  • 【专题】消费电子行业经营趋势白皮书报告PDF合集分享(附原数据表)
    在后疫情时代,全球经济和消费力的增长面临巨大考验。2022年,电脑、手机等产品的市场规模出现了小幅收缩调整。然而,在这样的环境下,各种消费电子的细分领域却展现出了强大的韧性。阅读原文,获取专题报告合集全文,解锁文末29份消费电子行业相关报告。智能手表、真无线耳机、AR/VR眼镜、户......
  • 【专题】2023消费电子行业数字化转型白皮书报告PDF合集分享(附原数据表)
    在后疫情时代,全球经济和消费力的增长面临巨大考验。2022年,电脑、手机等产品的市场规模出现了小幅收缩调整。然而,在这样的环境下,各种消费电子的细分领域却展现出了强大的韧性。阅读原文,获取专题报告合集全文,解锁文末29份消费电子行业相关报告。智能手表、真无线耳机、AR/VR眼镜、户......
  • 【专题】中国家电及消费电子趋势洞察概览报告PDF合集分享(附原数据表)
    在后疫情时代,全球经济和消费力的增长面临巨大考验。2022年,电脑、手机等产品的市场规模出现了小幅收缩调整。然而,在这样的环境下,各种消费电子的细分领域却展现出了强大的韧性。阅读原文,获取专题报告合集全文,解锁文末29份消费电子行业相关报告。智能手表、真无线耳机、AR/VR眼镜、户......
  • 【专题】研发驱动中国消费电子品牌 加速实现国际化与高端化报告PDF合集分享(附原数据表
    在后疫情时代,全球经济和消费力的增长面临巨大考验。2022年,电脑、手机等产品的市场规模出现了小幅收缩调整。然而,在这样的环境下,各种消费电子的细分领域却展现出了强大的韧性。阅读原文,获取专题报告合集全文,解锁文末29份消费电子行业相关报告。智能手表、真无线耳机、AR/VR眼镜、户......
  • 某公司笔试题 - 质数因子(附python代码)
    #输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举),(如180的质因子为22335)#数据范围1<=n<=2*10**9+14#质数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。importmaths=input("请输入一个正整数:")whileTrue:#isdigit函......
  • 【专题一】三角函数,平面向量与复数
    【专题一】三角函数,平面向量与复数这是个人【专题式学习】的第一部分——三角函数,平面向量与复数。之所以把这三个放在一起,是因为它们联系真的很紧密。()三角函数定义考虑一个平面直角坐标系中的点\(P(x,y)\)(\(P\)不与原点重合),角\(\alpha\)的始边为\(x\)轴正半轴,终边为......
  • 【专题】2023年全球中小型快消品企业调研报告PDF合集分享(附原数据表)
    全文链接:https://tecdat.cn/?p=33411原文出处:拓端数据部落公众号我们在这份报告合集中分享了有关中国本土企业的信息,包括快消品企业的渠道布局、所面临的外部风险和挑战,以及如何应对这些挑战。阅读原文,获取专题报告合集全文,解锁文末19份快消品行业相关报告。中国本土企业在制定......
  • 并查集专题
    并查集专题\(AcWing\)\(836\).合并集合【最简并查集,路径压缩概念】\(AcWing\)\(837\).连通块中点的数量【并查集+附加家族成员数量】\(AcWing\)\(240\).食物链【扩展域并查集,带权并查集】\(AcWing\)\(1250\).格子游戏【普通并查集】\(AcWing\)\(1252\).搭配......
  • 【专题】2023快消行业营销白皮书报告PDF合集分享(附原数据表)
    全文链接:https://tecdat.cn/?p=33411我们在这份报告合集中分享了有关中国本土企业的信息,包括快消品企业的渠道布局、所面临的外部风险和挑战,以及如何应对这些挑战。阅读原文,获取专题报告合集全文,解锁文末19份快消品行业相关报告。中国本土企业在制定价格策略方面,面临的......
  • 【专题】2022中国快消品零售市场趋势解读报告PDF合集分享(附原数据表)
    全文链接:https://tecdat.cn/?p=33411我们在这份报告合集中分享了有关中国本土企业的信息,包括快消品企业的渠道布局、所面临的外部风险和挑战,以及如何应对这些挑战。阅读原文,获取专题报告合集全文,解锁文末19份快消品行业相关报告。中国本土企业在制定价格策略方面,面临的......