只是一些想法(没有仔细检查)。如果我们遵循该链接中的建议并开始记录日志(以 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]
where a
是 2 的幂并且b
是 3 的幂。那么,我们可以只关注 2 的幂。如果我们定义我们的版本log
and 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 次。如果没有在网站上注册,我无法阅读该链接中的所有评论,因此我不知道他们的答案或正确答案是什么。
Edit:
我发现上面的解决方案可以表达得更优雅一些,这样就根本不需要人类交互:
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