Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能帮我优化一下吗;请求素数“;PHP函数_Php_Performance_Function_Optimization - Fatal编程技术网

有人能帮我优化一下吗;请求素数“;PHP函数

有人能帮我优化一下吗;请求素数“;PHP函数,php,performance,function,optimization,Php,Performance,Function,Optimization,我很难优化这个PHP函数的性能,witch应该返回请求的第一个$n个素数。请求是通过表单发出的,当我请求前10000个素数时,执行时间超过了30秒。时间限制并返回致命错误。如果您能给我一些建议,告诉我如何使功能更好,我将非常感激 function fprimes($n){ //The Primes Array $history = array(2,3); //number to be tested $item = 4; //Set indicator fo

我很难优化这个PHP函数的性能,witch应该返回请求的第一个$n个素数。请求是通过表单发出的,当我请求前10000个素数时,执行时间超过了30秒。时间限制并返回致命错误。如果您能给我一些建议,告诉我如何使功能更好,我将非常感激

function fprimes($n){
    //The Primes Array
    $history = array(2,3);
    //number to be tested
    $item = 4;
    //Set indicator for primacy
    $build = 1;
    if($n == 0){
        echo "No primes requested!";
    }
    elseif($n == 1){
        echo "The first prime number is: ".$n;
    }
    elseif($n == 2){
        echo "The first ".$n." prime numbers are: </br> 1 </br> 2";
    }
    elseif($n > 2){
        while((count($history)+1)<$n){
            foreach($history as $prime){
                if($item%$prime!=0){
                    $build++;
                }
            }
            if((count($history)+1)==$build){
                $history[]=$item;
            }
            $build = 1;
            $item++;
        }
        echo "The first prime ".$n." numbers are: </br>1";
        foreach($history as $printPrime){
            echo "</br>".$printPrime;
        }
    }
}
函数fprimes($n){
//素数数组
$history=数组(2,3);
//待测数量
$item=4;
//设置首要指标
$build=1;
如果($n==0){
回声“不需要素数!”;
}
elseif($n==1){
echo“第一个素数是:”.$n;
}
elseif($n==2){
回显“第一个”$n。“素数是:
1
2”; } elseif($n>2){
而((count($history)+1)我看到的一个超级简单的优化就是你可以做到:

$item += 2;
因为偶数永远不是素数(除了2)



一个与素数无关的优化是跟踪找到的素数的数量,而不是重新计算
count($history)
每次。

count
不应该比读取变量慢,它只是数组中的一个头字段,实际上不必线性计数。另一个优化是在大于
sqrt($item)
时停止检查历史记录。有时明显的事情最难看到:)谢谢:)如果($item%$prime!=0){$build++;}否则{break;},您还可以在
$item%prime==0时添加
中断
if($item%$prime!=0){$build++;}
-如果它分开,肯定不会是素数。是的,我很确定,
foreach
是不好的,因为你只需要找到一个反例。我假设代码是这样做的,但我猜它不是。这也解释了为什么
+=2
对性能有巨大影响。离题:1不是素数。我
m sor是的,但这正是我被教导的方式:)每当出现质数是否为1的问题时,老师们就会陷入宗教辩论中:)