素数 (Prime Number) ,亦称质数,指在一个大于 1 的自然数中,除了 1 和此整数自身外,无法被其他自然数整除的数。换句话说,只有两个正因数( 1 和自己)的自然数即为素数。
比 1 大但不是素数的数称为合数。 1 和 0 既非素数也非合数。素数在数论中有着很重要的地位。
最小的素数是 2 ,也是素数中唯一的偶数(双数);其他素数都是奇数(单数)。素数有无限多个,所以不存在最大的素数。
围绕著素数存在很多数学问题、数学猜想和数学定理。著名的有孪生素数猜想和哥德巴赫猜想。
素数序列的开头是这样:
2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 , 101 , 103 , 107 , 109 , 113
已经证明的定理
l 在一个数和它的 2 倍之间必存在一个素数。
l 存在任意长度的素数等差数列。(格林和陶哲轩, 2004 年)
l 一个偶数可以写成两个数字之和,其中每一个数字都最多祇有 9 个质因子。(挪威数学家布朗, 1920 年)
l 一个偶数必定可以写成一个素数加上一个合成数。(瑞尼, 1948 年)
l 一个偶数必定可以写成一个素数加上一个由 5 个因子所组成的合成数。后来,有人简称这结果为 (1 + 5) ( 中国潘承洞, 1968 年 )
未解之谜
l 哥德巴赫猜想:是否每个大于 2 的偶数都可写成两个素数之和?
l 孪生素数猜想:孪生素数就是差为 2 的素数对,例如 11 和 13 。是否存在无穷多的孪生素数?
l 斐波那契数列内是否存在无穷多的素数?
l 是否存在无穷多的梅森素数?
l 在 n2 与 (n + 1)2 之间是否每隔 n 就有一个素数?
l 是否存在无穷个形式如 n2 + 1 的素数?
l 黎曼猜想
素数的应用
素数近来被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入素数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找素数的过程(分解质因数)过久,使即使取得信息也会无意义。
在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数最好设计成素数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。
在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的素数次数的使用也得到了证明。实验表明,素数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。
以素数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。
求 100 ~ 200 间的全部素数
实现思路
判断一个数是否是素数只要从 2 开始到该数为止除该数,如果都没有余数,则表示该数是素数。而实质上只要从 2 开始到这个数开平方为止逐个除该数即可。
1. 从 2 开始到这个数开平方的整数为止,逐个除这该数。
2. 如果有余数则表示该数不是素数。
3. 如果全部都没有余数,则表示是素数,显示该数。
实现步骤
// PrimeNumber.cs
using System;
public class PrimeNumber{
public static void Main(){
int m,k,i,n = 0;
for(m = 101; m <= 200; m = m + 2){
k = Convert.ToInt32(Math.Sqrt(m +1));
for(i = 2; i <= k; i++){
if((m % i) == 0){
break;
}
}
if(i >= k + 1){
Console.Write(m + "/t");
n = n+ 1;
}
if(m % 10 == 0)
Console.WriteLine();
}
}
}
求 1000 以内素数和
实现思路
1. 定义一个整数用于保存素数和。
2. 分别判断 1000 以内那些数是素数。
3. 如果是素数则累加。
实现步骤
// PrimeSum.cs
using System;
class PrimeSum{
public static bool Prime(int num){
for(int i = 2; i <= (int)Math.Sqrt(num); i++){
if((num % i) == 0)
return true;
}
return false;
}
public static void Main(){
int nSumPrime = 0;
for(int i = 2; i <= 1000; i++){
if(Prime(i)){
nSumPrime += i;
}
}
Console.WriteLine("1000 之内的素数和为: {0}", nSumPrime);
}
}
求一定范围的素数数目程序
实现思路
1. 获得一定范围。
2. 分别判断这个范围内的数是否是素数。
实现步骤
// PrimeNumberRange.cs
using System;
class PrimeNumber{
public static bool Prime(int num){
for(int i = 2; i <= (int)Math.Sqrt(num); i++){
if((num % i) == 0)
return true;
}
return false;
}
public static void Main(){
int number;
Console.WriteLine(" 请输入 number 的值 ");
while(true){
try{
number = Convert.ToInt32(Console.ReadLine());
break;
}catch{
Console.WriteLine(" 输入数据不正确,请重新输入 ");
}
}
int count = 0;
for(int i = 2; i <= number; i++){
if(!Prime(i)){
Console.Write("{0}/t", i);
count++;
}
}
Console.WriteLine("/n 共有 {0} 个质数 ", count);
}
}
显示前 500 个素数
实现思路
1. 定义一个统计变量统计素数的个数。
2. 判断数,如果是素数,则打印该数,并将统计变量 +1 。
3. 如果统计变量 >=500 ,则停止求素数。
实现步骤
// PrimeNumberSum500.cs
using System;
class PrimeNumber {
public static bool Prime(int num) {
for(int i = 2; i <= (int)Math.Sqrt(num); i++) {
if((num % i) == 0)
return true;
}
return false;
}
public static void Main(){
int count = 0;
for(int i = 2; i <= Int32.MaxValue; i++) {
if(!Prime(i)) {
count++;
if(count % 20 == 0) {
Console.WriteLine("{0, -5}", i);
} else {
Console.Write("{0, -5}/t", i);
}
}
if(count == 500) {
break;
}
}
Console.ReadLine();
}
}
显示前 50 个平衡素数
平衡质数: 每一个质数都是它的前一个质数和后一质数相加后的平均值。
实现思路
1. 定义一个统计数统计平衡素数的个数。
2. 从 2 开始判断整数是否是素数,如果是素数将素数添加到列表中。
3. 判断集合中的素数是否等于它前一个素数和后一个素数的平均值。如果是的话显示该素数,并将统计变量 +1 。
4. 当统计变量 >=50 时停止计算。
实现步骤
// BalancedPrime.cs
/* 显示前 50 个平衡素数 */
using System;
using System.Collections.Generic;
class PrimeNumber {
public static bool Prime(int num) {
for(int i = 2; i <= (int)Math.Sqrt(num); i++) {
if((num % i) == 0)
return true;
}
return false;
}
public static void Main() {
List<int> LPrimeNum = new List<int>();
int count = 0;
for(int i = 2; i <= Int32.MaxValue; i++) {
if(!Prime(i)) {
LPrimeNum.Add(i);
if(LPrimeNum.Count > 2) {
if(LPrimeNum[LPrimeNum.Count - 3] +
LPrimeNum[LPrimeNum.Count - 1] ==
2 * LPrimeNum[LPrimeNum.Count - 2]) {
Console.Write("{0, 5}/t",
LPrimeNum[LPrimeNum.Count - 2]);
count++;
}
}
}
if(count == 50) {
break;
}
}
}
}