Javascript JS函数用于检测未正常工作的素数

Javascript JS函数用于检测未正常工作的素数,javascript,node.js,function,primes,factorial,Javascript,Node.js,Function,Primes,Factorial,我试图创建一个函数来确定一个数字在JS上是否为素数。我使用的方法是威尔逊定理,简而言之,如果(num-1)!%num等于num-1,则num为素数。为了实现这个函数,我做了另一个函数来计算给定数字的阶乘。我还添加了一个条件运算符,如果给定的数字小于或等于1,则返回false,以满足素数的条件 阶乘函数工作得很好(我检查了它的返回值),但由于某种原因,威尔逊定理函数存在问题。我用了很多素数,确定低于23的函数可以工作,高于29(23之后的第一个素数)的函数不能工作(包括29) 现在,我知道有更简单

我试图创建一个函数来确定一个数字在JS上是否为素数。我使用的方法是威尔逊定理,简而言之,如果
(num-1)!%num
等于
num-1
,则
num
为素数。为了实现这个函数,我做了另一个函数来计算给定数字的阶乘。我还添加了一个条件运算符,如果给定的数字小于或等于1,则返回
false
,以满足素数的条件

阶乘函数工作得很好(我检查了它的返回值),但由于某种原因,威尔逊定理函数存在问题。我用了很多素数,确定低于23的函数可以工作,高于29(23之后的第一个素数)的函数不能工作(包括29)

现在,我知道有更简单的方法来实现一个函数来达到这个目的,但是我想尝试使用Wilson的theroem,我真的不明白为什么这个函数不起作用。下面您可以使用我的代码和我为函数所做的测试。如果您注意到我的代码可能存在的任何问题,或者您知道我可以改进我的函数以达到更高的优化或解决我的问题,请留下评论。提前谢谢

// Factorial function
let factorial = function(num) {
  let outp = 1;
  for (let i = 1; i <= num; i++) {
      outp *= i;
  }
  return outp;
}

// Prime tester function
let isPrime = x => x <= 1 ? false : factorial(x-1) % x == x-1;

// Test function
console.log(isPrime(7));  // Should return: true, returns: true
console.log(isPrime(23));  // Should return: true, returns: true
console.log(isPrime(29));  // Should return: true, returns: false
console.log(isPrime(101));  // Should return: true, returns: false
//阶乘函数
设阶乘=函数(num){
设outp=1;

for(设i=1;ix它不适用于29和更大的数字的原因是JavaScript精度限制。29!太大,无法存储,所以它有点四舍五入。(对于更大的数字,它甚至可以是无穷大)。您可以将数字存储为字符串或数组。但是您必须自己实现乘法。

现代版本的Javascript支持任意精度整数(),可用于精确计算大整数:

//阶乘函数
设阶乘=函数(num){
设outp=1n;//后缀'n'表示'BigInt'常量

对于(设i=1n;ix),主要问题是计算阶乘非常昂贵,并且由于数字表示的限制,无法准确计算出超出相对较低阈值的阶乘。一个简单的经典“Seive”实现将更加高效。@尖利我想这是有道理的。但是,函数返回
false
而不是
未定义的
,或者引发内部错误,这仍然让我感到困扰。无论如何,感谢您的回答,我会确保检查该实现方法。javascript数字只保留大约t小数点后17位()但是29!大约有30个数字长。你要求的是相等但精度不够…@JayBuckman是的,显然这正是问题所在。谢谢你的回答和你的参考,我一定会检查它。非常感谢!我不知道这一点,但它很有意义。如果我将它存储在一个字符串中,我会尝试的那真的很有帮助,谢谢你的回答。它实际上修复了我的代码。显然,我可以用那个数据类型计算更大的素数,但我意识到这个方法无论如何都不是那么有效。