Rust的BigInt
包装箱中BigUint
或num
的尺寸没有限制吗?我看到在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)
吗?
答案 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::MAX
是1
,(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)
。因此,因为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