Умножение и деление на целые числа разбиваются на части

Кто-нибудь знает, где я могу получить инструкции о том, как выполнять умножение и деление (и, возможно, даже модуль) для целых чисел, которые хранятся по частям? Я делаю библиотеку, в которой uint128_t хранится как uint64_t UPPER, LOWER.


person calccrypto    schedule 25.05.2011    source источник
comment
Этот вопрос содержит несколько полезных ответов.   -  person Björn Pollex    schedule 26.05.2011


Ответы (4)


Вы знакомы с GMP библиотекой? Почему бы вам не использовать его вместо того, чтобы реализовать свой собственный?

По указанной выше ссылке вы можете скачать tar.bz файл для ОС на базе Unix.

Для Windows перейдите по этой ссылке:

В нем много информации и установочных файлов для MinGW, MSVC ++ и CgyWin. Загрузите то, что вам нужно. Вы также можете увидеть эту ссылку:


После того, как вы закончите установку и настройку, вы захотите узнать, как программировать с использованием GMP, для этого перейдите по этим ссылкам:

person Nawaz    schedule 25.05.2011
comment
@calccrypto: Конечно, вы должны загрузить и установить его перед использованием. - person Nawaz; 26.05.2011
comment
установить??? Я думал, что это просто распаковать, скопировать в какую-то папку и связать с ней компилятор - person calccrypto; 26.05.2011
comment
@calccrypto: Да. Весь этот процесс - установка, настройка и все такое. - person Nawaz; 26.05.2011
comment
в tar.gz нет файла gmp.h - person calccrypto; 26.05.2011
comment
@calccrypto: Скорее всего, вы загрузили не тот файл или, возможно, возникла проблема с загрузкой. - person Nawaz; 26.05.2011
comment
ive скачивал его несколько раз, и у него никогда не было файла .h. Я изо всех сил старался найти его, и мне удалось его оштрафовать. К сожалению, я случайно удалил всю папку и tar.bz. Кроме. я никогда не мог заставить mpz_t работать - person calccrypto; 26.05.2011
comment
подскажите пожалуйста, где в папке после распаковки находится файл gmp.h - person calccrypto; 26.05.2011
comment
@calccrypto: Вы используете Windows или Linux? или что? - person Nawaz; 26.05.2011
comment
@calccrypto: требуется правильная установка, без которой у вас не может быть gmp.h, который создается при установке с помощью данного сценария установки. см. это: gmplib.org/manual/Installing-GMP.html#Installing-GMP - person Nawaz; 26.05.2011
comment
@calccrypto: перед использованием необходимо прочитать основы GMP: gmplib.org/manual /GMP-Basics.html#GMP-Basics - person Nawaz; 26.05.2011
comment
@calccrypto: Это то, о чем я подозревал. 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      

Конечно, проблема в том, как бороться с переполнениями.

person Landei    schedule 26.05.2011
comment
В моих тестах умножение по Карацубе было медленнее, если у меня не было больше двух цифр. - person Mooing Duck; 07.03.2012

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic может быть хорошим Начало. Уже существует множество библиотек с открытым исходным кодом

person parapura rajkumar    schedule 25.05.2011

Взгляните на различные библиотеки Big Integer. Вот тот, который Google нашел https://mattmccutchen.net/bigint/

person Richard Schneider    schedule 25.05.2011