Просто некоторые мысли (не проверял тщательно).Если мы последуем предложению в этой ссылке и начнем брать логи (база 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
Мы вычитаем 1 из-за того, как работает NestWhile (последний элемент уже нарушает условие), и добавляем 3, потому что мы уже применили log2 3 раза, довходя в NestWhileList.Я не смог прочитать все комментарии по этой ссылке, не зарегистрировавшись на сайте, поэтому я не знаю их ответа или каков правильный ответ.
Редактировать:
Это произошлоЯ считаю, что вышеупомянутое решение может быть выражено немного более элегантно, так что никакого человеческого взаимодействия вообще не требуется:
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