Есть ли в C большие твердо-целочисленные реализации? - PullRequest
6 голосов
/ 07 июля 2010

Я работаю над проектом, в котором мне нужно обрабатывать большие целые числа (например, 3 ^ 361) с абсолютной точностью и максимально возможной скоростью. C - самый быстрый язык, с которым я знаком, поэтому я пытаюсь написать свое решение на этом языке.

Проблема в том, что мне не удалось найти хорошую реализацию каких-либо типов данных для представления неограниченных целых чисел в C, кроме исходного кода Python. Мне требуется время, чтобы просмотреть код и определить, что мне нужно.

Я бы предпочел использовать чужой проверенный код с полным набором функций (сложение, вычитание, умножение, деление, модуляция, возведение в степень, проверка на равенство ... даже побитовая операция была бы приятной), чем тратить недели, которые потребовались бы мне даже начать приводить свою версию в нормальное состояние. Хотя это был бы хороший учебный опыт, он не является предметом моей проблемы, и я бы предпочел перейти к той части, которая меня интересует:)

Ответы [ 6 ]

4 голосов
/ 07 июля 2010

Несколько человек уже упоминали GMP. Я бы только добавил, что, по крайней мере, в последний раз, когда я смотрел, он был довольно хорошо ограничен для работы с gcc.

Если вы хотите использовать другие компиляторы, вы можете назвать пару NTL и MIRACL . Я немного протестировал MIRACL, и, кажется, он работает достаточно хорошо. Я использовал NTL немного больше, и хотя большие целые числа являются для него побочной линией, он все равно делает их довольно хорошо. Он не претендует на такую ​​же скорость, как GMP (и, фактически, может использовать GMP для выполнения базовых операций), но когда я провел некоторый минимальный сравнительный анализ между ними, я не обнаружил значительных различий (хотя это было достаточно давно, и я сомневаюсь, что это уже верно).

3 голосов
/ 07 июля 2010

libtommath от libtomcrypt, вероятно, самый маленький, самый простой и самый быстрый. (Забавно, как эти 3 превосходные степени почти всегда собираются вместе ...) Если вы не можете найти восходящий поток, вы можете получить источник из дерева исходников ssh dropbear.

3 голосов
/ 07 июля 2010

Я использую MAPM , которая представляет собой переносимую библиотеку произвольной точности (целые и с плавающей запятой).

3 голосов
/ 07 июля 2010

Библиотека OpenSSL также обеспечивает надежную реализацию BigNum (<openssl/bn.h>).

3 голосов
/ 07 июля 2010

Gnu MP предоставляет библиотеку bignum.

2 голосов
/ 07 июля 2010

Если вы хотите ANSI Standard C, получите код в C интерфейсов и реализаций Дейва Хансона . Очень ясно и хорошо продумано.

Если с расширениями gcc и gcc все в порядке, то, как уже отмечали другие, библиотека Gnu Multiprecision (GMP) хорошо продумана и широко используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...