GIMPSをLinuxで実行する

# はじめに

GIMPS(Great Internet Mersenne Prime Search [ [公式サイト](https://www.mersenne.org/) ][ [Wikipedia](https://ja.wikipedia.org/wiki/GIMPS) ]) はメルセンヌ素数の発見を目的とした分散コンピューティングプロジェクトである。

備忘録的に、Linuxでの実行までの設定を記載しておく。

# 基礎知識
GIMPSでは、メルセンヌ数が素数であるかを判断するために、素因数分解アルゴリズムである

* 試し割(TF)
* P-1法(PM1)

を実行し、その時点で合成数と分かったものは、次工程に進まないようにしている。なので、メルセンヌ素数を直接的に見つける以外にも、こういった枝刈り工程で貢献することももちろん可能だ。ただし、試し割はCPUで実行するよりもGPUで実行した方が格段に速いので、今回紹介するプログラムで試し割を選ぶことは推奨されていない。

さて、これらの前処理を突破したメルセンヌ数は、本格的に素数チェックが行われる。そのための確定的アルゴリズムとしてLucas–Lehmer法(LL)が知られている。従来はLLを2回実行し、計算結果が一致することをもって完了としていた(1回目のチェックがLL、2回目のチェックがD(ダブルチェック)と呼ばれる)。

しかし、バージョン30.3から方法が変わり、2021年4月には1回目のLLは使用は収束した。これまで、LLの計算結果が正しいことを検証しようとすると、同じ計算を再度実行するしかなかったが、バージョン30.3からは、LLを実行しつつ、その計算内容が正しいことの証拠を作成するようになった。これによって、2回目のチェックは単にLLを再実行するのではなく、証拠を検証することに変わり、計算量が劇的に減った。GIMPS内では、この新しい1回目のチェックをPRP、2回目のチェックをCERTと呼んでいる。とは言え、これまでのLLではほとんど発生しなかったディスクへの書き込みや、ネットワーク通信(先ほど述べた証拠を保管し、サーバーに送信するため)が発生することに注意する。

# 手順
## アカウント登録
[他の記事](https://qiita.com/saoyagi2/items/8618033c47b560ca08ae)を参考のこと。

## ダウンロード
まず、ダウンロードするディレクトリを作って、そこに移動しておく。ここでは、`mprime` とする。

```
mkdir mprime
cd mprime
```

最新バージョンは[ここ](https://www.mersenne.org/download/)から確認できる。2022年2月6日現在は、30.7b9が最新だ。

```
wget https://www.mersenne.org/ftp_root/gimps/p95v307b9.linux64.tar.gz
```

解凍し、元ファイルを削除する。

```
tar -xf p95v307b9.linux64.tar.gz
rm p95v307b9.linux64.tar.gz
```

なお、更新する場合は、プログラムを一旦止めて( `killall mprime` )、上書きすればよい。

```
tar --overwrite -xf p95v307b9.linux64.tar.gz
```

## 基本的な設定
`./mprime` を初めて実行すると設定が始まる。基本的にデフォルトのままでいいので、エンターを連打する。

```
Join Gimps? (Y=Yes, N=Just stress testing) (Y):
Use PrimeNet to get work and report results (Y):
```

アカウント作成時のIDを入力する。匿名(ANONYMOUS)で良ければエンター。また、PCの名前を設定できる。これは複数台のPCを使う場合に、どのPCからの結果なのかをユーザが判断できるようにするためのものだ。ただし、この名前は全体にも公開される。

```
Your user ID or "ANONYMOUS" (ANONYMOUS):
Optional computer name:
```

脳死でエンター。

```
Computer uses a dial-up connection to the Internet (N):
Use a proxy server (N):
Output debug info to prime.log (0=none, 1=some, 2=too much) (0):
Accept the answers above? (Y):
Hours per day this program will run (24):
Accept the answers above? (Y):
Temporary disk space limit in GB/worker (6.000000):
Daytime P-1/P+1/ECM stage 2 memory in GB (0.300000):
Nighttime P-1/P+1/ECM stage 2 memory in GB (0.300000):
Upload bandwidth limit in Mbps (0.250000):
Upload large files time period start (00:00):
Upload large files time period end (24:00):
Download limit for certification work in MB/day (40):
Skip advanced resource settings (Y):
Accept the answers above? (Y):
```

何並列で動かすか？　個人の好みで。

```
Number of workers to run (3):
```

作業のタイプが選べる。メルセンヌ素数を見つけたければ、`150`あるいは`152`を設定すればよい。なお、初めて動かした場合は、そのCPUの信頼性をチェックする意味で、ダブルチェックのタスクが割り当てられるので、いきなりメルセンヌ素数のチェックが動かなくとも慌てない。

```
Use the following values to select a work type:
  0 - Whatever makes the most sense
 150 - First time prime tests
  152 - World record sized numbers to prime test
  151 - Double-check prime tests
  2 - Trial factoring
  4 - P-1 factoring
  153 - 100 million digit numbers to prime test
  160 - First time PRP on Mersenne cofactors
  161 - Double-check PRP on Mersenne cofactors
  5 - ECM for first factors of Mersenne numbers
  8 - ECM on Mersenne cofactors
  6 - ECM on Fermat numbers
  1 - Trial factoring to low limits

Type of work to get (0):
```

使用するコア数。お好みに応じて。

```
CPU cores to use (multithreading) (4):
```

```
Get occasional proof certification work (Y):
Accept the answers above? (Y):
```

設定が終わると自動的にタスクを取得し、計算を始める。以降の設定が必要であれば、一旦プログラムを終了する。

## 詳細な設定
設定は`prime.txt`と`local.txt`に記載する。プログラム中で設定できる項目もあるが、そうでないものもある。詳細は`readme.txt`及び`undoc.txt`を参照のこと。

### prime.txt
ベンチマークがちょくちょく自動実行される。それを止めさせる設定。

```
AutoBench=0
```

P-1とECMの実行は、ステージ1と2に分かれる。普通は、ステージ毎にgcd(因数分解できるかのチェック。最大公約数)を求めるが、どうせステージ1で見つからないと思うなら、省くことも可能だが、たぶん、一般人は設定しなくともよい項目。

```
Stage1DCD=0
```

もう、GIMPSへの貢献を止めたいと思ったとき、既に割り当てられているタスクを解除したい。それ自体はメニューから`Unreserve Exponent`で実現できるものの、そのままだとリソースが空いたと思われて、新しいタスクを自動で取得しようとする。止める場合は、`NoMoreWork`を設定してからUnreserve する。

※ユーザ登録している場合は、webの画面からも割り当てを解除できる。

```
NoMoreWork=1
```

### local.txt
初期設定時でも変更できるが、`WorkerDiskSpace`は、使用ディスクサイズの上限、`Memory`は使用メモリサイズの上限を指定する。ディスクはPRP時に、メモリはP-1とECMのステージ2で主に使用され、もちろん、多いに越したことはないが、PCのスペックに合わせて設定する。

## 自動起動
立ち上げ時に自動でmprimeが起動するようにする。

```boot.sh
nohup /home/mprime/mprime -d >>/home/mprime/mprime.log 2>&1 < /dev/null &
```

```
chmod +x /home/mprime/boot.sh
```

```
crontab -e
```

```
@reboot /home/mprime/boot.sh
```

# 参考文献
* [GIMPSの始め方](https://qiita.com/saoyagi2/items/8618033c47b560ca08ae)
* [素数探索はじめました](https://0-chromosome.hatenablog.jp/entry/2016/08/30/180429)