TL; DR : максимальное число, которое может быть представлено, примерно равно:
3.079 x 10^22212093154093428519
Я полагаю, что ничто полезное не нуждается в таком большом числе, чтобы быть представленным.Вы можете быть уверены, что num_bigint
выполнит эту работу, независимо от того, какое использование вы им пользуетесь.
Теоретически нет ограничения на размер больших целых чисел num
, поскольку документация ничего не говорит об этом (версия 0.1.44
) .Однако существует конкретный предел, который мы можем рассчитать:
BigUint
- это Vec<BigDigit>
, а BigDigit
- это u32
.Насколько я знаю, Rust не определяет максимальный размер для Vec
, но, поскольку максимально возможный выделенный размер равен isize::MAX
, максимальное число BigDigit
aka u32
равно:
MAX_LEN = isize::MAX / sizeof(u32)
С помощью этой информации мы можем сделать вывод, что максимум num::BigUint
(и num::BigInt
также) в текущей реализации:
(u32::MAX + 1) ^ MAX_LEN - 1 = 2^32^MAX_LEN - 1
Чтобы иметьэту формулу, мы имитируем способ, которым мы вычисляем u8::MAX
, например:
bit::MAX
is 1
, - длина равна 8,
- таким образом, максимум равен
(bit::MAX + 1) ^ 8 - 1 = 255
Вот полная демонстрация по формуле, приведенной в документации num
:
a + b * big_digit::BASE + c * big_digit::BASE^2 + ...
Если мы берем максимумзначение a == b == c == u32::MAX
.Давайте назовем это a
.Назовем big_digit::BASE
b
для удобства.Таким образом, максимальное число:
sum(a * b^n) where n is from 0 to (MAX_LEN - 1)
если мы разложить на множители, мы получим:
a * sum(b^n) where n is from 0 to (MAX_LEN - 1)
Общая формула суммы x^n
равна (x^(n + 1) - 1) / (x - 1)
.Итак, поскольку n
равно MAX_LEN - 1
, результат:
a * (b^(MAX_LEN - 1 + 1) - 1) / (b - 1)
Мы заменяем a и b на правильное значение, и наибольшее представимое число:
u32::MAX * (2^32^MAX_LEN - 1) / (2^32 - 1)
u32::MAX
равно 2^32 - 1
, поэтому это можно упростить до:
2^32^MAX_LEN - 1