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