我需要找到大数的最大素数因素:最多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。
答案 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;
}