<更新提示>

<第一次更新>


<正文>

素数(Prime)及判定

定义

素数又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,否则称为合数。

1既不是素数也不是合数。

判定

如何判定一个数是否是素数呢?显然,我们可以枚举这个数的因数,如果存在除了它本身和1以外的因数,那么这个数就是素数。

在枚举时,有一个很简单的优化:一个合数\(n\)必有一个小于等于\(\sqrt{n}\)的因数

证明如下:

假设一个合数\(n\)没有小于等于\(\sqrt{n}\)的因数。

由于\(n\)为合数,所以除了\(n\)与\(1\)以外,它至少还有两个因数\(p_1(p_1>\sqrt{n})\)和\(p_2(p_2>\sqrt{n})\),满足\(p_1p_2=n\)。

与\(p_1>\sqrt{n},p_2>\sqrt{n}\)矛盾,故假设不成立。

所以我们得到了\(O(\sqrt n)\)效率的素数判定算法。

\(Code:\)

inline bool check(k)
{
for(int i=2;i*i<=k;i++)
if(k%i==0)return 0;
return 1;
}

筛法(Sieve)求素数

现在有一个新的问题模型,如果我们需要求解\(1-n\)的所有素数,那么直接用判定法效率显然太低了。我们需要更高效率的算法,由此我们引入筛法。

埃氏筛法(The sieve of Eratosthenes)

这是筛法思想的基本模型。根据算数基本定理,我们得知:

\[k=p_1^{a_1}·p_2^{a_2}·...·p_k^{a_k}
\]

即任意一个数\(k\)都是由若干素数相乘得到的。

那么我们可以枚举\(2-n\)的每一个数,如果这个数没被标记,则说明这个数是素数,记录这个数,并标记这个数的所有倍数不是素数。

那么这样就可以求解\(1-n\)的所有素数了。时间复杂度为\(O(n\ ln(ln\ n))\)。

实现

这就是OI竞赛中最常用的素数求解算法了,实现也非常简单。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
int cnt=0,n,flag[100080]={},Prime[100080]={};
inline void sieve(void)
{
for(int i=2;i<=n;i++)
{
if(!flag[i])Prime[++cnt]=i;else continue;
for(int j=i*2;j<=n;j+=i)flag[j]=true;
}
}
int main(void)
{
cin>>n;
sieve();
for(int i=1;i<=cnt;i++)cout<<Prime[i]<<" ";
cout<<endl;
}

欧拉筛法(The sieve of Euler)

欧拉筛法就是基于埃氏筛法的优化。

在模拟埃氏筛法的过程中,我们不难发现有很多合数会被它的各个素因子筛好几次,我们可以基于这种情况进行优化:每个合数必有一个最小素因子,用这个因子筛掉合数

所以,我们直接利用之前求出的素数进行筛数,如果发现当前这个数已经是之前某个素数的倍数时,那就说明这个数在以后会由某个更大的数乘以这个小素数筛去,同理,之后的筛数也是没有必要的,这时候就可以跳出循环了。

这样,我们就能保证每一个数只被筛一次,就实现了线性时间复杂度的筛法。

实现

欧拉筛法和埃氏筛法大体相似,但细节有所不同,注意不要搞混。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
int cnt=0,n,flag[100080]={},Prime[100080]={};
inline void seive(void)
{
for(int i=2;i<=n;i++)
{
if(!flag[i])Prime[++cnt]=i;
//注意,这里没了continue,因为在筛某个数时需要用到它的最大因数,而这个数可能是个合数,所以不管是素数还是合数,都要执行以下的筛数过程
for(int j=1;j<=cnt&&i*Prime[j]<=n;j++)
{
flag[i*Prime[j]]=1;
if(i%Prime[j]==0)break;
}
}
}
int main(void)
{
cin>>n;
seive();
for(int i=1;i<=cnt;i++)cout<<Prime[i]<<" ";
cout<<endl;
}

<后记>

『素数 Prime判定和线性欧拉筛法 The sieve of Euler』的更多相关文章

  1. HDU 3823 Prime Friend(线性欧拉筛+打表)

    Besides the ordinary Boy Friend and Girl Friend, here we define a more academic kind of friend: Prim ...

  2. [洛谷P3383][模板]线性筛素数-欧拉筛法

    Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...

  3. 欧拉筛法模板&&P3383 【模板】线性筛素数

    我们先来看欧拉筛法 •为什么叫欧拉筛呢?这可能是跟欧拉有关 •但是为什么叫线性筛呢?因为它的复杂度是线性的,也就是O(n),我们直接来看代码   #include<cstdio> #inc ...

  4. 素数判断-----埃氏筛法&欧拉筛法

    埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...

  5. BZOJ 2818 Gcd 线性欧拉

    题意:链接 方法:线性欧拉 解析: 首先列一下表达式 gcd(x,y)=z(z是素数而且x,y<=n). 然后我们能够得到什么呢? gcd(x/z,y/z)=1; 最好还是令y>=x 则能 ...

  6. POJ2909_Goldbach's Conjecture(线性欧拉筛)

    Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least one p ...

  7. 2018牛客网暑期ACM多校训练营(第三场) H - Diff-prime Pairs - [欧拉筛法求素数]

    题目链接:https://www.nowcoder.com/acm/contest/141/H 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  8. 素数筛总结篇___Eratosthenes筛法和欧拉筛法(*【模板】使用 )

    求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为 ...

  9. BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)

    LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB   This problem will be judged on UVALive. Orig ...

随机推荐

  1. Mapreduce求气温值项目

    Mapreduce前提工作 简单的来说map是大数据,reduce是计算<运行时如果数据量不大,但是却要分工做这就比较花时间了> 首先想要使用mapreduce,需要在linux中进行一些 ...

  2. Random Erasing Augmentation(REA)

    为了增强模型的泛化的性能,一般的手段有数据增强和正则化方法(如dropout,BN),而用于数据增强的一般方法有:随机裁剪.随机水平翻转.平移.旋转.增加噪音和生成网络方法等(前两个方法用的最多,也最 ...

  3. 练习html,css,js仿制百度首页

    1.练习目的 练习使用html,scc,js 完成界面样式,用ul标签实现文本框下拉,通过js完成添加列表内容等功能 2.效果 3.程序代码 <!DOCTYPE html> <htm ...

  4. time-based基于google key生成6位验证码(google authenticator)

    由于公司服务器启用了双因子认证,登录时需要再次输入谷歌身份验证器生成的验证码.而生成验证码是基于固定的算法的,以当前时间为基础,基于每个人的google key去生成一个6位的验证码.也就是说,只要是 ...

  5. WWH——学习方法理解与分析

    WWH是"What+Why+How"的简称,是对学习方法最完美的概括."如果不按照WWH这种模式来教学,90%的结果是老师没教好,学生学不好." 1.What( ...

  6. BZOJ1757 : Apple 偷苹果

    设$f0[i][j][x][y][S]$表示盗贼位于$(i,j)$,守卫位于$(x,y)$,每棵苹果树苹果数量为$S$,盗贼先手时盗贼还能偷多少苹果. 设$f1[i][j][x][y][S]$表示盗贼 ...

  7. LOJ 6092

    这个题也很没意思 发现q那么大没有用, 不重复的询问有26*n种 所以记录一下就好了 #include<bits/stdc++.h> using namespace std; #defin ...

  8. Git 实用指南

    传送门: https://mp.weixin.qq.com/s?__biz=MzI3MzgxNDY2MQ==&mid=2247484159&idx=1&sn=2d28513ef ...

  9. 30 ArcGIS 许可管理器常见问题(持续更新中……)

    一.[单机版] 1.1.ArcMap 1.2.ArcGIS Pro 错误一 ArcGIS Pro单机许可安装授权,在Configure Authorization界面报“This functional ...

  10. Vue v-for循环添加表单v-model不重复变动的注意事项!

    正常添加,v-model,修改所有循环会得到一样的结果! 定义一个users[]的数组,不要定义全局的user,而是要在Vue里面的方法里定义局部的变量添加.