どーも、みつおです。
問題
Christian Goldbachは全ての奇合成数は平方数の2倍と素数の和で表せると予想した.
9 = 7 + 2×1^2
15 = 7 + 2×2^2
21 = 3 + 2×3^2
25 = 7 + 2×3^2
27 = 19 + 2×2^2
33 = 31 + 2×1^2後に, この予想は誤りであることが分かった.
平方数の2倍と素数の和で表せない最小の奇合成数はいくつか?
出典:Problem46
解答
using System;
namespace Problem46
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Solve());
Console.ReadLine();
}
private static long Solve()
{
long ret = 0;
long i = 1;
//奇数でループ
while(true)
{
i += 2;
//奇合成数か判定(素数じゃなければ、奇合成数)
if(!IsSosu(i))
{
//奇合成数 = 素数 + 2 * x * x で表せるか判定
if (!IsHeiho(i))
{
ret = i;
break;
}
}
}
return ret;
}
private static bool IsHeiho(long no)
{
bool ret = false;
int x = 1;
long num = 0;
while(true)
{
//奇合成数 = 素数 + 2 * x * x を 移行 素数 = 奇合成数 - 2 * x * x
num = no - 2 * x * x;
//マイナスの値になれば終了
if (1 < num)
{
//素数か判定
if (IsSosu(num)) return true;
}
else break;
//項をインクリメント
x++;
}
return ret;
}
private static bool IsSosu(long no)
{
bool ret = true;
//数値が2未満(1)なら素数じゃない、2なら素数
if (no < 2) return false;
else if (no == 2) return true;
//数値が2で割り切れるなら素数じゃない
if (no % 2 == 0) return false;
//合成数xはp≦√xを満たす素因子pをもつ
double sqrtno = Math.Sqrt(no);
//奇数でループ
for (int i = 3; i <= sqrtno; i += 2)
{
//割り切れるので素数じゃない
if (no % i == 0) return false;
}
return ret;
}
}
}
出力
5777