素数を約200万までの数で調べたけど、そんなに大きくする必要はないかも。
<?php
// 素数か否かをチェックするのに、その都度割っていたら遅いので、あらかじめ素数をある程度記憶しておく。
// n = b のとき必ず割り切れるので、b<= 1000 ならば、n < 1000 である。
// 最大値は 999*999+1000*999+1000 までの素数となる。
$prime = array(2,3,5,7);
for($num = 9 ; $num < 999*999+999*999+999 ; $num+=2)
{
$sqrt = sqrt($num);
$flag = true;
foreach($prime as $v)
{
if($num % $v == 0)
{
$flag = false;
break;
}
if($sqrt < $v)
{
break;
}
}
if($flag)
{
@$prime[$num] = $num;
}
}
// $n = 0 の時、答えはb になるので、b は素数である必要がある。
// $n = 1 の時 1 + a + b になる。 b は 素数である。
// $n = 2 の時、4 + 2a + b となる。b= 2 であるならば、2(2+a+1)で割り切れるので、素数にはならない。
// よってbは2以外の素数である。
// b は 2以外の素数ということは奇数である。 n = 1 の時、1 + a +b となる。a が偶数ならば、1+a+b も偶数になる。よってa は奇数である。
$answer = 0;
$max = 0;
for($a = -999 ; $a <= 999 ; $a += 2)
{
for($b = 3 ; $b <= 999 ; $b += 2)
{
for($n = 0 ; $n < $b ; $n++)
{
// 素数リストに見つからなかった場合か、負の数、0、1の場合は素数ではないのでそこでループ終了。
if($n * $n + $a * $n + $b * $b < 2 or !array_key_exists($n * $n + $a * $n + $b,$prime))
{
break;
}
}
if($max < $n)
{
$answer = $a * $b;
$max = $n;
}
}
}
echo $answer;
?>