Алгоритм поиска наиболее эффективной базы для хранения больших целых чисел

Очень большие целые числа часто хранятся в памяти как массивы цифр переменной длины, в отличие от простого двоичное представление, как в случае с большинством примитивных типов «int» или «long», как в Java или C. Имея это в виду, мне было бы интересно узнать алгоритм (ы), которые могут вычислять:

  1. При какого числа должно достичь целое число, прежде чем станет более эффективным хранить его как BigInteger (или эквивалентную арифметическую конструкцию произвольной точности) с заданной системой счисления для цифр целого числа;

  2. Какая система счисления наиболее эффективна для хранения цифр этого большого целого числа.

Я упомянул «эффективность»; под этим я подразумеваю, что меня в основном беспокоит количество пространства, которое будет потреблять такой BigInteger, хотя мне также было бы интересно услышать любые комментарии о скорости обработки или временной сложности.


person Doug Thompson    schedule 19.01.2013    source источник
comment
Если вам нужна эффективность использования пространства, для этого подойдет самая большая система счисления, которую можно сохранить. (Однако время — это совсем другое.)   -  person Ry-♦    schedule 19.01.2013


Ответы (2)


Целое число должно занимать наименьшее количество места, если оно хранится в необработанном двоичном формате (если только оно не является небольшим целым числом, а тип данных слишком широк для него — для хранения 1 из 128 бит long long). Хранение по-другому не экономит память и используется для облегчения работы с такими целыми числами.

Если байт за байтом, это преобразуется в 256-десятичную систему счисления - 256 возможных значений, столько, сколько может вместить байт.

person Audrius Meskauskas    schedule 19.01.2013
comment
Я видел предложения использовать sqrt(max_native_int) в качестве базы, чтобы включить собственное умножение двух цифр без переполнения. - person ; 19.01.2013
comment
Я также только что посмотрел на реализацию CPython long, и она также не использует полные слова для цифр (использует 30 бит в 32-битном uint или 15 в 16-битном uint). - person ; 19.01.2013
comment
Один бит требуется для кодирования знака, если вам также нужны отрицательные значения! - person Audrius Meskauskas; 19.01.2013
comment
Но это один бит на число, а не один бит на цифру. - person ; 19.01.2013
comment
@delnan: часто желательно использовать на один бит меньше sqrt(max_native_int) для эффективного возведения в квадрат. См. libTom PDF, чтобы узнать, почему. - person President James K. Polk; 20.01.2013

  1. BigInt никогда не бывает более эффективным, чем один из целочисленных типов, напрямую поддерживаемых оборудованием. Если вы можете использовать то, что поддерживается напрямую, используйте это.
  2. Что наиболее эффективно поддерживается аппаратным обеспечением, вероятно, степень двойки или, что часто эквивалентно, двоичный код.
person Alexey Frunze    schedule 19.01.2013
comment
Re 2: Вы говорите об использовании базы 2^wordsize? - person ; 19.01.2013
comment
Любые причины для этого? Как я уже писал в комментарии к другому ответу, я знаком с другими подходами. - person ; 19.01.2013