解决电力塔

时间:2011-01-14 23:02:09

标签: math wolfram-mathematica

a=2^Power[10^6, 10^9] 3^Power[4^9, 7^5]
TwoTower[n_] := Nest[2^# &, 1, n]

n最小的TwoTower[n]>a是多少?这个question在Quora上有一个纸笔回答,有没有办法在这里使用Mathematica?

1 个答案:

答案 0 :(得分:3)

只是一些想法(没仔细检查)。如果我们按照该链接中的建议并开始记录日志(基数2),首先看来显而易见的是我们可以安全地忘记前因(3的幂),因为

Log[Log[a*b]] = Log[Log[a]+Log[b]] = Log[Log[a]]+Log[1+Log[b]/Log[a]] = 
= Log[Log[a]] + Log[b]/Log[a] + O((Log[b]/Log[a])^2), Log[b]<<Log[a]

其中a是2的幂,b是3的幂。然后,我们可以只关注2的幂。如果我们定义log的版本和power

Clear[log2,power];
log2[2] = 1;
log2[1] = 0;
log2[a_*b_] := log2[a] + log2[b];
log2[a_^b_] := b*log2[a];
log2[power[a_, b_]] := b*log2[a]; 

然后以下似乎给出了答案:

In[62]:= 
    Length[NestWhileList[N[Log[2, #]] &,log2[log2[log2[ 2^power[10^6, 10^9]]]] /. 
           log2 -> (N[Log[2, #]]&), # > 1 &]] - 1 + 3

Out[62]= 7

由于NestWhile的工作方式(最后一个元素已经违反条件),我们减去1,并添加3,因为我们在进入NestWhileList之前已经应用了log2 3次。如果没有在网站上注册,我无法阅读该链接中的所有评论,因此我不知道他们的答案或答案是正确的。

编辑:

我发现上述解决方案可以更优雅地表达,因此根本不需要人工交互:

ClearAll[log2, power];
log2[2] = 1;
log2[1] = 0;
log2[a_*b_] := log2[a] + log2[b];
log2[(power | Power)[a_, b_]] := b*log2[a];
log2[x : (_Integer | _Real)] := N[Log[2, x]];
power[a_, b_] :=
   With[{eval = Quiet[Check[Power[a, b], $Failed]]},
     eval /; (eval =!= $Failed)]

然后,解决方案本身看起来更容易一些:

In[8]:=Length[NestWhileList[log2,2^power[10^6, 10^9], ! FreeQ[#, power] || # > 1 &]] - 1

Out[8] = 7