js判断一个数是否是素数/质数

简介: 我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?

我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?

首先,我们来看下关于“素数”的定义,在抛开程序范畴的情况下,如何定义一个数值是素数?

质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

关于素数的个数是无限的,可以通过反证法来证明,如下:

质数的个数是无穷的。欧几里得的《几何原本》中有一个经典的证明。它使用了证明常用的方法:反证法。具体证明如下:假设质数只有有限的n个,从小到大依次排列为p1,p2,……,pn,设N=p1×p2×……×pn,那么,  是素数或者不是素数。
如果  为素数,则  要大于p1,p2,……,pn,所以它不在那些假设的素数集合中。
1、如果 为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。
2、其他数学家给出了一些不同的证明。欧拉利用黎曼函数证明了全部素数的倒数之和是发散的,恩斯特·库默的证明更为简洁,哈里·弗斯滕伯格则用拓扑学加以证明。

当我们了解了一个素数的定义后,我们就可以通过程序来计算或判断是否是素数。

实现1

我们可以通过轮询来判断该数值是否可以被其他数值进行整除,那么实现如下:

function isPrime(n){
  //1.首先明白,n是大于1的自然数;2.如果n为2,那么n为素数。
  if(n === 2 ){return true;}
  for(let i=2;i<n;i++){
    if(n % i === 0){
      return false;
    }
  }
  return true;
}

如上所示,我们根据这个函数进行一个测试,获得第N个素数,看下会使用多久的时间计算出来。

//获得第几个素数
function getPrime(n){
  var arr = [];
  var start = 2;
  while(arr.length < n){
    if(isPrime(start)){
      arr.push(start);
    }
    start ++ ;
  }
  return arr[arr.length -1];
}

当我们数量达到50000的时候,会发现时间明显的非常长了,大约耗费了70s时间,很明显还会有优化的空间。

image.png

实现2

我们继续了解素数的定义,会发现所有的偶数都不会是素数,素数只能是奇数。而且,我们的循环也可以抛开偶数进行循环,那么次数又会减少不少,如下:

function isPrime(n){
  if(n === 2){
    return true;
  }else if(n % 2 === 0 ){
    return false;
  }
  var r = Math.sqrt(n);
  for(let i=3;i<=r;i+=2){
    if(n % i === 0){
      return false;
    }
  }
  return true;
}

当我们使用以上实现来获得的时候,会发现,消耗时间减少数倍,当然,结果肯定是相同的。

image.png

之后测试到百万级别的时候发现已经消耗时间较长了,达到8s,当然,仍然比第一个方法更少的消耗时间,当到千万级别的时候,就开始明显的提升了。

image.png

相关文章
|
JavaScript
盘点JS判断空对象的几大方法
在盘点JS判空方法之前我们先来了解下面的三个方法。
199 2
盘点JS判断空对象的几大方法
|
JavaScript
js基础笔记学习62-修改质数练习2
js基础笔记学习62-修改质数练习2
60 0
js基础笔记学习62-修改质数练习2
|
JavaScript
js基础笔记学习61-修改质数练习1
js基础笔记学习61-修改质数练习1
60 0
js基础笔记学习61-修改质数练习1
|
JavaScript
js基础笔记学习64-修改质数练习4优化
js基础笔记学习64-修改质数练习4优化
71 0
js基础笔记学习64-修改质数练习4优化
|
JavaScript
js基础笔记学习55-练习3判断是否是质数2
js基础笔记学习55-练习3判断是否是质数2
68 0
js基础笔记学习55-练习3判断是否是质数2
|
JavaScript
js基础笔记学习54-练习3判断是否是质数1
js基础笔记学习54-练习3判断是否是质数1
51 0
js基础笔记学习54-练习3判断是否是质数1
|
JavaScript
js基础笔记学习63-修改质数练习3
js基础笔记学习63-修改质数练习3
59 0
js基础笔记学习63-修改质数练习3
|
JavaScript 前端开发
JavaScript判断各种资源是否加载完成的方法汇总,资源预加载问题
JavaScript判断各种资源是否加载完成的方法汇总,资源预加载问题
1020 0
|
算法 JavaScript 前端开发
判断链表中是否又环使用JavaScript解决算法问题
判断链表中是否又环使用JavaScript解决算法问题
153 0
判断链表中是否又环使用JavaScript解决算法问题
|
JavaScript
js条件逻辑判断-德摩根定律
在实际应用中经常会遇到js的大量逻辑判断,各种复杂的逻辑判断
142 0
js条件逻辑判断-德摩根定律