【问题标题】:PHP code is taking very much time in executing when handling large number处理大量数字时,PHP 代码需要很长时间才能执行
【发布时间】:2013-09-04 11:03:48
【问题描述】:

这是一个查找素数的简单程序,用于在后期检查数字的除法。

我试图通过最初取数字的整数平方根来缩短它以分解复杂性。但是执行脚本仍然需要很长时间。我可以在我的代码中实现哪些其他更改以减少执行时间(我已经将最大执行时间设置为 5 分钟)

<?php
error_reporting(E_ALL);
$num = 600851475143;
//$sqrt_num = (int)sqrt($num);

for( $j = 2; $j <= $num; $j++ )
{
    for( $k = 2; $k < $j; $k++ )
    {
        if( $j % $k == 0 )
        {
        break;
        }

    }
    if( $k == $j )
    {
        //echo "Prime Number : ", $j, "<br>";
        if( $num % $j == 0 )
        {
        echo "Prime number : ", $j, "<br>";
        }
    }
}

编辑刚刚评论了 sqrt 的行,因为这似乎是正确的..但循环仍然需要很多时间。

【问题讨论】:

  • 数字可以有多大?每个人都会对这里的好代码有某种感觉,但如果它的大小有限,那么只缓存前几千个素数而不是每次都计算它们可能会更快。而且由于它们不会改变,你真的不需要第一次计算它们,所以不要缓存,而是读取“硬代码”。
  • @Nanne 你的意思是我首先将它们全部放在一个数组中,然后将除法应用于数字?请再澄清一点
  • @swapnesh 部门?不。我的意思是你把所有素数放在一个数组中。然后你有一个质数数组,你可以像在这里做的那样回显。无需进行计算。但了解您需要解决的实际问题是什么会有所帮助?
  • @Nanne 使用此代码我的浏览器挂起..但是在提供少量数字时它工作正常
  • @MarkoD 你为什么这么认为? “虽然我知道你没有回答我”

标签: php for-loop execution largenumber prime-factoring


【解决方案1】:

提高代码执行时间的一种方法是:

$num = 1000;

for($j = 2; $j <= $num; $j++)
{
    $cond = sqrt($j);
    for($k = 2; $k <= $cond; $k++)
    {
        if($j % $k == 0)
        {
        break;
        }

    }
    if($k > $cond)
    {
        echo 'Prime number: ' . $j . '<br>';
    }
}

但是没有必要每次都从头计算素数。您可以每隔 30 秒左右记住一次您所在的位置,将结果保存到数据库、文件或数组中,然后重新启动脚本,该脚本应该从停止的地方继续。

【讨论】:

  • 为了进一步缩短执行时间:在循环之前处理 2,然后在两个循环中从 3 到 2 计数。
【解决方案2】:

减少此代码执行时间的最佳方法是删除它。 每次运行时都没有必要计算每个素数——它们不会很快改变。

运行一次,将其写入文件或数据库,并在需要时使用。 我个人将它放在一个数组中以备后用。

【讨论】:

  • 我把它放在了一个数组中,但对于一个较小的数字来说,它仍然没有时间了..check codepad.org/bJUjoom6
【解决方案3】:

这是通过试除法分解的基本算法;我不懂PHP,就给个伪代码吧:

function factors(n)
    f, fs := 2, []
    while f * f <= n
        while n % f == 0
            append f to fs
            n := n / f
        f := f + 1
    if n > 1 append n to fs
    return fs

有比找到数的因数更好的方法,但即使是那种简单的方法也足以解决您试图解决的 Project Euler 问题;您应该在不到一秒钟的时间内找到解决方案。当您准备好使用质数进行更多编程时,我在我的博客中谦虚地推荐essay

【讨论】:

  • 非常感谢伪代码..它真的会帮助我理解更多的编程概念..感谢链接以及+1的知识分享:)