3

我遇到了一个有趣的数学问题,需要我对超过 2 81位的数字进行一些算术运算。我知道不可能用一个每个数字都有一个存储单元的系统来表示这么大的数字,但我想知道是否有任何方法可以解决这个问题。

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

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

谢谢o7

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

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

4

3 回答 3

3

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

于 2012-02-08T05:18:57.837 回答
1

超过 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 位。数字基数不会减少所需位数。

于 2012-02-08T05:24:12.333 回答
1

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

于 2012-02-08T04:42:17.567 回答