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

时间:2017-08-24 18:46:11

标签: java data-structures largenumber large-data

所以我喜欢考虑像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 ^(b + d * alog(c)) 和alog(c)可以评估为2log(c)/ 2log(a)或d / b(假设指数总是更新,因此基数约为2) 所以你得到一个^ b * c ^ d~ = a ^(b +d²/ b),这要快得多 这也适用于高阶操作(虽然我忘记了确切的公式)

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

有什么好的解决方案吗?

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

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

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

是否有类似这样的图书馆或课程?真的比BigDecimal更好(并且更快)的任何东西都已经是一个巨大的帮助。

0 个答案:

没有答案