GMP (라이브러리)
1. 개요
GMP (GNU Multiple Precision Arithmetic Library)는 임의 정밀도 산술 연산을 위한 라이브러리이다. C 및 C++로 작성되었으며, 큰 숫자를 처리하는 데 사용된다. GMP는 다양한 프로그래밍 언어에 대한 바인딩을 제공하며, C, C++, Perl, Python, R, Ruby, Rust, PHP, Common Lisp, Ch, Haskell, LuaJIT, Delphi, OCaml, .NET, Nim, Java 등에서 사용 가능하다.
이미지 준비중입니다.
| 개발자 | GNU 프로젝트 |
|---|---|
| 최초 릴리스 | 1991년 |
| 최신 안정화 버전 | 6.2.0 |
| 최신 안정화 버전 출시일 | 2020년 1월 18일 |
| 최신 미리보기 버전 | 6.3.0 |
| 최신 미리보기 버전 출시일 | 2024년 1월 14일 |
| 저장소 | GMP 저장소 |
| 프로그래밍 언어 | C, (C++, 어셈블리 선택 사항) |
| 종류 | 수학 소프트웨어 |
| 라이선스 | LGPLv3 및 GPLv2 이중 라이선스 |
| 웹사이트 | GNU MP Bignum Library |
-
수치 해석 소프트웨어 -
LINPACK
LINPACK은 부동소수점 연산 성능을 평가하는 벤치마크 프로그램이자 FORTRAN 라이브러리로, 슈퍼컴퓨터 성능 측정 기준으로 사용되는 HPLinpack 벤치마크의 기반이 되었으며, TOP500 목록에서 고성능 컴퓨터 순위를 결정하는 데 기여한다. -
수치 해석 소프트웨어 -
NumPy
NumPy는 파이썬에서 다차원 배열을 효과적으로 다루기 위한 라이브러리로, C API를 제공하여 외부 라이브러리와 연동을 지원하며, 다양한 연산 기능과 멀티스레딩을 통한 성능 향상을 제공한다. -
C 라이브러리 -
OpenSSL
OpenSSL은 1998년에 설립된 암호화 도구 프로젝트로, 다양한 암호화 알고리즘과 프로토콜을 지원하며, 아파치 라이선스를 채택했고, 보안 문제와 API 호환성 문제 등의 비판을 받았다. -
C 라이브러리 -
SQLite
SQLite는 D. 리처드 히프가 설계한 서버리스 구조의 임베디드 SQL 데이터베이스 엔진으로, 별도의 DBMS 없이 프로그램에 통합되어 작동하며 전체 데이터베이스를 단일 파일로 저장하는 특징이 있고, 다양한 운영체제와 환경에서 널리 사용된다. -
LGPL 라이선스 소프트웨어 -
Qt (소프트웨어)
Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다. -
LGPL 라이선스 소프트웨어 -
GTK
GTK는 GIMP를 위해 개발된 크로스 플랫폼 GUI 툴킷으로, 다양한 운영체제와 프로그래밍 언어를 지원하며 여러 데스크톱 환경 및 애플리케이션에서 활용된다.
2. 코드 예제
GMP를 사용하면 C나 C++에서 큰 수를 다룰 수 있다. C 코드 예제에서는 `mpz_t` 타입을 사용하여 변수를 초기화하고, `mpz_mul` 함수로 곱셈을 수행하며, 결과는 `gmp_printf`를 통해 출력한다. C++ 코드 예제에서는 `mpz_class`를 사용하며, 더 간결하게 곱셈 연산을 수행하고 `std::cout`으로 결과를 출력할 수 있다.
C 예제에서는 컴파일 시 `-lgmp` 플래그를, C++ 예제에서는 `-lgmpxx -lgmp` 플래그를 사용해야 한다.
2.1. C
다음은 GMP 라이브러리를 사용하여 큰 숫자를 곱하고 출력하는 C 언어 코드 예제이다.
#include
#include
int main(void) {
mpz_t x, y, result;
mpz_init_set_str(x, "7612058254738945", 10);
mpz_init_set_str(y, "9263591128439081", 10);
mpz_init(result);
mpz_mul(result, x, y);
gmp_printf(" %Zd\n"
"*\n"
" %Zd\n"
"--------------------\n"
"%Zd\n", x, y, result);
/* free used memory */
mpz_clear(x);
mpz_clear(y);
mpz_clear(result);
return 0;
}
이 코드는 7612058254738945 × 9263591128439081의 값을 계산한다.
이 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 나온다. (Unix 계열 시스템에서 컴파일하는 경우 `-lgmp` 플래그가 사용된다.)
7612058254738945
*
9263591128439081
--------------------
70514995317761165008628990709545
2.2. C++
다음은 GMP를 사용하여 큰 숫자를 곱하고 표시하는 C++ 프로그램 예제이다.
#include
#include
int main() {
mpz_class x("7612058254738945");
mpz_class y("9263591128439081");
std::cout << " " << x << "\n"
<< "*\n"
<< " " << y << "\n"
<< "--------------------\n"
<< x * y << "\n";
return 0;
}
이 코드는 7612058254738945 × 9263591128439081의 값을 계산한다.
컴파일하여 실행할 때(Unix 계열 시스템에서 컴파일하는 경우 `-lgmpxx -lgmp` 플래그가 사용된다.)는 다음과 같은 결과가 나온다.
7612058254738945
*
9263591128439081
--------------------
70514995317761165008628990709545
3. 언어 바인딩
GMP는 다양한 프로그래밍 언어를 지원하기 위해 바인딩을 제공한다. 다음은 GMP 라이브러리의 언어 바인딩 목록이다.
| 라이브러리 이름 | 언어 | 라이선스 |
|---|---|---|
| [https://gmplib.org/ GNU 다중 정밀도 라이브러리] | C, C++ | LGPL |
| [https://metacpan.org/pod/Math::GMP Math::GMP] | Perl | LGPL |
| [https://metacpan.org/pod/Math::GMPz Math::GMPz], [https://metacpan.org/pod/Math::GMPf Math::GMPf] 및 [https://metacpan.org/pod/Math::GMPq Math::GMPq] | Perl | Artistic License v1.0 + GPL v1.0 이상 |
| [https://github.com/aleaxit/gmpy 일반 다중 정밀도 파이썬 프로젝트] | 파이썬 | LGPL |
| [https://cran.r-project.org/web/packages/gmp/index.html R 패키지 'gmp'] | R | GPL |
| [https://rubygems.org/gems/gmp The RubyGems project] | 루비 | 아파치 2.0 |
| [https://lib.rs/crates/gmp-mpfr-sys GMP, MPFR 및 MPC용 Rust FFI 바인딩] | 러스트 | LGPL |
| [https://www.php.net/gmp PHP용 GNU 다중 정밀도 라이브러리] | PHP | PHP |
| [http://www.math.uni.wroc.pl/~hebisch/prog/ SBCL용 GNU 다중 정밀도 루틴] | 공통 리스프 | 퍼블릭 도메인 |
| [http://chgmp.sourceforge.net/ Ch GMP] | Ch | 독점 |
| [http://bmdfm.com/ BMDFM용 병렬 GMP 래퍼] | BMDFM LISP / C | 퍼블릭 도메인 |
| 글래스고 하스켈 컴파일러 ( Integer의 구현은 기본적으로 GMP에 대한 바인딩입니다) | 하스켈 | BSD |
| [https://github.com/Playermet/luajit-gmp luajit-gmp] | LuaJIT | MIT |
| [https://code.google.com/archive/p/gmp-wrapper-for-delphi gmp-wrapper-for-delphi] | 델파이 | MIT |
| [https://github.com/ocaml/Zarith Zarith] | OCaml | LGPL |
| [https://github.com/MachineCognitis/Math.Gmp.Native Math.Gmp.Native 라이브러리] | .NET | MIT |
| [https://github.com/FedeOmoto/nim-gmp nim-gmp] | 님 | MIT |
| [https://github.com/jandom-devel/JGMP JGMP] | 자바 | LGPL |