JavaScript实现Emrips反质数枚举的示例代码
本文介绍如何使用JavaScript实现Emrips反质数的枚举。Emrips指倒转后仍为不同质数的质数。文章详细解析了基于6X±1形式的质数判断优化算法,通过剔除回文质数和非质数反转值,高效计算小于指定数值n的Emrips个数、最大值及总和。
Emrips反质数定义与问题描述
近期遇到一个编程挑战,其中定义了一种名为“emirps”的数:若一个质数在数字反转后得到的结果是一个与原数不同的质数,则该数被称为“emirps”。
以13和17为例,它们本身是质数,其反转数31和71也是质数,因此13和17属于“emirps”。然而,像757、787和797这样的回文质数,其反转后与原数相同,因此不被归类为“emirps”。
该编程任务要求编写一个函数,接收一个正整数n作为输入,返回小于n的“emirps”的数量、其中的最大“emirps”值,以及所有小于n的“emirps”之和。
解决此问题的基本思路是:首先枚举出所有小于n的质数,然后从中剔除回文质数,并排除那些反转后为合数的数字。
质数判断算法实现
首先需要实现一个用于判断质数的函数。
该函数的核心依据是以下三个数学结论:
任何合数都可以表示为若干个质数的乘积。
如果一个数可以进行因式分解,其两个因数中必然存在一个小于或等于该数的平方根(sqrt(n)),另一个大于或等于该数的平方根。
所有大于3的质数必然呈现为6X+1或6X-1的形式,即它们是6的倍数相邻的数。需要注意的是,并非所有符合6X+1或6X-1形式的数都是质数。
第一个结论可以通过反证法进行证明。
第三个结论的证明过程如下:
我们将任意整数表示为6X-1、6X、6X+1、6X+2、6X+3或6X+4的形式(其中X为正整数)。分析可知:6X可分解为2*3x;6X+2可分解为2(3x+1);6X+3可分解为3(2x+1);6X+4可分解为2(3x+2)。这些形式均含有除1和自身外的因数,因此肯定不是质数。由此可证,质数只能表现为6X-1或6X+1的形式。
以下是判断质数的代码实现:
function isPrimeNumber(num){
if(num == 2 || num == 3){
return true;
}/*2、3特殊处理*/
if(num % 6 != 1 && num % 6 != 5){
return false;
}/*根据结论三排除*/
for(var i=5;i<=Math.sqrt(num);i+=6){
if(num % i == 0 || num % (i+2) == 0){
return false;
}
}/*根据结论二、结论三排除*/
return true;
}
Emrips过滤与结果统计
接下来,需要剔除回文质数以及反转后为合数的数字。
相关过滤逻辑的代码如下:
function emirpNumber(num){
var reverseNumber = Number(String(num).split('').reverse().join(''))
if(reverseNumber != num && isPrimeNumber(reverseNumber)){
return true;
}
else{
return false;
}
}
最后,输出所需的统计结果。
最终结果输出的代码实现如下:
function findEmirp(n){
var emirpGroup = [];
for(var i=1;i<n;i++){
if(isPrimeNumber(i) && emirpNumber(i)){
emirpGroup.push(i);
}
}
return [
'n为:' + n,
'数量为:' + emirpGroup.length,
'最大数:' + emirpGroup[emirpGroup.length - 1],
'求和:' + emirpGroup.reduce(function(total,current){
return total + current;
})
]
}
查看程序的输出结果及运行耗时。
当n=1000000时的运行结果:

当n=10000000时的运行结果:

以上关于使用JavaScript实现Emrips反质数枚举的示例代码即为全部内容,希望能为读者提供参考与帮助。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
