质数又称素数。指在一个大于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 <iostream>using namespace std;#define N  2000int _tmain(int argc, _TCHAR* argv[])
{int num[N];for (int i = 0; i < N; i++){num[i] = i;}for (int j = 2; j < N; j++){if(0 != num[j]){for (int k = 2; k*j < N; k++){num[k*j] = 0;}}}for (int n = 0; n < N; n++){if(0 != num[n]){cout<<" "<<num[n];}}cout<<endl;return 0;
}

【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是自然数代表质数月

多地转载,无法考究源地址,还请见谅。

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

  1. 素数(质数)prime number相关知识

    1.判断一个数是否为素数 int prime(int x) {if(x==1) return 0;//不是素数for(int i=2;i*i<=x;i++) //i*i<=n,用math. ...

  2. 利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句...

    之前在某次interview中被老外问到如何用SQL找出列上的质数和完全数的问题:我当时已经多年没有写过这种考算法和SQL技巧(纯粹的技巧)的语句了,乍遇此问题倒是有些棘手.现在录以记之,供人参考. ...

  3. FZU 1649 Prime number or not (大素数测试)

    题目链接 Problem 1649 Prime number or not Accept: 661    Submit: 3016 Time Limit: 2000 mSec    Memory Li ...

  4. Ruby中求50之内的素数方法

    ruby求50之内的素数的方法,感觉对比PHP和SHELL方法是最简单的,但SHELL中可以利用factor命令,而PHP中没有求素数的对应函数的,需要自己设计算法,三种方式大家对比学习下,应该还有更 ...

  5. 判断素数的方法(孪生素数)

    素数:(质数prime number)定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,素数有无穷多个. 先来一张 2-200素数分布表 传统判断素数方法 1.开根号法 从2到√n整除判断 ...

  6. c语言 快速筛质数,快速筛素数(埃式筛+线性筛+Miller_Rabin算法)

    在CF上做到一道核心是需要筛出1~n所有素数的题目,然后刚好又没学过,就学习了快速筛素数的办法,基础的n根号n的算法这里大家每个人都知道吧QAQ,就不讲了,好像还是C语言上机说过的题目. 首先给大家介 ...

  7. python求质数和_python 求质数

    什么是质数:质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).--via维基百科简单来说就是,只 ...

  8. 求质数算法的N种境界

    求质数算法的N种境界 (N > 10) 分类: 性能优化2011-12-01 22:21 13710人阅读 评论(40) 收藏 举报 算法存储语言工作byte优化 目录(?)[+] ★引子 前天 ...

  9. 求质数算法的N种境界 (N 10) zz

    ★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?>一文,以"求质数"作为例子,介绍了一些考察应聘者的经验.由于本文没有政治敏感内容,顺便就转贴到俺在CSD ...

最新文章

  1. SpringCloud 2020版本教程4:使用spring cloud sleuth+zipkin实现链路追踪
  2. Unix/Linux中Cron的用法
  3. C语言函数指针的MFC版本Demo
  4. python怎么由列表生成m*n的矩阵_Python进阶系列:Python遍历的秘密
  5. Django里自定义用户登陆及登陆后跳转到登陆前页面的实现
  6. 依赖注入通俗解释_我如何向团队解释依赖注入
  7. ubuntu 下安装mplayer
  8. CreateDirectory和SHCreateDirectoryExW区别
  9. docker 删除包含关键字的镜像_Docker 架构及工作原理
  10. 信息论与编码曹雪虹第三版学习第二章总结
  11. 统计用区划代码和城乡划分代码编制规则
  12. 如何解决数据流转「不可能三角」难题?
  13. C#开发 虚拟翻书软件
  14. 怎么绘制对数函数图象
  15. Windows常用快捷键总结【日常总结】
  16. 【LabVIEW懒人系列教程-小白入门】1.16LabVIEW程序结构之小试身手
  17. 新生儿黄疸警惕蚕豆病
  18. i.php,iPHP简介_开始使用_iPHP框架文档iCMS_给我一套程序,我能搅动互联网
  19. chromium OS编译过程
  20. java 循环依赖_浅谈Spring解决循环依赖的三种方式

热门文章

  1. burp抓包mumu模拟器
  2. 条码旋转后打印不清楚
  3. 谈谈Linux中Redis的薪火相传与反客为主及如何实现
  4. “三天打鱼两天晒网问题
  5. Python吴恩达深度学习作业24 -- 语音识别关键字
  6. vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建
  7. MSF外网渗透+shellcode免杀
  8. .考试倒计时44天!来提分啦!
  9. 牛客网 A-吐泡泡 栈的模拟
  10. latex 参考文献显示问号_如何自学latex软件