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?
答案 0 :(得分: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