【问题标题】:what options are there for representing numbers with more than 2^81 digits?有哪些选项可以表示超过 2^81 位的数字?
【发布时间】:2012-02-29 13:33:37
【问题描述】:

我遇到了一个有趣的数学问题,这将需要我做一些曲法,其中数字有超过2个 81 sup>数字。我知道它不可能将这个数字与每个数字有一个存储器单元的系统来表示一个数字,但是想知道是否有任何方法。

我最初的想法是使用非常大的基数而不是基数 10(十进制)。经过一番思考,我相信(但无法验证)最佳基数将是位数的平方根(因此对于具有 281 位数的数字,您将使用基数 240ish),这是一个改进,但不能很好地扩展并且仍然不是很实用。

那么我有什么选择?我知道许多任意精度库,但是有没有支持这种算法的规模?

谢谢o7

编辑:在思考了更多之后,我意识到我可能完全错误地认为“最佳基数将是位数的平方根”但是 a)这就是我问的原因 b)我太累了,无法记住我最初的推理假设。

编辑 2:以 10 为基数的 1000,000 = 以 16 为基数的 F4240 = 以 8 为基数的 364110。在以 16 为基数的情况下,您需要 20 位来存储以 8 为基数的数字,您需要 21,所以看起来通过增加基数您规定所需的总位数。 (同样这可能是错误的)

【问题讨论】:

  • 您将对这些数字执行哪些操作?
  • @templatetypedef 只是简单的加法/减法和乘法/除法(是的,我意识到即使使用 FFT 我也只会比线性慢一点)
  • “最佳基数将是位数的平方根”对于什么是最佳的?无论您使用何种基础,您需要存储的信息量都是相同的。
  • 2^81 个十进制数字需要大约 2^269 位才能准确表示。我不认为有任何捷径,除非您知道数字的某些重要部分将为零。
  • 关于编辑 2,无论您使用基数 8 还是基数 16 写出数字都不会影响它实际占用的位数,因为它们都以相同的方式转换回二进制,并且二进制是这些数字的实际存储方式。十六进制表示变为1111 0100 0010 0100 0000,八进制表示变为011 110 100 001 001 000 000。后者有一个前导零,因为您选择对这些位进行分组,但不需要存储前导零。

标签: math base arbitrary-precision largenumber


【解决方案1】:

这实际上是一个伪装成算术问题的压缩问题。你能用这么大的数字做什么完全取决于它的Kolmogorov complexity。如果您需要对如此大的数字进行计算,那么它显然不会以 2^81 十进制数字的形式出现;在这种情况下,Kolmogorov 的复杂性太高了,您甚至无法在太阳熄灭之前完成读取输入。处理这样一个数字的最好方法是通过像Scheme 这样的语言提供的延迟评估和符号理性类型。通过这种方式,程序可能能够回答一些关于数字计算结果的问题,而无需实际将所有这些数字写到内存中。

【讨论】:

    【解决方案2】:

    我认为你应该只使用scientific notation。你会失去精度,但你不能存储这么大的数字而不失去精度,因为存储 2^81 位将需要超过 10^24 位(约千亿兆兆字节),这比你现在可以拥有的要多得多。

    【讨论】:

    • 你从哪里得到 10^24 位?
    • @Letseatlunch 24 是 log(2^84),实际上是 25,但仍然超过 24。我只是将 2^84 更改为 base 10 表示法。
    • @Sunny88:要存储 2^81 个十进制数字,您需要 2^269 位。要存储 2^81 位,您需要 2^81 位,即使它们可以用 10^24 个十进制数字表示。数字占用不止一位。请记住这一点。
    • @SigTerm 存储 2^81 个十进制数字不需要 2^269 位。每个数字最多可以存储 4 位,因此该数字最多为 4*(2^81),即 2^83,而不是 2^269。
    【解决方案3】:

    超过 2^81 位的数字

    2^81 位的非小数,将占用 3*10^11 TB 的数据。每个数字。

    这是假设您想要每个数字并且数据不可压缩。

    可以尝试压缩将数据存储在某种稀疏数组中,该数组仅为非零元素分配内存,但这并不能保证数据适合任何地方。

    这样的精度在现代硬件上是无用的,也无法处理。 2^81 位将花费大量时间来简单地遍历数字(9584 万亿年,假设 1 个字节需要 1 毫秒),更不用说乘法/除法了。我也想不出任何需要如此精确的问题。

    您唯一的选择是将精度降低到前 N 个有效数字并使用浮点数。由于数据不适合双精度,因此您必须使用具有浮点支持的 bignum 库,它提供了非常大的浮点数。由于您可以以位表示 2^81(指数),因此您可以使用非常大的浮点数存储数字的开头。

    1000,000 以十为基数

    不管你的基数如何,正数至少需要 floor(log2(number))+1 位来存储它。如果 base 不是 2,那么存储它需要多于 floor(log2(number))+1 位。数字基数不会减少所需位数。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2012-03-23
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多