用于存储天文数字的Java数据类型

所以我喜欢考虑像Graham's Number这样的大数字 . 其中一部分偶尔会出现快速增长的功能 .

我总是喜欢尝试这些功能,因为Java是我的goto语言,我需要一种方法来存储非常大的数字 . 我想知道一个快速增长的功能,如:

f(a,b,c) = f(a-1,f(a-1,b-1,c),f(a-1,b-1,c-1))+1 
f(0,b,c) = f(b,b-1,c)+1 
f(0,0,c) = f(c,c,c-1)+1 f(0,0,0) = 1 
f(x) = f(x,x,x)

看看它的增长速度有多快 . 对于一些自然数字,我会看到图表f,看看它的增长速度有多快 . 如果用的格式打印就没问题了

f(0)=... 
f(1)=... 
f(2)=...
...

哪里......真的可以让我对数字的大小(数字的位数,任何符号的近似,......)有所了解 .

无效的数据结构

BigInteger不会削减是因为它存储了一个具有整数精度的数字,因此8GB的ram限制在2 ^ 2 ^ 30左右 .

BigDecimal不会削减它,因为它存储一个BigInteger指数,因此数字大约为2 ^ 2 ^ 2 ^ 30 .

显然,你不能以完美的精度(使用任何方法)存储需要大量内存的数字 . 但我不需要精确的精度我只需要一个非常大的规模 .

我在想一个像以下数据结构:

class Number {
   long base;
   Number power;
}

这将存储大约2↑↑MemorySize(Arrow notation)的数字,但对于像↑↑↑b这样的功能,它最终会达不到 .

但是确实有一些很好的属性来加速计算 . 主要是a ^ b * c ^ d = a ^(bd * alog(c))和alog(c)可以评估为2log(c)/ 2log(a)或d / b(假设指数总是更新)所以基数大约是2)所以你得到一个^ b * c ^ d~ = a ^(bd²/ b),这对于更高阶的运算来说要快得多(虽然我忘了确切的公式)

您可以设计一种方法将数字存储为* 2↑↑b,但最终将达不到 .

有什么好的解决方案吗?

最好的选择是将数字转换为符号,你知道你不会像Conway chained arrow notation那样耗尽比fω²(n)慢的函数吗?

你怎么会添加这样的数字呢?

或者您应该将数字直接存储为fast-growing hierarchy的序数和参数?

是否有图书馆或 class 做这样的事情?真的比BigDecimal更好(并且更快)的任何东西都已经是一个巨大的帮助 .

回答(0)