問題をどのように解決しようとしたかについてお話ししたいと思います。ゴールドバッハ問題は、4から始まる任意の偶数は、2つの素数の合計として表すことができるというステートメントです。つまり、6 = 3 + 3; 8 = 5 + 3 ...私が理解しているように、問題の解決策は、このステートメントの証明または反論です。
最初に行う必要があるのは、数値が素数であるかどうかをチェックするメソッドを実装することです。プライムは、それ自体と1つだけで割り切れる数です。
public static bool IsPrimeNumber(ulong n)
{
var result = true;
if (n > 1)
{
for (ulong i = 2; i < n; i++)
{
if (n % i == 0)
{
result = false;
break;
}
}
}
else
{
result = false;
}
return result;
}
ここで、ulong.MaxValue = 18446744073709551615(2 ^ 64-1)までのすべての素数のコレクションを取得する必要があります。
public static IEnumerable<ulong> GetAllPrimeNumbers(ulong maxNumber)
{
List<ulong> primeNumbers = new List<ulong>();
for (ulong i=0; i < maxNumber; i++ )
{
if (IsPrimeNumber(i))
{
primeNumbers.Add(i);
}
}
return primeNumbers;
}
直感的には計算に非常に時間がかかるので、30万個に減らします。
static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
IEnumerable<ulong> primeNumbers = GetAllPrimeNumbers();
checkGoldbach(primeNumbers);
stopwatch.Stop();
Console.WriteLine(" " + stopwatch.Elapsed.TotalSeconds + " ");
foreach(var number in primeNumbers)
{
Console.Write(number + " ");
}
Console.ReadKey();
}
次に、2 ^ 64までのすべての素数を見つけたいと思いました(数時間の計算で十分だ
と思いました)プログラムを2分間実行した後、ブレークポイントを設定し、簡単にするためにチェックする数値を確認することにしました
。2分間の計算後に411780回繰り返します。数字の半分を過ぎても繰り返し続ける必要がないので、数字の単純さをチェックする方法を少し最適化することにしました。
したがって、単純さをチェックするために必要な反復回数は半分になります。2分で反復回数が2倍になるはずだと私には思えました
しかし、ここでも、私は間違っていました。生産性は100%ではなく22%向上しました。後で理解するように、これは、以前のように、チェックの半分が2で除算することによって削除されるという事実によるものです。これは、2で除算することによって削除されないすべての数値の3分の1が3で除算することによって削除されるなどです。 500,154の単純性テストのうち、41549の素数が見つかりました。つまり、繰り返し
for (ulong i = 2; i <= n/2; i++)
{
if (n % i == 0)
{
result = false;
break;
}
}
最後まで(休憩なしで)41,549回だけ実行されました。それ以外の場合は、以前に中断されました...
500154そして2 ^ 64に近くない場合、すべての数値の単純さをチェックするのにかかる時間を2 ^ 64に計算する必要があります。
最初に、反復回数を2 ^ 64から30000に減らし、stopwatchメソッドの実行時間を計算して
繰り返します。 30,000までの数、1秒が費やされました
今度は反復回数の他の値でテーブルを作成し
ましょう結果をExcelで記述し、座標「時間の反復数」と「範囲ごとの素数の数」のドットグラフを作成しましょう
これで、最大の素数のおおよその数を見つけることができます2 ^ 64、およびそれらすべてを見つけるのにかかるおおよその時間
「範囲ごとのプライム数」グラフに「線形」トレンドラインを追加すると、Excelは式y = 0.074x + 3004を返します(式がどれほど正確かはわかりません)。これは、ulong.MaxValue = 0.074 * 2 ^ 64 +3004までのおおよその素数を意味します。
同様に、「多項式」トレンドラインを「経時的な反復回数」チャートに追加すると、式y = 7E-10x2 + 6E-05xが得られます。 xの代わりに2 ^ 64の番号を代入すると、2 ^ 64までのすべての素数を見つけるには、約2.38E + 29秒、つまり7553198149564240000000年が必要であることがわかります。さて、そんなに期待できません。
ゴールドバッハの推測が300,000までのすべての偶数に当てはまることを証明してみましょう。
public static void checkGoldbach(IEnumerable<ulong> primeNumbers)
{
ulong numbersCount = 300000;
for (ulong number = 4; number<numbersCount; number+=2)
{
bool isGoldbachResult = false;
foreach(ulong primeNumber1 in primeNumbers)
{
foreach(ulong primeNumber2 in primeNumbers)
{
if(primeNumber1+primeNumber2==number)
{
Console.WriteLine("{0} = {1} + {2}", number, primeNumber1, primeNumber2);
isGoldbachResult = true;
break;
}
if(primeNumber1+primeNumber2>number)
{
break;
}
}
if(isGoldbachResult|| primeNumber1>number)
{
break;
}
}
if(!isGoldbachResult)
{
Console.WriteLine(" " + number + " ");
break;
}
}
}
ゴールドバッハのステートメントが特定の番号に当てはまらない場合、メソッドはその番号で計算を停止します。
9分間の計算の後、ゴールドバッハの仮説は300,000未満の数値に対して有効であると言えます。
合計
すべてが最初に思ったほど単純ではないことが判明し、私は問題を解決するのにまったく近づいていないことを理解しています。
おそらく、簡単にするために数値をチェックするためのより良いオプションがあるように思われます。ゴールドバッハの発言の正しさを偶数でチェックする方法は、単純な素数の列挙よりも合理的に実装できる可能性がありますが、私はもはやこれにそれほど多くの時間を費やしたくありません...
ゴールドバッハの問題を解決しても人類には何の影響もありません。これまでのところ、仮説は4 * 10 ^ 18までの数値に当てはまることが証明されていますが、すべての数値についてそれを証明する意味は何ですか?数学者はどのような目的でこのトピックに関する本を書き、一般的にそのような「問題」の解決に時間を費やしていますか?
範囲ごとの素数の数を計算するための私の式に存在する権利があるかどうか、知識のある人に本当に尋ねたいですか?
PS
ほとんどの場合、私はほとんど知らない記事を書く必要はありません。コミュニティがこのように反応するとは思っていませんでした。しかし、私は自分の決定が唯一の正しい決定であるとは思いませんでした。私はこの分野のアマチュアです。
この記事を書いた目的は何ですか?
私は時間をかけてこの質問を調査しましたが、一部の人々はそれを好むかもしれないように思えました。楽しい仕事なので面白かったです。しかし、なぜ数学者はこれに時間を浪費しているのでしょうか。これらの特定の質問を調査することの本当の利点を心から理解していません。
PPS
記事に関するレビューを読んだ後、私は結論を出すことにしました。
おそらく、簡単にするために数値をチェックするためのより良いオプションがあるように思われます
ユーザーが提案したように dvserg drなぜ そして Pavel_The_Best本当にそうです。たとえば、Eratosthenesのふるいを使用すると、プライムのコレクションをはるかに高速に収集できます。このトピックについて読むことができる記事は次のとおりです。O (log N)、Wikipediaで単純さをチェックするためのアルゴリズム、Srinivas RamanujanIyengorの作品を読むことができます。
範囲ごとの素数の数を計算するための私の式には、存在する権利がありますか?
番号
ゴールドバッハの問題を解決しても人類には何ももたらされませんか?
いくつかの数学の問題は役に立たないという私の意見は、ほとんどのユーザーから急激に否定的な態度を引き起こしました。ユーザーvvadzim 冷蔵庫 bromzh グラフイン 冷蔵庫 EimKR bfDeveloper そして ええこれを私に納得させることができました。私は私の言葉を取り戻します。
古くから数学者は真実を探求してきました、そして彼らの探求はしばしば進歩のための有益な結果につながります。おそらく、問題自体とその解決策は、今ここで世界に何も与えないでしょうが、それは長期的に役立つ可能性のある解決策を探している間に引き出された結論です。