Rust中BigInt或BigUint的大小是否有限制?

时间:2018-05-24 08:28:00

标签: rust biginteger

Rust的BigInt包装箱中BigUintnum的尺寸没有限制吗?我看到在Java中,它的长度受整数Integer.MAX_VALUE的上限限制,因为它存储为int的数组。

我确实通过了相关文档,但无法从

中推断出我的答案
  

BigUint类型的值BigUint {data:vec!(a,b,c)}代表一个   number(a + b * big_digit :: BASE + c * big_digit :: BASE ^ 2)。

big_digit::BASE被定义为

pub const BASE: DoubleBigDigit = 1 << BITS

BITS反过来是32

BigInt在内部表示为(a + b * 64 + c * 64^2)吗?

1 个答案:

答案 0 :(得分:8)

TL; DR :可以表示的最大数量大致为:

3.079 x 10^22212093154093428519

我认为没有什么有用的东西可以代表这么大的数字。您可以确定num_bigint将完成这项工作,无论您使用它的是什么。

理论上,the documentation says nothing about it (version 0.1.44)以来num大整数的大小没有限制。但是,我们可以计算出具体的限制:

BigUint is a Vec<BigDigit>BigDigit is an u32。据我所知,Rust没有为Vec定义最大大小,但自the maximum possible allocated size is isize::MAX起,BigDigit又称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::MAX1
  • 长度为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)

The general formula of the sum of x^n is (x^(n + 1) - 1) / (x - 1)。因此,因为nMAX_LEN - 1,结果是:

a * (b^(MAX_LEN - 1 + 1) - 1) / (b - 1)

我们用正确的值替换a和b,最大的可表示数字是:

u32::MAX * (2^32^MAX_LEN - 1) / (2^32 - 1)

u32::MAX2^32 - 1,因此可以简化为:

2^32^MAX_LEN - 1