Project Euler にチャレンジ:Problem 27 PHPでの解答

← Problem 26  Problem 28 →
素数を約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;

?>
問題文