金曜日, 6月 13, 2025
- Advertisment -
ホームニューステックニュースゴールドバッハ予想の検算世界記録をグリッドコンピューティングで更新 #Go - Qiita

ゴールドバッハ予想の検算世界記録をグリッドコンピューティングで更新 #Go – Qiita



ゴールドバッハ予想の検算世界記録をグリッドコンピューティングで更新 #Go - Qiita

数学の未解決問題であるゴールドバッハ予想の検算世界記録を、従来の400京 (4×10^18) から新たに10兆(10^13)更新しました。
この記事では、その計算をするために開発したグリッドコンピューティングシステムである Gridbach (グリッドバッハ)について紹介します。

こちらが実際のグリッドコンピューティングシステムが稼働しているサイトです。
https://gridbach.com

ログイン不要ですぐに計算結果を確認できます。PCだけでなくスマホにも対応しています。

@jay_gridbach は神奈川県に住むフリーランスエンジニア兼コンサルタントです。現在は都内の企業にて業務委託のプリセールスエンジニアとして働く傍ら、Web開発の仕事をしたり、自分のサービス開発をしたりしています。
今回の Gridbach は私が会社員時代からあたためてきたテーマで、2025年4月にリリースすることができました。

ゴールドバッハ予想とは、プロイセンの数学者であるクリスティアン・ゴールドバッハが1742年に提唱した数学の未解決問題です。
近代の数学者たちによる多くの努力にも関わらず、約280年経った現在でも数学的に正しいことが証明されていません。
ゴールドバッハ予想の中身自体は中学生でも理解できる単純な内容です。

「すべての2よりも大きな偶数は2つの素数の和として表すことができる」
例:
4 = 2 + 2
6 = 3 + 3
8 = 3 + 5

100 = 3 + 97

10000 = 71 + 9929

1000000000001092576 = 1913 + 1000000000001090663

おそらく正しいと考えられていますが、すべての偶数で成立するかは現在も証明されていません。

ポルトガルのT. Oliveira e Silva氏が、2013年にコンピューターを使い、
4×10^18 (4,000,000,000,000,000,000)までは正しいことを確認しました。Wikipedia
これが従来の検算の世界記録です。

このたび開発したGridbachにより従来の世界記録を10兆ほど上回り、わずかですが新たに世界記録を更新できました。
今後計算に参加していただけるマシンの台数を増やしたりアルゴリズムの改良を続ければさらに100兆、1000兆、1京…と記録を伸ばせるので、最終的には500京を目標にがんばりたいと思います。
いつどなたがどうしたら公式な記録として認めてくださるのかはわかりませんが、必要であれば論文なども書こうかと考えています。もし詳しい方がいらっしゃいましたら教えてください。

Record Person Year/Date
4,000,000,000,000,000,000 T. Oliveira e Silva 2013年
4,000,000,010,000,000,000 @jay_gridbach 2025年4月
5,000,000,000,000,000,000 今後の目標 202?年
  • Gridbach(グリッドバッハ)はクラウドベースの分散計算システムで、普通のPCやスマホからでも利用できるようになっています
  • ログインや専用アプリのインストールは一切不要で、高速に動作するWASM (WebAssembly)というバイナリコードがブラウザ上のコンテンツとしてダウンロードされ、ユーザーのマシン上で計算処理を担います
  • 1単位の計算ジョブは1億の区間(偶数の個数でいうと5000万)となっており、PCなら約5-10秒、スマホなら10-20秒で終わる量の仕事です
  • 分散型計算システムといえば地球外知的生命体探査プロジェクトの SETI@home が有名ですが、SETI@homeにあやかって気軽に誰でも参加できることを目標に開発しました

こちらがシステムを構成する技術スタックです。高速な計算処理をたくさんの人にやっていただけるよう、高パフォーマンスなWASMと、高スケーラブルないわゆるJAMStackアーキテクチャの組み合わせを採用しています。

image.png

それぞれのスタックの採用と構築に至るまではここでは書ききれないほどの失敗や苦労があり、非常に勉強になったのでそれについてはまた別のポストで書きたいと思います。

機能としては、自分のマシン上での計算の実行と、全世界のGridbachユーザーによる計算結果の確認という2つだけからなるシンプルなアプリケーションです。スマホにも対応しています。
ダッシュボード上の各データの説明は実際のアプリをご覧になってください。
https://app.gridbach.com/

画面: わたしの計算

Screenshot 2025-04-06 15.56.48.png

画面: 現在の世界記録

(そうこうしている間に記録が400京と11兆まで伸びていました)
Screenshot 2025-04-06 15.59.53.png
Screenshot 2025-04-06 16.00.37.png

ゴールドバッハ予想を満たす素数ペアの小さい方の、ある区間における最大値のことを私のシステムでは「ゴールドバッハ峰(ほう)」と呼んでいます。
Olivie氏はGoldbach partitionの小さい方 p と表現されているのですが、上記のようにグラフにすると登山中に現れるピークやコルのように見えて面白いので私は「峰」と名付けました。
Olivie氏らは9781という非常に大きいゴールドバッハ峰を発見されています。
https://sweet.ua.pt/tos/goldbach.html
image.png

皆さんもたくさん計算していただき、宝探し感覚で9781を上回るゴールドバッハ峰をぜひ探し当ててください。自分が見つけたゴールドバッハ峰TOP30は「わたしの計算」画面で確認できます。

コアとなる計算処理はGoのコマンドラインツールとしてMITライセンスで公開しています。

以下、一部コードの抜粋です。素数を求めるアルゴリズムとして有名なエラトステネスのふるいを改造し、整数の配列ではなくバイト配列に対してビット演算でふるいをかけ、さらにそれを与えられた区間に関して高速に計算できるようにしています。

    //      b0  b1  b2  b3  b4  b5  b6  b7
	// [i0]  1   3   5   7   9  11  13  15
	// [i1] 17  19  21  23  25  27  29  31
	// [i2] 33  35  37  39  41  45  47  49
	// To access x,
	//  i : (x-1)/16    : x>>4
	//  b : (x%16-1)/2  : (x&15)>>1

	flags := [...]byte{
		0b00000001, 0b00000010, 0b00000100, 0b00001000,
		0b00010000, 0b00100000, 0b01000000, 0b10000000}
	masks := [...]byte{
		0b11111110, 0b11111101, 0b11111011, 0b11110111,
		0b11101111, 0b11011111, 0b10111111, 0b01111111}
	var xmax = uint32(math.Sqrt(float64(to)))
	var yz = uint32(to - from + 1)

	for x := uint32(3); x  xmax; x += 2 {
		if root[x>>4]&flags[(x&15)>>1] != 0 {
			// Yield the mm (minimum multiple) of x satisfying mm > from
			var q, r = bits.Div64(0, from, uint64(x))
			if r != 0 {
				q++
			}
			if q&1 == 0 {
				q++
			}
			var mm = uint64(x) * q
			var ya = uint32(mm - from)
			// Put off bit for every multiples
			for y := ya; y  yz; y += x  1 {
				prime[y>>4] &= masks[(y&15)>>1]
			}
		}
	}

計算アルゴリズムについても別途記事を作成する予定です。

ここまでお読みいただきありがとうございました。ぜひ5分だけで良いので gridbach.com にアクセスし、計算を体験していっていただけると嬉しいです。
これからも記録更新とシステムの改良を通し、たくさんの方に数学やITに興味を持っていただけるような活動として続けていきたいと思います。





Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -