Как GMP хранит свои целые числа в произвольном количестве байтов? - PullRequest
6 голосов
/ 14 июля 2010

2 ^ 64 все еще далеко от "бесконечности", с которой мой оперативный диск / жесткий диск может справиться ...

Сначала я задаюсь вопросом, как GMP работает с памятью / процессором, поскольку он выполняет некоторую неясную оптимизацию ....

Мне также было интересно, есть ли способ хранения целого числа (без знака, это проще) на произвольном количестве байтов.Например, на 50 байтах у меня будет ограничение 2 ^ 400 -1.Нужно хорошо поработать с переносами, чтобы число совпадало от одного байта к другому, у меня есть представление об этом, но я не уверен, что это будет самый быстрый способ сделать это.Я даже не уверен, прав ли я.

Я предполагаю, что GMP использует этот способ хранения своих данных, но мне просто нужно какое-то (даже небольшое) объяснение или какое-то продвижение к какой-то теории (У меня нет докторской степени, так что не будь жестким).

1 Ответ

19 голосов
/ 14 июля 2010

GMP динамически распределяет пространство для представления чисел (и перераспределяет, когда ему нужно расти).

Это подробно описано в Integer Internals, в руководстве GMP , в котором описывается, как он разбивает представление на «конечности» и сохраняет конечности в массиве.

Описание термина "конечности" происходит от Основы GMP: номенклатура и типы :

Конечность означает часть числа с высокой точностью, которая помещается в одно слово. (Мы выбрали это слово, потому что конечность человеческого тела аналогична цифре, только больше и содержит несколько цифр.) Обычно конечность содержит 32 или 64 бита. Тип данных C для конечности - mp_limb_t.

Таким образом, представление числа в GMP работает путем объединения нескольких конечностей в единое целое, чтобы представить величину целого числа, хранимого со знаковым битом (знаковый бит имеет двойное назначение для хранения числа конечностей).

Что это значит для вас? Ну, обычно int64 представляется в 64 битах. Готово. Если вы соберете их вместе, вы можете значительно увеличить это. Положите два вместе, 2 ^ 64 * 2 ^ 64 или 2 ^ 128. Добавьте еще две конечности, и вы получите 2 ^ 256. Это много цифр, хранящихся в 4 словах (плюс издержки на представление).

Конечно, представление с плавающей точкой является более сложным ( см. Здесь ), сохраняя представление с помощью мантиссы (состоящей из знака и величины) и показателя степени.

...