为什么计算1 /(n*log(n)-n)打破了计算机?

Agn*_*kas 8 php math sum inverse

最近我偶然发现了问题,Wolfram表示和不同,但Mathematica给出了一个数值.它说它1/(n * log(n) - n)不是可求的(或者在数学上不会收敛到正确).有趣的是,我们仍然可以尝试以数字方式计算总和,尽管它是"不可求和"的事实.Mathematica给出〜6.1作为数字答案.

好.我想,让我们尝试在该系列求和的PHP脚本中重现该数字(或类似的东西).我的代码是:

$formula = function ($n) {return 1/($n * log($n) - $n);};
$n=2;
$sum=0;

while(true) {
    $term_n = $formula($n);
    $sum += $term_n;
    if ($n++ % 100000 == 0) {
        if ($sum > 5.8)
            usleep(1000);
        echo "n=".number_format($n-1)."; sum={$sum}; error={$term_n}\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

我的算法计算了答案,直到5.866然后发生了两件事之一:

  1. 无论是Ubuntu崩溃/冻结
  2. 或Linux杀死了我的计算脚本进程

这发生在大约3400万次迭代之后.

后来我检查了CPU负载在计算更多系列术语方面的变化情况.

现在,有趣的部分:在大约2200万次迭代中,核心显示难以在它们之间切换任务: 在此输入图像描述

后来,在大约3300万次迭代中,核心达到了不可逆转的地步 - 他们拒绝工作: 在此输入图像描述

问题是 - 5.866计算机崩溃的总和有什么特别之处? - 鉴于迭代次数N非常大(仅为3400万),第N项也非常小(仅为1.7E-9),所以没有理由存在奇点.

Boa*_*ann 2

只是猜测,但听起来计算机内存不足。您的脚本没有显式分配任何内存,但也许您的 PHP 版本有错误并且以某种方式泄漏内存。

如果可用内存耗尽,这确实可能导致正在运行的操作系统崩溃,或者提示它终止脚本以保护自身。

如果系统开始大量使用交换空间来进行补偿,那么您的脚本会暂时停止,从而导致您观察到的 CPU 图表出现波动。