所以我喜欢考虑像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更好(并且更快)的任何东西都已经是一个巨大的帮助。