栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

素数筛法(欧拉筛、埃氏筛)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

素数筛法(欧拉筛、埃氏筛)

文章目录
  • 一、埃氏筛
    • 1.原理:
    • 2.代码
  • 二、欧拉筛
    • 1.前言
    • 2.原理
    • 3.代码
  • 总结

一、埃氏筛 1.原理:

质数的倍数不是质数。

时间复杂度: O ( n l o g 2 2 n ) O(nlog^2_2n) O(nlog22​n)
埃氏筛的时间复杂度不会证明,可戳别处

2.代码
int prm[255], prm_cnt;//存放素数的数组、素数个数
bool iscompos[255];//true代表为合数,false代表素数数
void make_prime(int n) {
	if (n <= 1)return;
	for (int i = 2; i <= n; i++) {
		if (iscompos[i] == 0) {
			prm[++prm_cnt] = i;
			for (int j = i * i; j <= n; j += i) {
				iscompos[j] = 1;
			}
		}
	}
	return;
}
二、欧拉筛 1.前言

埃氏筛中,例如21会被3、7同时筛去。

我们希望每个合数仅被筛去一次。于是有了欧拉筛。

2.原理

每个合数仅被最小质因子/最大因数筛去

时间复杂度: O ( n ) O(n) O(n)
每个数仅被处理一次故时间复杂度为 O ( n ) O(n) O(n)

3.代码
//时间复杂度:O(n)
int prm2[maxn], cnt2, tab2[maxn];
void make_prime2(int x) {
    if (x <= 1)return;
    for (int i = 2; i <= x; i++) {
        if (!tab2[i])
            prm2[++cnt2] = i;
        for (int j = 1; j <= cnt2 && prm2[j] * i < x; j++) { // 枚举素数,筛去倍数
            tab2[i * prm2[j]] = 1;
            if (!(i % prm2[j])) // 当前数为该素数的倍数,即 prm[j] 为最小质因子
                break;    
        }
    }
}

朝花夕拾喵~


总结

一般埃氏筛好像就够用了,但能用欧拉筛还是尽量用欧拉筛吧

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292475.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号