计算Project Euler的素因子

时间:2012-02-21 01:18:03

标签: php performance algorithm

我需要找到大数的最大素数因素:最多12个位置(xxx,xxx,xxx,xxx)。我已经解决了这个问题,代码适用于小数字(最多6个地方);但是,代码运行速度不够快,不能在我的服务器上触发100亿次的超时。

我找到了一个解决方案,感谢所有人。

代码:

<?php   
    set_time_limit(300);

    function is_prime($number) {
        $sqrtn = intval(sqrt($number));
        //won't work for 0-2
            for($i=3; $i<=$sqrtn; $i+=2) {
                if($number%$i == 0) {
                    return false;
                }
            }
        return true;
    }   

    $initial = 600851475143;
    $prime_factors = array();

    for($i=3; $i<=9999; $i++) {
        $remainder = fmod($initial, $i);
        if($remainder == 0) {
            if(is_prime($i)) {
                $prime_factors[] = $i;
            }
        }
    }

    //print_r($prime_factors);
    echo "\n\n";
    echo "<b>Answer: </b>". max($prime_factors);    
?>

本例中的测试编号为600851475143。

2 个答案:

答案 0 :(得分:2)

您的代码将找不到大于sqrt(n)的任何素数因子。要纠正这个问题,您还必须针对找到的每个因素(不仅是素数因子)测试商$number / $i

您的is_factor功能

function is_factor($number, $factor) {
    $half = $number/2;
    for($y=1; $y<=$half; $y++) {
            if(fmod($number, $factor) == 0) {
            return true;
        }
    }
}

没有意义。什么是$y和循环?如果$factor不是$number的除数,那将执行$number/2完全无意义的除法。修复后,is_prime_factor中的测试重新排序将提供良好的加速,因为只需对$number的几个除数执行昂贵的素性测试。

答案 1 :(得分:1)

这是一个非常简单快速的解决方案。

LPF(n)
{
    for (i = 2; i <= sqrt(n); i++)
    {
        while (n > i && n % i == 0) n /= i;
    }

    return n;
}