leetcode:204. 计数质数(厄拉多塞筛法)

本文介绍了求解质数的方法,包括为何厄拉多塞筛法合理与不合理之处,详细解释了厄拉多塞筛法的工作原理,并探讨了不常见的6N±1筛法。此外,还提及了数学中的哥德巴赫猜想、黎曼猜想和孪生质数猜想等未解问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    简单题,有点合理又有点不合理

    先说说为什么合理:

    求素数的方法有很多种,最简单的方法是根据素数的定义来求。对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。但是,如果用素数定义的方法来编制计算机程序,它的效率是非常低的,需要花费大量的时间复杂度。

    一般的我们知道有3条规则可以节约一点时间:第一,对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不必再用其他的数去除。第二,对于N来说,只需用小于N的素数去除就可以了。例如,如果N能被15整除,实际
上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。第三,对于N来说,不必用从2到N一1的所有素数去除,只需用小于等于√N(根号N)的所有素数去除就可以了。

再说说为什么不合理

    素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜。像著名的 哥德巴赫猜想、孪生素数猜想,几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。

    目前找到的最大质数:2的859433幂-1。

 

讲讲厄拉多塞筛法

    厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将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]。
   不难看出,这是以空间换时间了。

       //申请一个足够空间的数组,进行标记
        boolean[] nums = new boolean[n];
        for (int i = 2; i < nums.length; i++) {  //首先标记全部标记为true
            nums[i] = true;
        }

        //遍历数组,采用上述算法,标记是倍数的为false
        for(int i = 2; i*i < nums.length; i++) {
            if (nums[i]) {
                for(int j = i*i; j < nums.length; j+=i) {
                    nums[j] = false;
                }
            }
        }

      //统计出为true的,就是质数的总数
        for(boolean bool : nums) {
           res += bool ? 1 : 0;
        }
        
        return res; 

 

然后又有一个不常见的筛法

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值