一、素数的定义:
对于素数的定义,维基百科上给出如下一段话:素数指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数。比1大但不是素数的数称为合数。
二、利用计算机程序,很容易就可以得到不太大的素数。以c语言为工具来描述常见的判断素数的函数:
int isPrime(int n)
{
int i, a=sqrt(n);
for(i=2; i<=a; i++)
if(!(n%i))
return 0;
return 1;
}
这个函数并不是很完善,没有对参数检测。引入变量a使时间复杂度略减。这个函数不利于大量产生素数,下面介绍一种生成素数的算法,大名鼎鼎的:筛选法求素数。
三、筛选法求素数的完整的c语言程序:
#include <stdio.h>
#define N 100
int main(void)
{
int a[N+1], i, j;
for(i=2; i<=N; i++)
a[i]=1;
for(i=2; i<=N; i++)
{
if(!a[i]) continue;
printf("%-5d", i);
for(j=i; j<=N; j+=i)
a[j]=0;
}
return 0;
}
该算法求素数的途径是改变数组的内容,利用数组的下标表示素数。这句话真不通顺,请看下面。
数组a的元素均初始化为1。第二个for循环,i的范围从2到N,是判断素数的范围。当前a[i]为0时i不是素数。当找到一个素数x时,通过嵌套的for(j=i; j<=N; j+=i)循环将范围内是x倍数的数都排除掉,即a[j]=0;
这种方法为什么可行呢?
算数基本定理证明了每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的。素数被比作自然数的“基石(Base)”。
打个比方,这就像是日常生活中常见的筛子一样,用找到的素数筛选出合数丢掉,再找一个素数来筛选,依次做下去...最后筛子里的不都是素数吗?
大家可以举例试验来帮助理解。
四、关于素数
素数在数论、密码学等学科中均占有重要的地位。
最小的素数是2,也是素数中唯一的偶数;其他素数都是奇数。质数有无限多个,所以不存在最大的质数。目前已知的最大素数是: 2^43112609 - 1,长度为12978189。
素数的分布是无规律的,目前数学家们还没有办法用一个公式来表示所有的素数。目前数学界的素数公式是指一种仅能够产生素数的公式。但对于“真正的”素数公式应有的性质,已经有了大量的了解。
更多信息,请参见:http://zh.wikipedia.org/wiki/素数