javascript - 检测素数不能正常工作的 JS 函数
问题描述
我正在尝试创建一个函数来确定一个数字是否在 JS 上是素数。我使用的方法是威尔逊定理,简而言之,如果(num - 1)! % num
等于num -1
,num
则为素数。为了实现这个函数,我制作了另一个函数来计算给定数字的阶乘。我还添加了一个条件运算符,false
如果给定的数字小于或等于 1,则返回,以满足素数的条件。
阶乘函数工作得很好(我检查了它的返回值),但由于某种原因,威尔逊定理函数有问题。我工作了很多素数,并确定低于 23 的函数将起作用,而高于 29(23 之后的第一个素数)函数将不起作用(包括 29)。
现在,我知道有很多更简单的方法可以实现用于此目的的函数,但我想尝试使用威尔逊定理,但我真的不明白为什么这个函数不起作用。您可以在下面看到我的代码和我为该功能所做的测试。如果您发现我的代码可能存在的任何问题,或者如果您知道我可以改进我的功能以达到更高的优化或解决我的问题的任何方法,请发表评论。提前致谢。
// 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
如果它是相关的,我正在使用 node.js,但我也在在线编译器上对其进行了测试,并没有发现任何差异。
解决方案
现代版本的 Javascript 支持任意精度整数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt),可用于精确计算大整数:
// Factorial function
let factorial = function (num) {
let outp = 1n; // the `n` suffix indicates a `BigInt` constant
for (let i = 1n; i <= num; i++) {
outp *= i;
}
return outp;
}
// Prime tester function
let isPrime = x => x <= 1n ? false : factorial(x - 1n) % x == x - 1n;
// Test function
console.log(isPrime(7n));
console.log(isPrime(23n));
console.log(isPrime(29n));
console.log(isPrime(101n));
推荐阅读
- sql - 在检查约束中与 BETWEEN 一起使用时,AND 的参数不能返回一个集合
- c - 为什么需要'-lpthread'?
- javascript - 如何通过从 ASP.NET MVC 中的数据库中检索数据来选中/取消选中复选框列表
- url - 过滤 /? url末尾的查询参数
- excel - 将使用 MS Access VBA 所做的更改保存在 Excel 电子表格中
- python - opencv 在 macOS 中抛出错误 - Mojave
- unity3d - 简单的统一移动功能不起作用
- jquery - 数据表“第 0 行第 0 列请求的未知参数‘UserNo’”。(使用 asp.net mvc 核心)
- material-ui - 我们如何将 data-testid 添加到 textField 组件的错误字段中
- php - 在 php 中显示具有不同名称和一个后缀的所有会话