Как работают BigNums?

Я хотел знать, как реализованы BigInt и другие подобные материалы. Я попытался проверить исходный код JAVA, но для меня все было греческим и латинским. Не могли бы вы объяснить мне алго в словах - никакого кода, так что я понимаю, что я фактически использую, когда я что-то использую из JAVA API. рассматривает

Ответ 1

Концептуально, так же, как вы производите произвольный размер арифметики вручную. У вас есть что-то вроде массива значений и алгоритмов для различных операций, которые работают с массивом.

Предположим, вы хотите добавить 100 в 901. Вы начинаете с двух чисел в виде массивов:

 [0, 1, 0, 0]
 [0, 9, 0, 1]

Когда вы добавляете, алгоритм добавления начинается справа, берет 0+1, давая 1, 0+0, давая 0, и - теперь сложная часть - 9+1 дает 10, но теперь нам нужно нести, поэтому мы добавим 1 к следующему столбцу и поместим (9+1)%10 в третий столбец.

Когда ваши цифры растут достаточно большими - больше 9999 в этом примере - тогда вам нужно как-то выделить больше места.

Это, конечно, несколько упрощается, если вы сохраняете числа в обратном порядке.

Реальные реализации используют полные слова, поэтому модуль действительно является некоторой большой степенью двух, но концепция одинаков.

В Кнуте есть очень хороший раздел.