【Visual Studio 2017】MPIR(GMP)導入方法【多倍長整数ライブラリ】

#はじめに
今回はVisual Studio 2017でMPIR(GMP)の導入方法について解説していきます。

`そろそろMPIR(GMP)に手を出してみようかな`
と思っている方や、
`Visual StudioでプログラミングしてるけどMPIR(GMP)の入れ方がわからない`
という方に向けて書いてます。

これを見れば誰でもMPIR(GMP)が導入できる！~~はず~~

#[ダウンロード](http://mpir.org/downloads.html)

[⇒こちらから`MPIR〇〇source.zip` をダウンロードします。](http://mpir.org/downloads.html)



[![1_2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/5328bf09-9753-aa51-956f-998d4ec39ea3.png)](http://mpir.org/downloads.html)
[`MPIR〇〇source.zip`](https://www.boost.org/users/download/) を選択します。

この解説では、 `MPIR 3.0.0 source.zip` を使います。

#ダウンロード後

ダウンロードした[`MPIR〇〇source.zip`](http://mpir.org/downloads.html)を `すべて展開(解凍)` します。
今回、展開場所は `Cドライブ直下(Windows (C:))` に置きます。

![bo3.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/acc73b96-7501-0b30-7720-5e896ee49715.png)

展開はそこそこ時間がかかります。

![2_2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/00706c2c-dc23-5927-8196-b9ce162736ca.png)

展開が終わったら次へ。

#dll_mpir_gcをビルドする

展開したフォルダ、`C:\mpir-〇〇`を開くと
`build.vcXX`(XXは数字)というフォルダがあると思います。
１番数字が大きいものを開いてください。

`mpir.sln`ファイルがあるので**Visual Studio 2017**で起動します。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/f979a1a4-4f75-4100-1aa8-fb8f29e63f10.png)

この解説では`C:\mpir-3.0.0\build.vc15\mpir.sln`にありました。

起動したら最初に左上にある
`Debug`を`Release`に
`Win32`を`x64`に変えてください。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/f059f6fe-527b-5760-d890-730e002197dd.png)

次に**ソリューションエクスプローラー**から
**dll_mpir_gc**を選択し、右クリックすると出てくる
**プロジェクトの再ターゲット**を選択します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/213065/4b4d4183-6339-9fb4-cc5e-c8babe87b4c2.png)

**OK**を選択します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/213065/25c00a8d-1175-48db-5991-01fa924f0e77.png)

次も**ソリューションエクスプローラー**から
**dll_mpir_gc**を選択し、右クリックすると出てくる
**ビルド**を選択します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/213065/2f2f14fb-a83e-6cd9-5f0a-975df1d6bac4.png)

無事に出力できました。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/213065/e5886d62-9fd9-897c-693e-1882c8ae365b.png)

`mpir.sln`を閉じましょう。

#Visual Studioでの設定

さて、ここからが本番です。
画面上のメニューの `プロジェクト(P)` から `〇〇のプロパティ` を押します。

左の `C/C++` ⇒ `全般` ⇒ `追加のインクルードディレクトリ` に下記を追加します。
※ダウンロードしたMPIR(GMP)のバージョンによって適宜、名前を変えてください。

```
C:\mpir-3.0.0
```

左の `リンカー` ⇒ `全般` ⇒ `追加のライブラリディレクトリ` に下記のどちらかを追加します。
※ダウンロードしたMPIR(GMP)のバージョンによって適宜、名前を変えてください。

```:x86の場合
C:\mpir-3.0.0\build.vc15\dll_mpir_gc\Win32\Release
```

```:x64の場合
C:\mpir-3.0.0\build.vc15\dll_mpir_gc\x64\Release
```

左の `リンカー` ⇒ `入力` ⇒ `追加の依存ファイル` に下記を追加します。
※ダウンロードしたMPIR(GMP)のバージョンによって適宜、名前を変えてください。

```
mpir.lib
```

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/86d50f70-4cdd-f47b-d064-bca71ccf8218.png)


今回は、コンソールのプロジェクトとして使用するので、
左の `リンカー` ⇒ `システム` ⇒ `サブシステム` を

```
コンソール (/SUBSYSTEM:CONSOLE)
```
にしましょう。

最後に作成したプロジェクトの
ソースコードが入っているフォルダに
**`mpir.dll`**を入れたら準備完了です。

**`mpir.dll`** は `C:\mpir-〇〇\dll\(Win32 or x64)\Release`にあります。

**プロジェクト名**を右クリックした後、
**"エクスプローラーでフォルダを開く"**
を押すと該当するフォルダが開きます。

この解説では、
`C:\mpir-3.0.0\dll\x64\Release\mpir.dll`
にありました。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/213065/f0bd17d8-a70c-ac7c-f1d5-35b394cf5dad.png)


#MPIR(GMP)が使えるかどうかのテスト

今度はメルセンヌ素数を求めてみましょう。

```cpp:Source.hpp
#include <cstdint>
#include <iostream>
#include <mpirxx.h>
#include <chrono>


bool lucasLehmerTest(const int_fast32_t p_) {
	mpz_class m = 1;
	m <<= p_;
	--m;
	mpz_class s = 4;
	for (int_fast32_t i = 2; i < p_; ++i)
		s = (s*s - 2) % m;
	if (s == 0) return true;
	return false;
}

bool lucasLehmerTestFast(const int_fast32_t p_) {
	mpz_class m{ 1 };
	m <<= p_;
	--m;

	mpz_class s{ 4 };
	mpz_class sqrt;
	for (int_fast32_t i{ 2 }; i < p_; ++i) {
		sqrt = s * s;
		s = (sqrt & m) + (sqrt >> p_);
		if (s >= m) s -= m;
		s -= 2;
	}
	if (s == 0) return true;
	return false;
}

int main() {

	std::chrono::system_clock::time_point  start, end;

	start = std::chrono::system_clock::now();

	if (lucasLehmerTestFast(9689)) std::cout << "TRUE" << std::endl;
	else std::cout << "FALSE" << std::endl;

	end = std::chrono::system_clock::now();
	std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;

	return 0;
}
```

```:出力結果
TRUE
232
```

実行できました！

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。