使用mercende素数生成器得到错误的答案

时间:2016-08-16 19:34:00

标签: javascript primes

一切!最近,我一直试图使用lucas lehmer测试方法构建一个mercende素数生成器/生成器。代码适用于前4个数字,然后其余部分则失败。有什么建议?谢谢!

var totalPrimes = Math.floor(prompt("What would you like the upper limit of 
                                     our search for primes to be?"));
for (var i = 2; i < totalPrimes; i++) {
    var lucasNum = 4;
    var curNumber = (Math.pow(2, (i+1))-1);
    for (var x = 0; i-1 > x; x++) {
        if (lucasNum / curNumber > 1) {
            lucasNum = (Math.pow(lucasNum, 2)-2);
        } else {
            lucasNum = (Math.pow(lucasNum, 2)-2);
        }
    }
    if (lucasNum % curNumber === 0) {
        console.log("The number " + curNumber + " is prime");
    } else {
        console.log("The number " + curNumber + " is not prime");
    }
}

1 个答案:

答案 0 :(得分:0)

Javascript编号的尾数(或有效数字)为53位宽。因此,可以以完全精度存储的最大整数是:

2^53 - 1 = 9007199254740991 = Number.MAX_SAFE_INTEGER

(您可能需要阅读this page了解更多详情。)

您的算法可能会很快达到此限制。精度爆炸发生在这个声明中:

lucasNum = (Math.pow(lucasNum, 2)-2);

包含在循环中。