首页 > 其他分享 >[线筛|欧拉筛]线性筛选素数

[线筛|欧拉筛]线性筛选素数

时间:2023-03-20 15:07:19浏览次数:44  
标签:prime 标记 int 合数 素数 筛选 primes 欧拉


来源:模板

题目描述:用线行筛筛选素数,将指定范围的素数找出,达到O(n)的效果。

思路

时间复杂度

0(n)

思路

任意值必然可以被分解为:​​a=b1^c1*b2*c2*...​​​ 例如​​9=3^3,15=3*5,55=5*11​​ 即所有的合数都可以被拆解为素数倍数的乘积。
当我们从2开始找到素数与含有素数的合数,将合数标记为​​非素数​​,每个合数都将被最小因素数标记,且只标记一次。
所以该公式虽然为双重循环,但实际时间复杂度为o(n);

注意 ​​if(i%primes[j]==0)break;​

当这条命令执行时,有两种可能
1.被最小素数标记。
2.自己就是素数。
在第二种情况下往往会使合数遍历得很大,比如​​​i=7​​​遍历到​​49​​​才会停止,而​​35​​​就被​​7​​​标记,而非​​2​​。

CPP代码

#include<iostream>

using namespace std;

const int N=1e6+10;
bool st[N];
int primes[N],cnt;//prime质数,cnt计数当前值的位置

int get_primes(int n)
{
for(int i=2;i<=n;i++)//最小素数是2,从2开始跑
{
if(!st[i])primes[cnt++]=i;//如果没有被判定,则表明是素数
for(int j=0;primes[j]*i<=n;j++)//找出当前质数构成得合数,且该合数不得大于最大值n
{
st[primes[j]*i]=true;//因为因数为素数,所以涉及合数标记为非素数
if(i%primes[j]==0)break;//保证当前值i可以被i得最小因素数标记,且只有一次,保证o(n)
}
}
}
int main()
{
get_primes(1000);

for(int i=0;i<20;i++)cout<<primes[i]<<endl;
return 0;
}

以下解释来自博主​​__Simon_的文章欧拉线性筛素数

原理是利用了每个合数必有一个最小素因子,每个合数仅被它的最小素因子筛去正好一次,当 i 能整除 prime[ j ],那么i * prime[ j+1 ] 这个合数肯定被 prime[j] 乘以某个数筛掉,因为 i 中有prime[j]且 i * prime[ j+1 ]中也有prime[ j ]。

举个例子:

当 i = 8,prime[ ] = 2,3,5,7;

i * prime[ ] = 16,24,40,56;

因为8 % 2 = 0,所以24,40,56,可以不筛,直接break;

就如上面那句话所说的,当8能整除2时,8乘以 下一个素数3 的值24,将会被12乘以2筛掉。

即24 = 8 * 3=(2 * 4) * 3 = 2 * (4 * 3) = 2 * 12; 被12筛掉

40 = 8 * 5=(2 * 4) * 5 = 2 * (4 * 5) = 2 * 20; 被20筛掉

56 = 8 * 7=(2 * 4) * 7 = 2 * (4 * 7) = 2 * 28; 被28筛掉

这些数后面会被筛掉,即 i = 12,20,28时。所以现在就不用筛选,降低时间复杂度。


标签:prime,标记,int,合数,素数,筛选,primes,欧拉
From: https://blog.51cto.com/u_16014765/6132919

相关文章

  • [pat乙]1007 素数对猜想
    1007素数对猜想(20分)让我们定义dn为:dn=pn+1-pn,其中pi是第i个素数。显然有d1=1且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”......
  • [pat乙]1013 数素数
    1013数素数(20分)算法标签:欧拉筛1013数素数(20分)令P​i​​表示第i个素数。现任给两个正整数M≤N≤10​4​​,请输出P​M​​到P​N​​的所有素数。......
  • 数学知识模板之筛法求素数
    筛法求素数1.朴素筛法求素数intprimes[N],cnt;boolst[N];voidget_primes(intn){ for(inti=2;i<=n;i++) { if(st[i])continue; primes[cnt++]=......
  • 关于欧拉定理与费尔马定理
    关于欧拉定理:看到很多地方包括百科上都是下面方式定义的如果a,m都属于正整数,且gcd(a,m)=1,则会有a^φ(m)≡1(modm) 但这样说不是很严谨的,实际上应该要再加一个条件(m......
  • vba 根据日期筛选
    1.根据日期筛选如下excel数据,A列为日期格式,D列为常规格式,单元格最前面有单引号' EXCEL数字前加单引号可以把数字当成文本来处理,输入的是什么,展示的就是什么   ......
  • 素数定理的初等证明
    住:此文中\(\log\)指代自然对数一、素数定理的弱化版即证:\[\pi(n)=\Theta\left(\frac{n}{\logn}\right)\]记:\[H(n)=\frac{1}{2}+\frac{1}{3}+\cdots+\frac{1}{n}=\s......
  • 变相欧拉
    ProblemDescriptionThegreatestcommondivisorGCD(a,b)oftwopositiveintegersaandb,sometimeswritten(a,b),isthelargestdivisorcommontoaandb,F......
  • 【洛谷】P4139 上帝与集合的正确用法(扩展欧拉定理)
    原题链接题意求:\[2^{2^{2^{\ldots}}}\modp\]可以证明这个式子一定为一个常数。\(1\leqp\leq10^7\)思路根据扩展欧拉定理,可以得到:\[2^{2^{2^{\ldots}}}\equi......
  • python并行计算demo,用于求0~n之间的素数之和
     想试试服务器的并行计算能力,就让cpu慢慢计算,计算0~n之间所有素数之和设置target为结尾,num_of_processors为进程数,即可开始跑如下所示frommultiprocessingimportP......
  • 欧拉定理学习笔记
    费马小定理:当$a,p\in\mathbb{Z}$且\(p\)为质数,$a\not\equiv0\pmod{p}$时,有:\[a^{p-1}\equiv1\pmod{p}\]故\(a^b\equiva^{b\mod(p-1)}\pmod{p}\)欧......