首页 > 其他分享 >质数筛法

质数筛法

时间:2024-10-08 20:22:03浏览次数:1  
标签:筛法 标记 质数 times break 合数

1. 埃拉托斯特尼筛法

从小到大枚举每一个数 \(x\),考虑标记每一个合数,如果 \(x\) 没被标记,那么它就是质数,所以 \(x \times i\) 就是合数,将它们标记,由于小于 \(x^2\) 的 \(x\) 的倍数之前已经筛过了,所以从 \(x^2\) 开始。最后没被标记的就是质数,复杂度 \(\mathcal{O}(n \log n \log n)\)。

这种筛法可以进行优化,例如枚举到 \(\sqrt{n}\),只筛奇数,bitset 优化等等,甚至可以快过线性筛法。

bitset<N> not_prime;
not_prime[1]=1;
for(int i=2;i*i<=n;i++)
{
   if(not_prime[i]==0)
	{
		for(int j=i*i;j<=n;j+=i)
		{
			not_prime[j]=1;
		}
	}
}
For(i,1,n)
{
	if(!not_prime[i]) prime[++cnt]=i;
}

2. 欧拉筛

埃氏筛法会将一个合数重复多次标记。如果能让每个合数都只被标记一次,那么时间复杂度就可以降到 \(\mathcal{O}(n)\) 了。

考虑让每一个合数只被其最小质因子标记。还是从小到大枚举每一个数 \(i\),标记每一个合数,维护一个质数的序列 \(p\),如果 \(i\) 没被标记,那么将它加入这个序列,接下来遍历这个序列(无论 \(i\) 是不是一个质数),标记 \(i \times p_j\) 为合数,如果 \(i\) 是 \(p_j\) 的倍数,那么就可以直接 \(\texttt{break}\) 了,这是由于:

如果不 \(\texttt{break}\) 的话,那么 \(i \times p_{j+1}\) 就会被 \(p_{j+1}\) 标记,而 \(p_j \mid i\),所以 \(p_j\) 也是 \(i \times p_{j+1}\) 的一个质因数,由于序列 \(p\) 是递增的,所以 \(p_j < p_{j+1}\),所以 \(p_{j+1}\) 不是 \(i \times p_{j+1}\) 的最小质因子,违背了每一个合数只被其最小质因子标记的原则,所以需要 \(\texttt{break}\)。

for(int i=1;i<=n;i++)
{
	if(!notprime[i])
	{
		prime[++cnt]=i;
	}
	for(int j=1;j<=cnt&&(long long)i*prime[j]<n;j++)
	{
		notprime[i*prime[j]]=1;
		if(i%prime[j]==0)
		{
			break;
		}
	}
} 

标签:筛法,标记,质数,times,break,合数
From: https://www.cnblogs.com/zhuluoan/p/18452445

相关文章

  • 【C语言用筛选法求质数】
    C语言用筛选法求质数筛选法,另一种思路的求质数方法上面的方法数越大判断次数越多,运算时间越长,效率越差,如果对于给定的一个集合,可以用筛选法,思路是将集合中的非质数(合数)标出来,余下来的就是质数了。给定的字符数组charprime[100]={0};,初始化为0,默认全是质数:-)!prime[0]=......
  • 区间质数搜索——埃拉托斯特尼筛法和欧拉筛法
    参考资料【中国大学生计算机设计大赛国赛二等奖微课与教学辅助《埃拉托斯特尼筛法》】【中国大学生计算机设计大赛《素数筛选—欧拉线性筛选法详解》】Eratosthenes筛法-CSDN博客【算法/数论】欧拉筛法详解:过程详述、正确性证明、复杂度证明-CSDN博客水平有限,欢迎交流!练习题......
  • 筛质数(线性筛法--进阶版)(面对大部分都直接ac)
    给定一个正整数 n,请你求出 1∼n中质数的个数。输入格式共一行,包含整数 n。输出格式共一行,包含一个整数,表示 1∼n中质数的个数。数据范围1≤n≤10^6输入样例:8输出样例:4思路:给一个数:将质数筛到的同时,筛去它的倍数,并且该倍数一定是在给定的数内的这样在下次......
  • 判断质数(小白秒懂版本)短时间记忆二分模板
    给定 n个正整数 ai,判定每个数是否是质数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个正整数 ai。输出格式共 n行,其中第 i行输出第 i个正整数 ai是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100,1≤ai≤231−1输入样例:226输出样例:Yes......
  • 筛法求素数
    筛法求素数Eratosthenes筛法时间复杂度\(O(nloglogn)\)。关键优化:\(j\)从\(i\timesi\)开始voidgetprime(intmx){ memset(is_prime,1,sizeof(is_prime)); is_prime[0]=is_prime[1]=0; F(i,2,mx){ if(is_prime[i]){ prime[++cnt]=i;//存 if(1ll......
  • 信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛
    2023CSP-S阅读程序2判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>02#include<cmath>03#include<vector>04#include<algorithm>05usingnamespacestd;0607longlongsolve1(intn){08vector<bo......
  • 信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛
    2023CSP-S阅读程序2判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>02#include<cmath>03#include<vector>04#include<algorithm>05usingnamespacestd;0607longlongsolve1(intn){08vector<boo......
  • 一个线性筛的多功能组合:筛法求质数+约数个数+约数和
    F:\BC\2024\9>main1活动代码页:9362 2X2=43 3X2=6 3X3=94X2=85 5X2=10 5X3=15 5X5=256X2=127 7X2=14 7X3=21 7X5=35 7X7=498X2=169X2=18 9X3=2710X2=2011 11X2=22 11X3=33 11X5=55 11X7=77 11X11=12112X2=2413 13X2=26 13X......
  • 「数学::质数」埃氏筛|欧拉筛(埃拉托斯特尼筛法|线性筛法)/ LeetCode 204(C++)
    目录概述1.埃氏筛思路复杂度Code2.欧拉筛(线性筛)思路复杂度Code总结概述上一节我们介绍了对判断一个数是否为质数的方法:「数学::质数」试除法/LuoguP5736(C++)那如果我们期望输出一个范围内的所有质数,使用试除法的时间复杂度是n√n,怎么办呢?LeetCode204:给定整......
  • 【AcWing】866~868. 质数
    #include<iostream>#include<math.h>usingnamespacestd;intn;boolis_prime(intx){if(x<2)returnfalse;for(inti=2;i<=x/i;i++){if(x%i==0)returnfalse;}returntrue;}intmain(){cin>>n;......