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 |
-
LGPL 라이선스 소프트웨어 -
Qt (소프트웨어)
Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다. -
LGPL 라이선스 소프트웨어 -
GTK
GTK는 GIMP를 위해 개발된 크로스 플랫폼 GUI 툴킷으로, 다양한 운영체제와 프로그래밍 언어를 지원하며 여러 데스크톱 환경 및 애플리케이션에서 활용된다. -
C 라이브러리 -
OpenSSL
OpenSSL은 1998년에 설립된 암호화 도구 프로젝트로, 다양한 암호화 알고리즘과 프로토콜을 지원하며, 아파치 라이선스를 채택했고, 보안 문제와 API 호환성 문제 등의 비판을 받았다. -
C 라이브러리 -
SQLite
SQLite는 D. 리처드 히프가 설계한 서버리스 구조의 임베디드 SQL 데이터베이스 엔진으로, 별도의 DBMS 없이 프로그램에 통합되어 작동하며 전체 데이터베이스를 단일 파일로 저장하는 특징이 있고, 다양한 운영체제와 환경에서 널리 사용된다. -
어셈블리어 소프트웨어 -
터보 파스칼
-
어셈블리어 소프트웨어 -
MS-DOS
MS-DOS는 마이크로소프트가 개발한 개인용 컴퓨터용 디스크 운영 체제로, IBM PC의 표준 운영 체제로 널리 사용되었으며, 단일 작업 환경과 명령줄 인터페이스를 특징으로 한다.
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 |