Кто-нибудь знает, где я могу получить инструкции о том, как выполнять умножение и деление (и, возможно, даже модуль) для целых чисел, которые хранятся по частям? Я делаю библиотеку, в которой uint128_t
хранится как uint64_t UPPER, LOWER
.
Умножение и деление на целые числа разбиваются на части
Ответы (4)
Вы знакомы с GMP
библиотекой? Почему бы вам не использовать его вместо того, чтобы реализовать свой собственный?
По указанной выше ссылке вы можете скачать tar.bz
файл для ОС на базе Unix.
Для Windows перейдите по этой ссылке:
В нем много информации и установочных файлов для MinGW, MSVC ++ и CgyWin. Загрузите то, что вам нужно. Вы также можете увидеть эту ссылку:
- Как установить и запустить GMP на Windows с использованием MPIR
- Создание библиотеки GMP с помощью Visual Studio? (тема Stackover)
После того, как вы закончите установку и настройку, вы захотите узнать, как программировать с использованием GMP, для этого перейдите по этим ссылкам:
gmp.h
, который создается при установке с помощью данного сценария установки. см. это: gmplib.org/manual/Installing-GMP.html#Installing-GMP
- person Nawaz; 26.05.2011
tar.bz
, который вы скачали, предназначен только для unix, а не для Windows. Во всяком случае, посмотри мой ответ. Я его обновил.
- person Nawaz; 26.05.2011
Такое разделение чисел является идеальной предпосылкой для умножения по Карацубе. Учитывать:
x = x1 * 2^k + x2
y = y1 * 2^k + y2
Используя школьное умножение, вам понадобится 4 умножения:
x*y = (x1*y1) * 2^(2*k) + (x1*y2 + x2*y1) * 2^k + x2*y2
Карацубе нужно еще несколько сложений, но всего 3 умножения:
p1 = x1 * y1
p2 = x2 * y2
x*y = p1 * 2^(2*k) + ((x1+x2)*(y1+y2) - p1 - p2) * 2^k + p2
Конечно, проблема в том, как бороться с переполнениями.
http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic может быть хорошим Начало. Уже существует множество библиотек с открытым исходным кодом
Взгляните на различные библиотеки Big Integer. Вот тот, который Google нашел https://mattmccutchen.net/bigint/