Нет, когда вы используете mpz_t
, вы не можете ограничить GMP целыми числами с фиксированной длиной. mpz_t - это структура с массивом длины конечностей (выделено; используется) и указателем на фактическое значение, которое хранится как массив целых чисел (конечности; массив int32 или int64) GMP готова увеличить длину любого значения, когда оно станет большим.
Вы можете выделить 128 бит для каждого mpz_t в init, используя mpz_init2
:
mpz_init2(mpz_t*, bit_number);
Но ускорение от этого невелико, все еще существует перенаправление данных и обработка длины.
Вы можете использовать конечности напрямую, переключившись на mpn_
функции низкого уровня:
http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions
Не будет указателя на конечности (это хорошо для кеша), нет простого кода ввода / вывода; и никакой автоматической обработки размера конечностей (ни автоматического расширения, ни распределения). Вы должны сделать все хранение самостоятельно; может даже быть, что некоторые переносы должны обрабатываться вручную, но будут быстрые операции GMP *
, /
и %
; Вы можете восстановить mpz_t для простого ввода / вывода с помощью mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_array
.
Кроме того, вы можете просто использовать uint128_t, если переключитесь на 64-битную версию mingw.