代码的递归取幂

时间:2014-08-23 05:23:04

标签: performance math numbers logic exponent

我有一个数学问题,在olymipad somehwere中有特色,我试图在代码中实现它的问题。问题是,我无法弄清楚这个问题的逻辑。

问题是,

9 ^(9 ^(9 ^(9 ^ ...... 1001次......)))。答案的最后5位是什么?

如果有人能告诉我怎么做,我会很高兴。请记住,由于我需要在代码中实现这一点,因此采用较少步骤并因此在复杂性方面更优化的解决方案对我有利。

但是,如果你有任何方法可以找到正确的解决方案,我也想知道这一点,因为我还没有能够理解这个问题。

1 个答案:

答案 0 :(得分:4)

看起来其他一些答案计算9 ^ 1001。这是提出的问题。这对奥林匹克运动会问题来说太简单了。

定义T(a,n)使得T(a,1)= a,并且T(a,n)= a ^ T(a,n-1)。这称为tetration。问题要求T(9,1001)mod 100,000。

要解决实际问题,使用哪种模数并不明显。 T(a,n)mod m并不总是T(a,n mod m)mod m。例如,T(2,3)= 2 ^ 2 ^ 2 = 2 ^ 4 = 16.T(2,4)= 2 ^ 16 = 65536. Mod 10,你不能只计算T(2,3) mod 10 = 6然后2 ^ 6 mod 10 = 64 mod 10 = 4.T(2,4)= 65536的最后一位是6,而不是4.

然而,你可以计算出9 ^ 2500 = 1 mod 100000,所以9 ^ 100000 = 1 mod 100000。 (通过中国剩余定理,你可以分析9 mod 2 ^ 5和5 ^ 5的幂。)所以,你只需要跟踪T(9,n)mod 2500或100000的值来确定T(9, 1001)mod 100000.计算t = T(9,1000)mod 2500,然后计算powermod(9,t,100000)。

实际上,将n映射到9 ^ n mod 100000的函数快速稳定到45289处的固定点.9 ^ 9 mod 2500是489,9 ^ 489 mod 2500是2289,9 ^ 2289 mod 2500是289 ,9 ^ 289 mod 2500再次是289。由于9 ^ 289 mod 100000为45289,T(9,4),T(9,5),...,T(9,1001)均以45289结尾。


编辑:让我充实Egor Skriptunoff的评论。 9 mod 10 ^ 5周期的幂,周期除以phi(10 ^ 5)= 40000,其中phi是Euler Totient function。所以,我们只需要确定T(9,1000)mod 40000. 9 mod 40000周期的功率,周期除以phi(40000)= 16000,所以我们只需要找到T(9,999)mod 16000等等。因为phi迭代10 ^ 5上的15次是1次,我们知道9 mod mod ^ 15(10 ^ 5)的任何幂的值,因此对于任何更大的T(9,16)= T(9,n)mod 10 ^ 5 ñ