代码之家  ›  专栏  ›  技术社区  ›  Rajeev Ranjan

铁锈中大的或大的尺寸有限制吗?

  •  5
  • Rajeev Ranjan  · 技术社区  · 6 年前

    A的大小没有限制吗 BigInt BigUint 来自 num 铁锈板条箱?我在里面看到的 Java 其长度以整数的上限为界 Integer.MAX_VALUE 当它存储为 int .

    我确实查阅了文件,但不能从中推断出我的答案。

    bigunt类型值bigunt数据:vec!(a,b,c)表示a 数字(A+B*大\数字::基础+C*大\数字::基础^2)。

    big_digit::BASE 被定义为

    pub const BASE: DoubleBigDigit = 1 << BITS
    

    BITS 反过来是32

    那么,bigint被表示为 (a + b * 64 + c * 64^2) 内部?

    1 回复  |  直到 6 年前
        1
  •  8
  •   Boiethios    6 年前

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

    3.079 x 10^22212093154093428519
    

    我想没有什么有用的东西需要这么大的数字来表示。你可以确定 num_bigint 不管你用它做什么,都会做这个工作。


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

    BigUint is a Vec<BigDigit> BigDigit is an u32 . 据我所知,生锈并不能定义 Vec ,但从那以后 the maximum possible allocated size is isize::MAX ,最大 双位数字 阿卡 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 ,
    • 长度为8,
    • 所以最大值是 (bit::MAX + 1) ^ 8 - 1 = 255

    这是由下式给出的完整证明。 号码 文档:

    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