ACM数论-素数

ACM数论——素数 


 

素数定义

        质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。例 子:2、3、5、7、11、13、17、19。(那时候还有一种说法叫做“质数”,但是就语言上来说,我觉得“素数”这种叫法和“合数”比较搭配,类比于“化学元素”和“化合物”来看,叫“素数”非常贴切)

素数一些性质:

  1. 质数p的约数只有两个:1和p;
  2. 任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,这种分解是唯一的;
  3. 一个偶数可以写成两个合数之和,其中每一个合数都最多只有9个质因数;
  4. 一个偶数必定可以写成一个质数加上一个合成数,其中合数的因子个数有上界;

素数应用:

  1.  数学上来看,质数有很多尚未证明的特性;应用上的话,公钥密码是一比较好的例子了。
  2. 素数对于数论就好像元素对于化学。(摘自知乎)

 判断素数:

 1 //判断是否是一个素数
 2 int IsPrime(int x)
 3 {
 4     if(x<=1)    //0,1,负数都是非素数 
 5         return 0;
 6     int ans=(int)sqrt(x)+1;     /*计算枚举上界,为防止ans值带来的精度损失,所以采用根号值取整后再加1,即宁愿多枚举一个,也不愿少枚举一个数 */
 7     for(int i=2; i<ans; i++)
 8     {
 9         if(x%i==0)
10         {
11             return 0;
12         }
13      }
14     return 1;
15 }
View Code

 素数筛法:

  1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.

  2.代码如下:

for( i=3; i<=sqrt(n); i+=2 )
{  if(prime[i]) for( j=i+i; j<=n; j+=i )prime[j]=false;}

    3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。
      原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉。 
    一个简单的筛素数的过程:n=30。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


    第 1 步过后4 ... 28 30这15个单元被标成false,其余为true。
    第 2 步开始:
     i=3; 由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.
     i=4; 由于prime[4]=false,不在继续筛法步骤。
     i=5; 由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.
     i=6>sqrt(30)算法结束。
    第 3 步把prime[]值为true的下标输出来:
     for(i=2; i<=30; i++)
       if(prime[i]) printf("%d ",i);
    结果是 2 3 5 7 11 13 17 19 23 29

  下图为n=120的素数筛:

// 1:这是最原始的素数筛法
#define Max 1000000
bool prime[Max];
void IsPrime(){prime[0]=prime[1]=0;prime[2]=1;for(int i=3;i<max;i++)prime[i]=i%2==0?0:1;int t=(int)sqrt(Max*1.0);for(int i=3;i<=t;i++)if(prime[i])for(int j=i;j<Max;j+=i)prime[j]=0;
}
//2:优化后的筛法,手动地模拟原始筛法就可以发现,某个数字可能被不止一次地删去
//   优化后的筛法就可以避免这种不必要的删去操作 
#define Max 1000000
bool prime[Max];
void IsPrime(){prime[0]=prime[1]=0;prime[2]=1;for(int i=3;i<max;i++)prime[i]=i%2==0?0:1;int t=(int)sqrt(Max*1.0);for(int i=3;i<=t;i++)if(prime[i])for(int j=i*i;j<Max;j+=2*i)//优化 prime[j]=0;
}
View Code

 快速线性筛法 :

  上面的方法比较好理解,初始时,假设全部都是素数,当找到一个素数时,显然这个素数乘上另外一个数之后都是合数

  把这些合数都筛掉,即算法名字的由来。但仔细分析能发现,这种方法会造成重复筛除合数,影响效率。

  比如10,在i=2的时候,k=2*15筛了一次;在i=5,k=5*6 的时候又筛了一次。所以,也就有了快速线性筛法。

  利用了每个合数必有一个最小素因子。每个合数仅被它的最小素因子筛去正好一次。所以为线性时间。

void get_prime()
{int cnt = 0;for (int i = 2; i < N; i++){if (!tag[i])    p[cnt++] = i;for (int j = 0; j < cnt && p[j] * i < N; j++){tag[i*p[j]] = 1;if (i % p[j] == 0)break;}}
}
函数模板
 1 我推荐这个算法! 易于理解,只算奇数部分,时空效率都还不错!
 2 half=SIZE/2; 
 3 int sn = (int) sqrt(SIZE); 
 4 for (i = 0; i < half; i++) 
 5    p[i] = true;// 初始化全部奇数为素数。p[0]对应3,即p[i]对应2*i+3 
 6 for (i = 0; i < sn; i++) {    
 7 if(p[i])//如果 i+i+3 是素数
 8 {     
 9     for(k=i+i+3, j=k*i+k+i; j < half; j+=k) 
10     // 筛法起点是 p[i]所对应素数的平方 k^2                                        
11     // k^2在 p 中的位置是 k*i+k+i
12     //    下标 i         k*i+k+i
13     //对应数值 k=i+i+3   k^2         
14        p[j]=false; 
15 } 
16 } 
17 //素数都存放在 p 数组中,p[i]=true代表 i+i+2 是素数。
18 //举例,3是素数,按3*3,3*5,3*7...的次序筛选,因为只保存奇数,所以不用删3*4,3*6....
推荐

 


 

转载于:https://www.cnblogs.com/slp0622/p/8998445.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cors 前后端分离跨域问题_SpringBoot 实现前后端分离的跨域访问(CORS)

序言&#xff1a;跨域资源共享向来都是热门的需求&#xff0c;使用CORS可以帮助我们快速实现跨域访问&#xff0c;只需在服务端进行授权即可&#xff0c;无需在前端添加额外设置&#xff0c;比传统的JSONP跨域更安全和便捷。一、基本介绍简单来说&#xff0c;CORS是一种访问机制…

机器视觉中彩色成像必须考虑的十个问题

来源&#xff1a;Imagination Tech在为你的产品开发最适合的机器视觉系统时&#xff0c;需要考虑很多因素&#xff0c;以下列出开发过程中需要考虑的一些问题&#xff1a;颜色准确性/差异化首先要考虑的是应用程序所需的颜色精度和差异程度。在某些应用中&#xff0c;机器视觉相…

彩色的砖块

小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方…

linux 6.5桌面环境kde,CentOS 5/6 安装 GNOME 或 KDE 桌面

1、安装 XWindowyum-ygroupinstallXWindowSystem2.1、Centos 5.x 安装 GNOME 或 KDE (可择一安装)GNOMEyum-ygroupinstallGNOMEDesktopEnvironmentKDEyum-ygroupinstallKDE(KDesktopEnvironment)2.2、Centos 6.x 安装 GNOME 或 KDE (可择一安装)GNOMEyum-ygroupinstallDesktopK…

Zabbix的简单使用

0. 卸载mariadb 安装mysql 方法 rpm -qa |grep mariadb 然后 rpm -e --nodeps mariadb***** 安装mysql # 下载mysql源安装包 shell> wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm # 安装mysql源 shell> yum localinstall mysql57-communi…

嫦娥“挖土”归来有多难?看看中国首颗返回式卫星的故事

本文转载自“科技日报&#xff08;kjrbwx&#xff09;”&#xff0c;原标题《嫦娥“挖土”归来有多难&#xff1f;看看中国首颗返回式卫星的故事》&#xff0c;作者 | 吕炳宏 付毅飞2020年11月30日&#xff0c;嫦娥五号探测器在环月轨道上&#xff0c;成功实施着陆器上升器组合…

springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题

背景&#xff1a; 今天有一个需求需要拦截除登录相关请求以外的所有请求&#xff0c;并查看request 中是否包含指定的信息&#xff0c;而自然就想到了使用拦截器就可以轻松实现编写拦截器&#xff0c;获取请求头信息中的test&#xff0c;并打印出来Componentpublic class Autho…

等差数列

[编程题] 等差数列时间限制&#xff1a;1秒空间限制&#xff1a;32768K如果一个数列S满足对于所有的合法的i,都有S[i 1] S[i] d, 这里的d也可以是负数和零,我们就称数列S为等差数列。小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两…

179.【2023年华为OD机试真题(C卷)】最大坐标值(模拟实现JavaPythonC++JS)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 179.【2023年华为OD机试真题(C卷)】最大坐标值(模拟…

2018 UESTC Training for Data Structures

Link A - 一棵简单的线段树 标准线段树 #include<bits/stdc.h> #define ll long long using namespace std;const int maxn 1e67;int n,q; struct node {int l,r,maxx,minx;ll num;ll sum; }t[maxn*4];void build(int x,int l,int r) {t[x].ll,t[x].rr;if(lr){t[x].numt…

linux下的驱动大小,(转)Linux驱动开发需要注意的点/KO大小/内存管理

1.不要想不通就写代码&#xff0c;不要为了存粹的解决问题而加代码&#xff0c;不要忽视任何一种场景可能&#xff0c;因为躲得了一时&#xff0c;躲不了一波&#xff0c;BUG迟早会被挖出来的&#xff0c;到时候更加苦逼。2.内存是个很严肃的问题&#xff0c;不要直接调用系统函…

重磅,2020年度第十届吴文俊人工智能科学技术奖获奖名单公示

来源&#xff1a;科奖圈根据《吴文俊人工智能科学技术奖励条例》和《吴文俊人工智能科学技术奖励实施细则》相关规定&#xff0c;经全国各地方人工智能学会、协会及联盟&#xff0c;各高校及科研&#xff08;院&#xff09;所&#xff0c;学会各专业委员会及工作委会&#xff0…

python封装exe 时间time问题_python模块之datetime

datetime模块简介在开发工作中&#xff0c;我们经常需要用到日期与时间&#xff0c;如&#xff1a;作为日志信息的内容输出计算某个功能的执行时间用日期命名一个日志文件的名称记录或展示某文章的发布或修改时间其他Python中提供了多个用于对日期和时间进行操作的内置模块&…

交错01串

[编程题] 交错01串时间限制&#xff1a;1秒空间限制&#xff1a;32768K如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。小易现在有一个01串s,小易想找出一个最长的连续…

理解 %IOWAIT (%WIO)

%iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标&#xff0c;在Linux上显示为 %iowait&#xff0c;在有的Unix版本上显示为 %wio&#xff0c;含义都是一样的。这个指标常常被误读&#xff0c;很多人把它当作I/O问题的征兆&#xff0c;我自己每隔一段时间就会遇到对…

linux系统安装显卡驱动卡顿,关于Ubuntu16.04上N卡驱动导致滚动屏幕卡顿问题

环境Ubuntu16.041080ti显卡问题屏幕显示正常&#xff0c;但是在打开网页或者进行跑深度学习程序的时候画面会发生一卡一下的情况&#xff0c;严重时出现类似于死机的情况。查看系统monitor并不显示显存和内存爆表&#xff0c;于是推断为nvidia显卡驱动不兼容的问题。解决更换显…

自由意志不存在?神经科学能证明不?

来源&#xff1a; 神经现实本文经授权摘自《认知科学对当代哲学的挑战》作者&#xff1a;李恒威神经科学能说明自由意志不存在吗?里贝特是人类意识和自由意志的实验研究领域的先驱性神经科学家&#xff0c;但驱使他开展意识的实证研究的根本动因是回应意识科学研究中的本体论问…

操作序列

[编程题] 操作序列时间限制&#xff1a;2秒空间限制&#xff1a;32768K小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:1、将a_i放入b序列的末尾2、逆置b序列小易需要你计算输出操作n次之后的b序列。 输入描述:输入包括两行,第一行包括一个…

南方cass怎么添加指北针_添加比例尺 指北针

添加图例、比例尺、指北针代码中有注释&#xff0c;直接上指北针C#代码publicvoidAddNorthArrow(IPageLayout pageLayout){IGraphicsContainer container pageLayoutasIGraphicsContainer;IActiveView activeView pageLayoutasIActiveView;//获得MapFrameIFrameE…

MySQL数据库order by 奇慢无比

今天遇到个奇葩的问题&#xff0c; sql 数据量很大 有where 和order by&#xff0c;不加order by 速度很快&#xff0c;加了就很慢 一、首先我们对这条sql执行查询计划&#xff1a; explain select t.order_id from book_order t ORDER BY t.order_id desc explain select t.…