З огляду на позитивне ціле число п і число А , тим п -й тетраци з визначається як ^ ( ^ ( ^ (... ^ ))), де ^ означає зведення в ступінь (або потужність) і вираз містить число рівно п раз.
Іншими словами, тетрація є право-асоціативною ітераційною експоненцією. Для n = 4 та a = 1.6 тетрація дорівнює 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,55743.
Зворотна функція тетрації по відношенню до n є супер-логарифмом . У попередньому прикладі 4 - це супер логарифм 3,55743 із "супер-базою" 1.6.
Змагання
Давши додатне ціле число n , знайдіть x таким, що n є супер-логарифмом самого себе в супер-базовому x . Тобто знайдіть x таким, що x ^ ( x ^ ( x ^ (... ^ x )))) (з x з'являється n разів) дорівнює n .
Правила
Програма або функція дозволена.
Формати введення та виведення є гнучкими, як зазвичай.
Алгоритм повинен теоретично працювати для всіх натуральних чисел. На практиці введення може бути обмежене максимальним значенням через обмеження пам'яті, часу чи типу даних. Однак код повинен працювати на введення 100
не менше ніж за хвилину.
Алгоритм повинен теоретично дати результат з 0.001
точністю. На практиці точність виводу може бути гіршою через накопичені помилки в числових обчисленнях. Однак вихід повинен бути точним до 0.001
вказаних тестових випадків.
Найкоротший код виграє.
Тестові справи
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Довідкова реалізація
Ось посилання на реалізацію в Matlab / Octave (спробуйте в 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)
За N = 10
це дає result = 1.5085
.
Наступний код - це перевірка точності на виході з використанням арифметики змінної точності:
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
Це дає:
- Для
x = 1.5085
:y = 10.00173...
- Для
x = 1.5085 + .001
:y = 10.9075
- Бо
x = 1.5085 - .001
даєy = 9.23248
.
так 1.5085
це правильне рішення з .001
точністю.
x
сходяться у міру n
наближення до нескінченності?