Algorithm 寻找存储大整数的最有效基的算法

Algorithm 寻找存储大整数的最有效基的算法,algorithm,math,storage,bignum,radix,Algorithm,Math,Storage,Bignum,Radix,非常大的整数通常在内存中,而不是像Java或C中的大多数原始“int”或“long”类型那样直接的二进制表示。考虑到这一点,我想知道可以计算: 整数必须达到多少计数,才能更有效地将其存储为具有给定基数的BigInteger(或等效的任意精度算术结构) 哪个基数存储这个大整数的数字最有效 我提到了“效率”;我的意思是,我主要关心这样一个大整数将消耗的空间量,尽管我也有兴趣听到关于处理速度或时间复杂度的任何评论。如果以原始二进制格式存储,整数应该消耗最少的空间(除非它可能是一个小整数,并且数据类型太

非常大的整数通常在内存中,而不是像Java或C中的大多数原始“int”或“long”类型那样直接的二进制表示。考虑到这一点,我想知道可以计算:

  • 整数必须达到多少计数,才能更有效地将其存储为具有给定基数的BigInteger(或等效的任意精度算术结构)

  • 哪个基数存储这个大整数的数字最有效


  • 我提到了“效率”;我的意思是,我主要关心这样一个大整数将消耗的空间量,尽管我也有兴趣听到关于处理速度或时间复杂度的任何评论。

    如果以原始二进制格式存储,整数应该消耗最少的空间(除非它可能是一个小整数,并且数据类型太宽,无法将1存储在128位
    long
    )中。以不同方式存储不会节省任何内存,并用于使处理此类整数更容易

    如果一个字节接一个字节,这将转换为256'小数基-256个可能的值,尽可能多的字节可以容纳

  • BigInt永远不会比硬件直接支持的整数类型更有效。如果您可以使用直接支持的类型,请使用它
  • 硬件最有效地支持的功能,可能是2的幂,或者通常相当于二进制

  • 我看到过使用
    sqrt(max_native_int)
    作为基数的建议,以实现两个数字的本机乘法而不产生溢出。我还看过CPython的
    long
    实现,它也不使用全字表示数字(在32位uint中使用30位,在16位uint中使用15位)。如果还需要负值,则符号编码需要一位!但它是每个数字一位,而不是每个数字一位。@delnan:通常需要使用小于
    sqrt(max_native_int)的一位
    有效地进行平方运算。有关原因的讨论,请参阅。Re 2:您是在谈论使用base
    2^字号
    ?有什么理由吗?正如我在另一个答案的评论中所写的,我熟悉其他方法。如果您想要空间效率,可以存储的最大基数可以做到这一点。(不过,时间完全是另一回事。)