筛选法求素数

一、素数的定义:

    对于素数的定义,维基百科上给出如下一段话:素数指在大于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/素数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值