我尝试对Mersenne数字(https://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test)实施Lucas-Lehmer检验(LLT)素性检验。它应该是多项式的,因此很快。这是我的代码:
function countPrimeNumberWithDigits(numberOfDigits)
{
if(numberOfDigits < 1)
{return "Please give a valid input!";}
var shouldBeMoreThanThis = Math.pow(10, numberOfDigits-1), n = 3, M = countMWithIndex(n);
while(M < shouldBeMoreThanThis)
{
n += 2;
M = countMWithIndex(n);
}
console.log(n);
while(true)
{
var S = 4, k = 1;
M = countMWithIndex(n);
while(k != n - 1)
{
S = (S*S - 2)%M;
k +=1;
}
if(S!=0)
{n+=2;}
else
{break;}
}
return "Prime number: " + countMWithIndex(n);
}
function countMWithIndex(n)
{return Math.pow(2, n) - 1;}
以下是尝试使用上面实现的算法: https://oobarbazanoo.github.io/findPrimeNumberWithSpecifiedQuantumOfDigits/
当我尝试小于7的数字时,一切都没问题,但是当我尝试询问至少7位数的素数时,程序只是偶然发现并且没有给出答案。
请帮帮我。我的算法实现有什么问题或我的程序本身有什么问题?
答案 0 :(得分:7)
如果我使用此更改在https://repl.it/languages/javascript上运行代码:
S = (S*S - 2 + M)%M;
然后它(看似)完成任意数量的数字。但是,结果似乎不正确:它输出的非素数比所请求的数字更多。
问题是javascript可以将模数评估为负结果。例如,-2 % 5
将为-2
。这在数学上是正确的,但大多数计算机科学算法都需要正值,因此在这种情况下3
。
在该公式中添加M
将确保结果为正,无论语言怪癖如何。
结果不正确的问题可能是因为您没有遵循此要求:
Lucas-Lehmer测试的工作原理如下。设Mp = 2 ** p - 1为测试,其中p为奇数素数的Mersenne数。
p
代码中有n
。你无处可确保n
是素数。
然后还有javascript的整数类型可能不够大。当n
大于23
时,它会开始达到极限。例如,没有具有7位数的梅森素数。接下来是10位数,即2**31 - 1
。
然而,您将无法在(纯)javascript中找到它,因为计算涉及平方2**31 - 1
,which exceeds the bounds of javascript's integers。