【Visual Studio 2017】MPIR(GMP) 도입 방법【다배장 정수 라이브러리】

소개



이번에는 Visual Studio 2017에서 MPIR(GMP)의 도입 방법에 대해 설명합니다.
そろそろMPIR(GMP)に手を出してみようかな라고 생각하는 분이나,Visual StudioでプログラミングしてるけどMPIR(GMP)の入れ方がわからない라는 분을 향해 쓰고 있습니다.

이것을 보면 누구나 MPIR(GMP)를 도입할 수 있다! 해야

다운로드



⇒여기에서 MPIR〇〇source.zip을 다운로드합니다.


MPIR〇〇source.zip을 선택합니다.

이 설명에서는 MPIR 3.0.0 source.zip를 사용합니다.

다운로드 후



다운로드한 MPIR〇〇source.zipすべて展開(解凍) 합니다.
이번에는 배포 위치를 Cドライブ直下(Windows (C:))에 둡니다.



배포에는 적당한 시간이 걸립니다.



배포가 끝나면 다음.

dll_mpir_gc 빌드



확장된 폴더C:\mpir-〇〇를 열면build.vcXX (XX는 숫자)라는 폴더가 있다고 생각합니다.
1번 숫자가 큰 것을 열어 주세요.
mpir.sln 파일이 있으므로 Visual Studio 2017에서 시작합니다.


이 설명에서는 C:\mpir-3.0.0\build.vc15\mpir.sln에있었습니다.

시작하면 먼저 왼쪽 상단에DebugReleaseWin32x64로 변경하십시오.



그런 다음 솔루션 탐색기에서
dll_mpir_gc를 선택하고 마우스 오른쪽 버튼을 클릭하면 나옵니다.
프로젝트의 재대상을 선택합니다.



확인을 선택합니다.



다음도 솔루션 탐색기에서
dll_mpir_gc를 선택하고 마우스 오른쪽 버튼을 클릭하면 나옵니다.
빌드를 선택합니다.



무사히 출력할 수 있었습니다.


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



이번에는 콘솔 프로젝트로 사용하기 때문에,
왼쪽 リンカーシステムサブシステム
コンソール (/SUBSYSTEM:CONSOLE)

합시다.

마지막으로 만든 프로젝트의
소스 코드가 들어있는 폴더에mpir.dll 넣으면 준비 완료입니다.
mpir.dllC:\mpir-〇〇\dll\(Win32 or x64)\Release에 있습니다.

프로젝트 이름을 마우스 오른쪽 버튼으로 클릭한 후,
"탐색기에서 폴더 열기"
을 누르면 해당 폴더가 열립니다.

이 해설에서는C:\mpir-3.0.0\dll\x64\Release\mpir.dll에 있었다.



MPIR (GMP)을 사용할 수 있는지 테스트



이번에는 메르센 소수를 구합시다.

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.
소스 코드는 자유롭게 사용하십시오.

좋은 웹페이지 즐겨찾기