实施Lucas-Lehmer素性测试的问题

时间:2017-04-23 14:47:38

标签: javascript algorithm primes

我尝试对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位数的素数时,程序只是偶然发现并且没有给出答案。

请帮帮我。我的算法实现有什么问题或我的程序本身有什么问题?

1 个答案:

答案 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 - 1which exceeds the bounds of javascript's integers