Bei einer positiven ganzen Zahl n und eine Anzahl ein , die n -te tetration of a ist definiert als ein ^ ( ein ^ ( ein ^ (^ ... ein ))), wobei ^ bezeichnet Potenzierung (oder Leistung) und der Ausdruck enthält die nummer a genau n mal.
Mit anderen Worten, Tetration ist rechtsassoziativ iterierte Potenzierung. Für n = 4 und a = 1,6 beträgt die Tetration 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
Die inverse Funktion der tetration mit Bezug auf n ist der Super-Logarithmus . Im vorherigen Beispiel ist 4 der Superlogarithmus von 3,5743 mit "Super-Base" 1,6.
Die Herausforderung
Wenn eine positive ganze Zahl n gegeben ist , finde x so, dass n der Superlogarithmus von sich selbst in der Super-Basis x ist . Das heißt, finden x , so daß x ^ ( x ^ ( x ^ (... ^ x ))) (mit x erscheinenden n mal) gleich n .
Regeln
Programm oder Funktion erlaubt.
Eingabe- und Ausgabeformate sind wie gewohnt flexibel.
Der Algorithmus sollte theoretisch für alle positiven ganzen Zahlen funktionieren. In der Praxis kann die Eingabe aufgrund von Speicher-, Zeit- oder Datentypbeschränkungen auf einen Maximalwert beschränkt sein. Der Code muss jedoch für Eingaben 100
mindestens in weniger als einer Minute funktionieren .
Der Algorithmus sollte theoretisch das Ergebnis mit 0.001
Präzision liefern . In der Praxis kann die Ausgabegenauigkeit aufgrund von akkumulierten Fehlern bei numerischen Berechnungen schlechter sein. Die Ausgabe muss jedoch bis zu 0.001
den angegebenen Testfällen genau sein .
Kürzester Code gewinnt.
Testfälle
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Referenzimplementierung
Hier ist eine Referenzimplementierung in Matlab / Octave (versuchen Sie es bei Ideone ).
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
Dafür N = 10
gibt es result = 1.5085
.
Der folgende Code dient zur Überprüfung der Ausgabegenauigkeit mithilfe von Arithmetik mit variabler Genauigkeit:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
Das gibt:
- Für
x = 1.5085
:y = 10.00173...
- Für
x = 1.5085 + .001
:y = 10.9075
- Denn
x = 1.5085 - .001
es gibty = 9.23248
.
Das 1.5085
ist eine gültige Lösung mit .001
Präzision.
x
konvergieren als n
unendlich geht?