Javascript 最大素因子函数运行太慢

Javascript 最大素因子函数运行太慢,javascript,function,primes,Javascript,Function,Primes,我已经写了一个函数,它可以找到某个数的最大素因子。这个函数可以工作,但问题是它太慢了。e、 g当我输入600851475143作为参数时,查找最大素因子的过程持续时间太长。如何修改它以使其工作更快? 这是我的密码: class test { static addArray(someArray, member) { for (var i = 0; i <= someArray.length; i++) { if (i == someArray.length) {

我已经写了一个函数,它可以找到某个数的最大素因子。这个函数可以工作,但问题是它太慢了。e、 g当我输入600851475143作为参数时,查找最大素因子的过程持续时间太长。如何修改它以使其工作更快? 这是我的密码:

class test {

static addArray(someArray, member) {
    for (var i = 0; i <= someArray.length; i++) {
        if (i == someArray.length) {
            someArray[i] = member;
            return someArray;
        }
    }
}
static someLength(someArray) {
    var i = 0;
    while (someArray[i] !== undefined) {
        var lastItem = i;
        i++;
    }
    return i;
}
static testPrime(i) {
    for (var k=2; k < i; k++) {
        if (i % k == 0) {
            return false;
        }       
    }
    return true;
}
}

var primeArray = [];
function largestPrime(n) {
    for (var i=2; i < n; i++) {
        //var k = n / i;
        if (n % i == 0 && test.testPrime(i) == true) {  
            test.addArray(primeArray, i);
            n == n / i;
        }
    }
    return primeArray[test.someLength(primeArray) - 1];
}

document.write(largestPrime(600851475143));
类测试{
静态addArray(someArray,member){

对于(var i=0;i好的,在我们开始之前,让我们先整理一下理论。从数学上讲,衡量一段特定代码运行所需时间的方法是用
O(n)
表示法(big-O表示法),其中
n
是输入的大小

您的测试素数函数具有所谓的
线性复杂度
,这意味着它将随着
n
的大小(在本例中,您的数字输入)变大而线性变慢

对于编号
15
,执行上下文如下所示:

15 % 2 == 0 (FALSE)
15 % 3 == 0 (TRUE)
...
15 % 14 == 0 (FALSE)
这意味着对于数字
100
,将有98(2-99)个步骤。这将随着时间而增长。让我们考虑一下您的数字:
600851475143
。程序将执行
600851475143
;循环
将触发
600851475141

现在,让我们考虑一个时钟周期。假设每个指令占用代码>1个时钟周期< /代码>,并且循环的一个哑下版本占2,数字<代码> 600851475143 /代码>将执行<代码> 1201702950286 > /代码>时间。考虑每个时钟周期占用<代码> 0 0000000 625 < /代码>秒(对于16 MHz平台,例如),仅该代码所用的时间为:

0.0000000625 * 1201702950286 = ~75,106 seconds
或大约
20小时

你知道我要说什么了

要使此程序更快地运行,最好使用a,并使用此数字(或其BigInteger变体)确认您的发现


您的方法更为线性,因为
for循环
检查素性的迭代次数随着次数的增加而增加。您可以将CPU周期时间与次数一起绘制,您会发现这是一种效率相当低的方法

我在我的大学里有离散数学,所以只要一句警告的话——当你进入越来越快的测试的乌托邦时,素性测试和它们的变体会变得非常混乱。这是一条充满数学荆棘的道路,你应该在丛林中骑行时系好安全带!)


如果您需要更多关于这方面的信息,我很乐意提供帮助!我希望这有帮助!:)

这是一个很好的代码检查问题,而不是StackOverflow问题。@Chrisharp对于相对较小的数字,它工作得更快,我已经看完了代码,我认为没有多余的大括号。最后一个属于类这是一个绝对优秀的问题答案是,正如我所知,一开始使用语法可能有点奇怪。当您进入算法时,您必须向CLRS.xD低头