Библиотека GMP является наиболее известной бесплатной библиотекой для длинной арифметики, написанной на языке C с использованием ассемблера. Эта библиотека разрабатывается с 1991 года. Из этой библиотеки появился другой бесплатный независимый проект с длинной арифметикой, в котором была сохранена совместимость с GMP - MIPR. Mathematica, Maple и некоторые другие системы символьных вычислений используют GMP в качестве библиотеки для работы с длинной арифметикой.

Под линуксом проблем с установкой подобных библиотек обычно не возникает. Здесь срабатывает либо путь установки библиотеки из репозитария, либо более стандартный - скачивание исходных кодов и их компиляция при помощи “./configure && make && make install”.

Установка GMP для MINGW (Windows)

Если вы используете standalone версию MinGW(т.е. у вас есть папка C:\MinGW), то скорей всего вы её ставили при помощи утилиты mingw-get, которая находится в “C:\MinGW\bin”. При помощи mingw-get проблем с установкой GMP вообще не должно возникать, и ставится библиотека следующим образом :

mingw-get install mingw32-gmp
mingw-get install mingw32-gmp-dev

В случае отсутствия mingw-get, или если хочется версию GMP посвежее, то можно попробовать собрать библиотеку из исходных кодов используя систему msys :

# предположим что в папке C:\code\gmp502c\ будет находиться скомпилированная версия
./configure --prefix=/c/code/gmp502c/ --enable-cxx
make
make install

Флаг –enable-cxx позволит скомпилировать дополнительную библиотеку libgmpxx.a для С++ (заголовочный файл gmpxx.h) После компиляции в папке C:\code\gmp502c\ появится три директории lib(библиотеки для линковки), include(заголовочные файлы), share(доки для man). *Под MinGW мне удалось скомпилировать GMP из исходников, однако не получилось слинковать библиотеку с моим проектом. Я пробовал компилировать MIPR, но для нее не работает флаг –prefix при сборке и приходится собирать все что скомпилировалось в папке MIPR буквально “руками”. В конечном итоге я остановился на более простом варианте и решил использовать библиотеки, поставленные mingw-get.

C++ библиотеки GMP, их линковка и использование

GMP состоит из следующих файлов

Заголовочные:
 * gmp.h (для C)
 * gmpxx.h (для C++)
Библиотеки:
 * libgmp.a (библиотека для C)
 * libgmpxx.a (библиотека для C++)

При работе с GMP надо будет обязательно линковать файлы библиотек выше и указывать их в настройках проекта, иначе не избежать ошибок компиляции. Дополнительно, если вы используете версию из исходников, надо будет указать папку для поиска библиотек и заголовочных файлов(в примере это C:\code\gmp502\lib C:\code\gmp502\include) Дальше можно проверить, что скомпилированная GMP работает для следующиего исходника :

#include <iostream>
#include <gmpxx.h>
using std::cout;
int main ()
{
    mpz_class a, b, c;
    a = 1234;
    b = "-567000000000000000000000008";
    c = a+b;
    cout << "sum is " << c << "\n";
    cout << "absolute value is " << abs(c) << "\n";
    return 0;
}

Если вы используете версию GMP из mingw-get :

g++ main.cpp -lgmpxx -lgmp

И если версию из исходных кодов :

g++ main.cpp -I/c/code/gmp502/include -L/c/code/gmp502/lib -lgmpxx -lgmp

На Mac OS X при использование gmp из brew :

g++-4.7 test_gmp.cpp -I/usr/local/include -L/usr/local/lib -lgmpxx -lgmp

Документация по GMP есть на сайте, конкретно по C++ обертке здесь.

Напоследок хотелось бы сказать, что пока я не сразу нашел простой путь установки GMP для MinGW при помощи mingw-get, я был немного удивлен тем, что не существует нормальных версий библиотеки GMP(или MIPR), которая сразу бы скомпилировалась и заработала.

Ну и касаемо такого вопроса почему же все-таки GMP, а не Python или другой язык, в котором уже встроена длинная арифметика, я думаю вы уже догадались, GMP для C++ на порядок быстрее Python и схожих систем.