Pozytywny całkowitą n i numer A , tym n -tego tetracja z jest zdefiniowany jako ^ ( ^ ( ^ (... ^ ))), w którym ^ oznacza potęgowanie (lub mocy), a ekspresja zawiera liczba dokładnie n razy.
Innymi słowy, tetracja jest iteracją potęgową iteracyjną. Dla n = 4 i a = 1,6 tetracja wynosi 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
Odwrotną funkcją tetracji w stosunku do n jest superlogarytm . W poprzednim przykładzie 4 jest super-logarytmem 3,5743 z „super-bazą” 1.6.
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą n , znajdź x tak, że n jest super-logarytmem samego siebie w super-podstawie x . Oznacza to, że znajdź x taki, że x ^ ( x ^ ( x ^ (... ^ x )))) ( x pojawia się n razy) równa się n .
Zasady
Program lub funkcja dozwolona.
Formaty wejściowe i wyjściowe są jak zwykle elastyczne.
Algorytm powinien teoretycznie działać dla wszystkich liczb całkowitych dodatnich. W praktyce dane wejściowe mogą być ograniczone do wartości maksymalnej z powodu ograniczeń pamięci, czasu lub typu danych. Kod musi jednak działać dla danych wejściowych trwających 100
co najmniej krócej niż minutę.
Algorytm powinien teoretycznie dać wynik z 0.001
precyzją. W praktyce dokładność wyjściowa może być gorsza z powodu skumulowanych błędów w obliczeniach numerycznych. Jednak dane wyjściowe muszą być dokładne do 0.001
wskazanych przypadków testowych.
Najkrótszy kod wygrywa.
Przypadki testowe
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Realizacja referencyjna
Oto implementacja referencyjna w Matlab / Octave (wypróbuj w 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)
Do N = 10
tego daje result = 1.5085
.
Poniższy kod jest sprawdzeniem dokładności wyjściowej przy użyciu arytmetyki o zmiennej precyzji:
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
To daje:
- Dla
x = 1.5085
:y = 10.00173...
- Dla
x = 1.5085 + .001
:y = 10.9075
- Bo
x = 1.5085 - .001
dajey = 9.23248
.
więc 1.5085
jest prawidłowym rozwiązaniem z .001
precyzją.
x
zbiegają się jak n
podejść nieskończoność?