Math 表示超过2^81位数的数字有哪些选项?

Math 表示超过2^81位数的数字有哪些选项?,math,base,arbitrary-precision,largenumber,Math,Base,Arbitrary Precision,Largenumber,我遇到了一个有趣的数学问题,需要我对超过281位的数字进行一些艺术计算。我知道,在一个每个数字都有一个存储单元的系统中,不可能表示这么大的数字,但我想知道是否有办法解决这个问题 我最初的想法是使用非常大的基数,而不是基数10(十进制)。经过一番思考后,我相信(但无法验证)最佳基数是位数的平方根(因此对于281位数的数字,您将使用基数240ish),这是一种改进,但它不能很好地扩展,仍然不实用 那么我有什么选择呢?我知道有很多任意精度的库,但是有没有这样的规模来支持这种算法呢 谢谢你 编辑:经过进

我遇到了一个有趣的数学问题,需要我对超过281位的数字进行一些艺术计算。我知道,在一个每个数字都有一个存储单元的系统中,不可能表示这么大的数字,但我想知道是否有办法解决这个问题


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

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

谢谢你

编辑:经过进一步思考,我意识到我可能完全错误地认为“最佳基数是位数的平方根”,但a)这就是我问的原因,b)我太累了,记不起我最初的假设推理


编辑2:1000000以10为基数=F4240以16为基数=364110以8为基数。在基数16中,需要20位来存储基数8中的数字,而在基数8中,则需要21位。因此,通过增加基数,似乎可以确定所需的总位数。(同样,这可能是错误的)

我认为您应该使用。您将失去精度,但您无法在不丢失精度的情况下存储如此大的数字,因为存储2^81位需要超过10^24位(约万亿TB),这比您现在拥有的要多得多。

这实际上是一个压缩问题,假装是一个算术问题。你能用这么大的数字做什么完全取决于它的大小。如果你需要对这么大的数字进行计算,很明显,它不会以2^81位小数的形式出现;在这种情况下,Kolmogorov的复杂度太高,你甚至无法在太阳出来之前完成输入的读取。处理此类数字的最佳方法是通过延迟求值和类似语言提供的符号理性类型。这样,一个程序就可以回答一些关于数字计算结果的问题,而不必将所有这些数字都写到内存中

超过2^81位的

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

这是假设你想要每一个数字,并且数据是不可压缩的

可以尝试压缩将数据存储在某种稀疏数组中的数据,这种稀疏数组只为非零元素分配内存,但这不能保证数据适合任何位置

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

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

1000000以10为基数


不管你的基数是多少,正数至少需要一层(log2(number))+1位来存储。如果base不是2,则需要超过floor(log2(number))+1位来存储它。数字基数不会减少所需的位数。

您将对这些数字执行什么操作?@templatetypedef只是简单的加减和乘法/除法(是的,我意识到即使使用FFT,我也只会稍微慢一些)“最佳基数是位数的平方根”最适合什么?无论您使用的基数是多少,您需要存储的信息量都是相同的。2^81位十进制数字需要大约2^269位才能准确表示。我不认为有任何捷径,除非你知道一些重要的数字部分将为零。关于编辑2,无论你用基数8还是基数16写出数字,都不会影响它实际占用多少位,因为它们都以相同的方式转换回二进制,二进制是这些数字的实际存储方式。十六进制表示法变为
1110100 0010 0100 0000
,八进制表示法变为
011 110 100 001 000
。后者有一个前导零,因为您选择了如何对这些位进行分组,但前导零不需要存储。您从哪里获得10^24位?@Letseatlunch 24是log(2^84),实际上是25,但仍然大于24。我刚刚将2^84改为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。