质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。合数是由若干个质数相乘而得到的。所以,质数是合数的基础,没有质数就没有合数。

【1】一般方法

素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜。像著名的

哥德巴赫猜想、孪生素数猜想,几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。

自从有了计算机之后,人们借助于计算机的威力,已经找到了2216091以内的所有素数。

求素数的方法有很多种,最简单的方法是根据素数的定义来求。对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。

但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其中有许多地方都值得改进。

第一,对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不

必再用其他的数去除。

第二,对于N来说,只需用小于N的素数去除就可以了。例如,如果N能被15整除,实际

上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。

第三,对于N来说,不必用从2到N一1的所有素数去除,只需用小于等于√N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明:

如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。

如果d1和d2均大于√N,则有:N=d1×d2>√N×√N=N。

而这是不可能的,所以,d1和d2中必有一个小于或等于√N。

基于上述分析,设计算法如下:

(1)用2,3,5,7逐个试除N的方法求出100以内的所有素数。

(2)用100以内的所有素数逐个试除的方法求出10000以内的素数。

首先,将2,3,5,7分别存放在a[1]、a[2]、a[3]、a[4]中,以后每求出一个素数,只要不大于100,就依次存放在A数组中的一个单元

中。当我们求100—10000之间的素数时,可依次用a[1]-a[2]的素数去试除N,这个范围内的素数可以不保存,直接打印。

【2】我们这里主要是讲解厄拉多塞筛法:

简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数

是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于

N的素数。

这很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。由于这种方法是厄拉多塞首先发明的,所以,后人就把这种方法称作厄拉多塞筛法。

在计算机中,筛法可以用给数组单元置零的方法来实现。具体来说就是:首先开一个数组:a[i],i=1,2,3,…,同时,令所有的数组元素都等于下标

值,即a[i]=i,当i不是素数时,令a[i]=0

。当输出结果时,只要判断a[i]是否等于零即可,如果a[i]=0,则令i=i+1,检查下一个a[i]。

筛法是计算机程序设计中常用的算法之一。

C++代码参考(求小于2000的素数):

#include "stdafx.h"

#include

usingnamespacestd;

#define N 2000

int_tmain(intargc, _TCHAR* argv[])

{

intnum[N];

for(inti = 0; i

{

num[i] = i;

}

for(intj = 2; j

{

if(0 != num[j])

{

for(intk = 2; k*j

{

num[k*j] = 0;

}

}

}

for(intn = 0; n

{

if(0 != num[n])

{

cout<

}

}

cout<

return0;

}

【3】用6N±1法求素数。

任何一个自然数,总可以表示成为如下的形式之一:

6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)

显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。

根据上述分析,我们可以构造另一面筛子,只对形如6

N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。

与质数有关的猜想

哥德巴赫猜想

哥德巴赫猜想(Goldbach

Conjecture)大致可以分为两个猜想(前者称“强”或“二重哥德巴赫猜想”后者称“弱”或“三重哥德巴赫猜想”):1、每个不小于6的偶数都可以表示为两个奇素数之和;2、每个不小于9的奇数都可以表示为三个奇质数之和。

黎曼猜想

黎曼猜想是一个困扰数学界多年的难题,最早由德国数学家波恩哈德·黎曼提出,迄今为止仍未有人给出一个令人完全信服的合理证明。即如何证明“关于质数的方程的所有意义的解都在一条直线上”。

此条质数之规律内的质数月经过整形,“关于质数的方程的所有意义的解都在一条直线上”化为球体质数分布。

孪生质数猜想

1849年,波林那克提出孪生质数猜想(the conjecture of twin

primes),即猜测存在无穷多对孪生质数。

猜想中的“孪生质数”是指一对质数,它们之间相差2。例如3和5,5和7,11和13,10016957和10016959等等都是孪生质数。

10016957和10016959是发生在第333899位序号质数月的中旬[18±1]的孪生质数。

质数月定位孪生质数发生位置:

首个质数月孪生质数发生位置:[T-1]*30+【[4±1] [6±1] [12±1] [18±1] [30±1] 】

T=1

其余质数月孪生质数发生位置:[T-1]*30+【[0±1] [12±1] [18±1] [30±1] 】

T=N是自然数代表质数月

厄拉多塞筛法求素数 c语言,求质数(Prime Number 素数)的方法——厄拉多塞筛法...相关推荐

  1. c语言编程矩阵主对角线相同,急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和...

    急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和 來源:互聯網  2010-02-24 23:29:06  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...

  2. 求质数(Prime Number 素数)的方法——厄拉多塞筛法

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数.比1大但不是素数的数称为合数.1和0既非素数也非合数.合数 ...

  3. c语言程序找出500以内的所有素数,c语言求出给定范围内的所有质数

    程序功能: 输入一个整数,要求打印出这个整数以内的所有质数. 程序示例: #include #include #include bool IsPrime(int x) { bool bResult = ...

  4. c语言求素数_C语言 | 求100~200的素数

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  5. 用C语言求三位数的回文素数,C语言求回文素数

    问题描述 所谓回文素数指的是,对一个整数n从左向右和从右向左读其数值都相同且n为素数,则称整数为回文素数. 对于偶数位的整数,除了11以外,都不存在回文素数.即所有的4位整数.6位整数. 8位整数-都 ...

  6. java梅森素数,C语言求梅森素数代码及解析

    问题描述 梅森数(Mersenne Prime)指的是形如2n-1的正整数,其中指数n是素数,即为Mn.如果一个梅森数是素数,则称其为梅森素数.例如22-1=3.23-1=7都是梅森素数. 当n=2, ...

  7. c语言编程输出指定范围的素数,C语言输出范围内所有素数

    用C语言输出100之间的所有质数 用C语言输出100之间的所有质数. 各位. 首先新建一个空白的c语言文件,引入头文件,头文件中包括math库,稍后会用到,建立主函数: 主函数上面新建一个判断素数的函 ...

  8. c语言判断2 1000素数,2是不是素数(C语言判断一个数为素数)

    我听说西方不承认2是质数,而中国承认 到底是不是真的 2是质数.质数又称素数.一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数:否则称为合数.2是一个大于1的自然数,这一点满足质数 ...

  9. 在c语言中用冒泡法比较大小,c语言大小排序,用冒泡法和选择排序法

    满意答案 先上选择法和冒泡法: 1.选择法 #include void main() { int i,j,min,temp; int a[10]; printf("请输入十个整数:" ...

  10. c语言用数组存放100以内素数,c语言求素数(c语言输出100以内素数)

    #include void main() { int a,b,c,d,sum; scanf("%d",&a); sum=0; for(d=3;d { b=. #include#include ...

最新文章

  1. 关于DEDECMS自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案...
  2. c语言合法的数据类型关键字有哪些,C语言提供的合法的数据类型关键字是_________....
  3. 及时输出_如何降低开关电源输出纹波和噪声
  4. CentOS学习笔记 - 7. jekins安装
  5. 深入浅出python机器学习_9.1.5_通过数据预处理提高模型的准确率_MinMaxScaler
  6. linux iptables原理详解及使用说明
  7. 《Jersey用户指南》翻译邀请
  8. EFI BIOS下的磁盘管理工具Diskpart,Efifmt与Efichk(转)
  9. iOS活动倒计时的两种实现方式
  10. 后台创建窗体下拉列表
  11. flutter屏幕适配
  12. ork+realsense 尝试
  13. 提取pdb氨基酸序列
  14. linux下canopen协议视频,CAN协议与CANOpen协议
  15. 查看IP和MAC地址的命令
  16. Linux开放MySql 3306端口
  17. Debian 11(bullseye) 安装Nextcloud,使用PostgreSQL
  18. 7.5ElGamal算法
  19. 文件格式化输入和输出
  20. 敏俊物联MJIOT-AMB-02 RTL8195M 高性能wifi模块

热门文章

  1. arcgis js平滑线工具_Arcgis中文字体、平滑线插件使用说明
  2. linux部署rabbit mq,Linux安装rabbitmq遇到的问题
  3. linux cat 文件合并,linux cat两个文件是肿么合并的
  4. 美国慈善机构Kars4Kids意外泄露了上万名捐赠者的个人信息
  5. CentOS7上实现Squid缓存服务器的两种模式
  6. Paper Read: Robust Deep Multi-modal Learning Based on Gated Information Fusion Network
  7. Oracle的卸载过程步骤
  8. (转)Android开发书籍推荐:从入门到精通系列学习路线书籍介绍
  9. 定位到文件目录并选定文件
  10. wordpress提高访问速度