Как работают реализации BigNums? - PullRequest
10 голосов
/ 02 сентября 2010

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

1 Ответ

11 голосов
/ 02 сентября 2010

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

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

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

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

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

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

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

В Knuth есть очень хороший раздел по этому вопросу.

...