在最近回答涉及阿克曼函数的问题后,其中一部分涉及用于计算数字系数的函数。这让我深思,是否有更有效的方法来做到这一点。我自己做了一些测试,但主要受限于5^3 = 5^3125这样的数字大概是10^2,这意味着5^3125 = 10 ^(3125 * 2/3)约2000位数字。有没有一个有效的tetration实施?
该函数不借给本身分而治之由于幂是如何完成的性质的方法,即:
2 ^^ 5 = 2 ^(2 ^(2 ^(2^2 ))))= 2 ^(2 ^(2^4))= 2 ^(2^16)= 2^65536 = = 10 ^(65536 * 3/10)因此大约20k位...
问题的本质,因为它从电源树的顶端开始,并且降低了我的工作量,因此我觉得它是阶乘因素。一个快速的功率算法可以用来明显地进行幂运算,但是我一直无法找到缩小指数运算次数的方法。
在任何情况下,目前还不清楚我谈论这里的wiki article,本质上不过是迭代幂次:
一个^^ B = A^A^A^...... A,B三次,然后开始在电源树的顶端元素上取幂,然后继续工作。
目前我使用的是(虽然我使用的红宝石版本,如果我实际上希望值)的算法:
long int Tetration(int number, int tetrate)
{
long int product=1;
if(tetrate==0)
return product;
product=number;
while(tetrate>1)
{
product=FastPower(number,product);
tetrate--;
}
return product;
}
任何想法,将不胜感激。
我认为很多取决于你需要什么样的数字表示。你需要精确的整数表示吗?或者是近似数值(浮点)表示是否足够? – RBarryYoung 2009-06-08 06:52:26
出于好奇,这纯粹是一个问题,所以我会好奇你怎么才能用浮点表示法编写更高效的算法。 – JSchlather 2009-06-08 14:48:40
我确实研究过这个,但很快就意识到整数数字长度问题(Dave下面解释)也会折磨任何tetration函数输出的指数,只是在一个递归更少的情况下。基本上,浮点可以处理指数乘积,因为它是LOG格式的表示。国际海事组织,为了有效地处理tetration产品,你需要开发一个基于超级日志的格式。这听起来很难但很有趣,甚至可能是有价值的论文(无论如何)。 – RBarryYoung 2009-06-13 00:40:36