【发布时间】:2012-03-11 08:48:07
【问题描述】:
我需要找到一个大数的最大素因数:最多 12 位 (xxx,xxx,xxx,xxx)。我已经解决了这个问题,代码适用于小数字(最多 6 个位置);但是,代码运行速度不够快,不会在我的服务器上触发超过 1000 亿的超时。
我找到了解决办法,谢谢大家。
代码:
<?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。
【问题讨论】:
-
如果你需要 greatest - 你可能从
$sqrti遍历到 2,而不是相反 -
确定
for($i=$sqrti; $i>=2; $i--) { -
这看起来像欧拉项目,精神是不找解决方案,直到你自己解决。或者至少让人们知道它来自 PE。
-
@zerkms 您不需要遍历数十亿个项目。对于我的回答中的建议,OP 的最坏情况是
number_of_divisors * sqrt(n),这是几百万步。如果你做对了并得到了质因数分解,那是 O(sqrt(n)) 最坏的情况。将素数筛选到平方根并仅使用这些素数比简单的试除法需要更多时间(更不用说空间了)。 -
次要优化细节:在
if ((is_prime($factor)) && (is_factor($number, $factor))) {行中交换is_prime()和is_factor()(先做便宜的调用,希望避免昂贵的调用)
标签: php performance algorithm