【问题标题】:Is there a limit to the size of a BigInt or BigUint in Rust?Rust 中 BigInt 或 BigUint 的大小是否有限制?
【发布时间】:2018-05-24 08:28:00
【问题描述】:

Rust 中 num 板条箱中的 BigIntBigUint 的大小是否没有限制?我看到在Java 中,它的长度受到整数Integer.MAX_VALUE 的上限的限制,因为它存储为int 的数组。

我确实浏览了它的文档,但无法真正从中推断出我的答案

一个 BigUint 类型的值 BigUint { data: vec!(a, b, c) } 表示一个 数字(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)

【问题讨论】:

  • 无论如何,这是一个理论上的限制,因为我看不到像 2^u64::MAX 这样大的数字的任何用法
  • BigInt 被表示为(a + b * 2^32 + c * (2^32)^2),所以限制相当大

标签: rust biginteger


【解决方案1】:

TL;DR:可以表示的最大数量大概是:

3.079 x 10^22212093154093428519

我想没有什么有用的东西需要这么大的数字来表示。您可以确定num_bigint 可以胜任这项工作,无论您有什么用途。


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

BigUint is a Vec&lt;BigDigit&gt;BigDigit is an u32。据我所知,Rust 没有定义 Vec 的最大大小,但由于 the maximum possible allocated size is isize::MAXBigDigit 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::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

【讨论】:

  • 但是(a + b * big_digit::BASE + c * big_digit::BASE^2) @Boiethios 呢?这不是按照文档设置上限吗?
  • @RajeevRanjan 关于最大值的文档是隐含的:它取决于 Vec 的最大大小。
  • @RajeevRanjan 没有什么可以阻止您使用BigUint { data: vec!(a, b, c, d) } 并获取(a + b * big_digit::BASE + c * big_digit::BASE^2 + d * big_digit::BASE^3)。为什么要停在 4 个元素上?实际限制将受您拥有的任何内存限制。
  • 实际上Rust可以分配的最大大小是isize::MAX。见stackoverflow.com/questions/32324794/…
  • @trentcl 我不确定你在说什么,但我犯了一个错误。我编辑给出了完整的微积分,也许我错了,但我认为它更准确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2018-06-24
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多