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

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

# 最新状況補記
- 2025年5月26日に記録を400京300兆（4x10^18+3x10^14）まで更新しました。

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

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](https://en.wikipedia.org/wiki/Goldbach%27s_conjecture#Computational_results)
これが従来の検算の世界記録です。

# Gridbachによる世界記録の更新
このたび開発した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](https://ja.wikipedia.org/wiki/SETI@home) が有名ですが、SETI@homeにあやかって気軽に誰でも参加できることを目標に開発しました

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184078/52cfb305-33ec-49fb-bcfd-b80c6f3de09d.png)

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

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

https://app.gridbach.com/

#### 画面: わたしの計算
![Screenshot 2025-04-06 15.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184078/262b27c5-6883-47d5-b9ea-a2de5c863129.png)

#### 画面: 現在の世界記録
（そうこうしている間に記録が400京と11兆まで伸びていました）
![Screenshot 2025-04-06 15.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184078/58b30d59-9ab6-443f-a5df-2db63889a0e0.png)
![Screenshot 2025-04-06 16.00.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184078/bf8c8cf4-0846-4aa2-a742-915f79883c81.png)

# ゴールドバッハ峰
ゴールドバッハ予想を満たす素数ペアの小さい方の、ある区間における最大値のことを私のシステムでは「ゴールドバッハ峰（ほう）」と呼んでいます。
T. Oliveira e Silva氏はGoldbach partitionの小さい方 `p` と表現されているのですが、上記のようにグラフにすると登山中に現れるピークやコルのように見えて面白いので私は「峰」と名付けました。
Oliveira e Silva氏らは9781という非常に大きいゴールドバッハ峰を発見されています。
https://sweet.ua.pt/tos/goldbach.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184078/22e10d80-1a50-4473-952f-e2e3c9bb25ef.png)

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

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

https://github.com/nakatahr/gridbach-core

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

```Go
    //      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](https://gridbach.com) にアクセスし、計算を体験していっていただけると嬉しいです。
これからも記録更新とシステムの改良を通し、たくさんの方に数学やITに興味を持っていただけるような活動として続けていきたいと思います。