我遇到了一个有趣的数学问题,需要我用数字超过2个 81 数字进行算术运算。我知道用一个系统代表一个这么大的数字是不可能的,每个数字都有一个内存单元,但是想知道是否有任何解决方法。
我最初的想法是使用一个非常大的基数而不是基数10(十进制)。经过一番思考后,我相信(但无法验证)最佳基数将是数字位数的平方根(因此,对于具有2 81 数字的数字,您将使用基数2 40 ish)这是一种改进,但是不能很好地扩展,但仍然不是很实用。
那么我有什么选择?我知道许多任意精度库,但有没有任何规模来支持这种算术?
谢谢o7
编辑:在思考了一些之后,我意识到我可能完全错误的“最佳基数将是数字位数的平方根”,但a)这就是为什么我要求和b)我太累了,不记得我最初的推理假设。编辑2:基数10中的1000,000 =基数16中的F4240 =基数8中的364110.在基数16中,您需要20位来存储您需要的基数8中的数字21所以看起来通过增加基数规定所需的总位数。 (这可能是错的)
答案 0 :(得分:3)
这实际上是一个假装成算术问题的压缩问题。如此大的数字可以完全取决于它的Kolmogorov complexity。如果你需要对如此大的数字进行计算,那么它显然不会以2 ^ 81个十进制数字到达;在这种情况下,Kolmogorov的复杂性太高了,你甚至无法在太阳出来之前读完输入。处理这样一个数字的最好方法是通过延迟评估和像Scheme这样的语言提供的符号理性类型。通过这种方式,程序可以回答有关数字计算结果的一些问题,而无需将所有这些数字写入内存。
答案 1 :(得分:1)
我认为你应该使用scientific notation。你将失去精确度,但你不能存储大而不失精度的数字,因为存储2 ^ 81位数将需要超过10 ^ 24位(大约千亿亿兆字节),这是你现在可以拥有的更多。
答案 2 :(得分:1)
超过2 ^ 81位数
具有2 ^ 81位的非小数,将需要3 * 10 ^ 11 太字节的数据。每个号码。
假设您希望每个数字和数据都不可压缩。
你可以尝试压缩存储在某种稀疏数组中的数据,该稀疏数组仅为非零元素分配内存,但这并不能保证数据适合任何地方。
这种精确度在现代硬件上无用且无法处理。 2 ^ 81位将花费大量时间来简单地遍历数字(9584万亿年,假设1字节需要1毫秒),更不用说乘法/除法。我也想不出任何需要精确度的问题。
您唯一的选择是将精度降低到前N个有效数字并使用浮点数。由于数据不适合双倍,因此您必须使用具有浮点支持的bignum库,它提供极大的浮点数。由于您可以用位表示2 ^ 81(指数),因此可以使用非常大的浮点存储数字的开头。
十分之一的1000,000
无论您的基数如何,正数至少需要下限(log2(数字))+ 1位来存储它。如果base不是2,那么将需要多于floor(log2(number))+ 1位来存储它。数字库不会减少所需的位数。