【问题标题】:Algorithm to find most efficient base to store large integer寻找存储大整数的最有效基的算法
【发布时间】:2013-01-19 18:07:02
【问题描述】:

非常大的整数通常在内存中stored as variable-length arrays of digits,而不是像 Java 或 C 中的大多数原始“int”或“long”类型那样的简单二进制表示。考虑到这一点,我会有兴趣了解可以计算的算法:

  1. what count 整数必须达到,然后才能更有效地将其存储为 BigInteger(或等效的任意精度算术构造),其中整数的数字具有给定的基数;

  2. 哪个基数最有效地存储这个大整数的数字。

我提到了“效率”;这样,我的意思是我主要关心 BigInteger 将消耗的 空间 量,尽管我也有兴趣了解任何有关处理速度或时间复杂度的 cmets。

【问题讨论】:

  • 如果你想要空间效率,可以存储的最大基数就可以了。 (不过,时间完全是另一回事。)

标签: algorithm math storage bignum radix


【解决方案1】:

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

如果逐个字节,这将转换为 256'ecimal radix - 256 个可能的值,尽可能多的字节可以容纳。

【讨论】:

  • 我看到了使用 sqrt(max_native_int) 作为基数的建议,以实现两位数的本机乘法而不会溢出。
  • 我也刚刚查看了 CPython 的 long 实现,它也不使用完整的数字表示数字(在 32 位 uint 中使用 30 位,在 16 位 uint 中使用 15) .
  • 如果您还需要负值,则需要一位来编码符号!
  • 但它是每个数字一位,而不是每个数字一位。
  • @delnan:通常希望使用比sqrt(max_native_int) 少一位来有效地进行平方。有关原因的讨论,请参阅libTom PDF
【解决方案2】:
  1. BigInt 永远不会比硬件直接支持的整数类型之一更有效。如果您可以直接使用受支持的内容,请使用它。
  2. 硬件最有效地支持什么,可能是 2 的幂,或者通常等效的二进制。

【讨论】:

  • Re 2:你说的是使用 base 2^wordsize
  • 有什么理由吗?正如我已经在对另一个答案的评论中写的那样,我熟悉其他方法。
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2017-01-28
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多