GMP는 The GNU Multiple Precision Arithmetic Library(고정밀도 연산을 위한 GNU 라이브러리)의 줄임글로서 GNU MP라고도 한다. 리눅스 호환 환경이면 대부분 GMP는 이미 설치되어 있을 것이다. GMP의 공식 홈페이지는 http://gmplib.org 이고, GMP는 LGPL 하에서 배포된다.

또 gcc는 리눅스 호환 환경에서 쓸 수 있는 C 컴파일러(GNU C 컴파일러)이다. 대부분의 리눅스 호환 환경에는 gcc가  설치되어 있을 것이다.

다음 소스 코드는 GMP의 설치 테스트를 하기 위한 간단한 예제이다.

C 언어에서 GMP 라이브러리를 사용하기 위해서는 헤더 파일 gmp.h를 인클루드한다.
컴파일할 때는 반드시 컴파일 옵션 -lgmp 를 주어야 한다.
또 컴파일 옵션 -o testGMP 을 준 것은 생성될 실행파일명을 testGMP로 하라는 의미이다.
이 옵션을 생략하면 생성되는 실행파일명이 a.out(단, cygwin의 경우에는 a.exe)이다.

((  참고로, Visual C++ 6 에서 컴파일하는 명령은
           cl -I. testGMP.c /link gmp.lib /NODEFAULTLIB:LIBCMT
이다. 필자는 Visual C++ 6 에서 GMP 라이브러리를 사용하기 위해 영국에 사는 Brian Gladman 씨가 http://www.gladman.me.uk/computing/ 에서 제공하는 gmp-4.1.4.diffs.zip 을 써서 Visual C++ 6 용 GMP 라이브러리 gmp.lib 를 빌드하였다. ))

mpz_mul_ui 함수는 mpz_t 타입의 정수에 unsigned long 타입의 정수를 곱하는 함수이고,
mpz_add_ui 함수는 mpz_t 타입의 정수에 unsigned long 타입의 정수를 합하는 함수이다.

        mpz_init(r);

mpz_init 함수는 mpz_t 타입의 정수 변수를 초기화 하는 함수이다. (초기화된 값은 0)

       mpz_init_set_str(n, "123456", 10);

또 mpz_init_set_str 함수는 두번째 인수에 주어진 ASCIZ 문자열을 세 번째 인수에 주어진 적당한 진법(이 예에서는 10)을 적용하여 첫번째 인수에 주어진 mpz_t 타입의 정수 변수(이 예에서는 n)에 저장하는 함수이다.


  1. /*
  2.  *  Filename: testGMP.c
  3.  *
  4.  *   Compile: gcc -o testGMP testGMP.c -lgmp
  5.  *
  6.  *   Execute: ./testGMP
  7.  *    Output: 2470450
  8.  */
  9. #include <gmp.h>
  10. void foo(mpz_t result, const mpz_t param, unsigned long n) {
  11.     unsigned long i;
  12.     mpz_mul_ui(result, param, n);
  13.     for (i = 1; i < n; i++) {
  14.         mpz_add_ui (result, result, i*7);
  15.     }
  16. }
  17. int main(void) {
  18.     mpz_t r, n;
  19.     mpz_init(r);
  20.     mpz_init_set_str(n, "123456", 10);
  21.     foo(r, n, 20L);
  22.     gmp_printf("%Zd\n", r);
  23.     return 0;
  24. }



컴파일> gcc -o testGMP testGMP.c -lgmp

실행> ./testGMP
2470450



Win32의 Visual C++ 6 상에서 컴파일하기:
컴파일>cl -I. testGMP.c /link gmp.lib /NODEFAULTLIB:LIBCMT

실행> testGMP
2470450



Visual C++ 9.0 (Visual Studio 2008) 에서 컴파일하기:
컴파일>cl testGMP.c gmp.lib

실행> testGMP
2470450



Posted by Scripter
,