Учитывая положительное целое число п и число А , тем п -й тетрация из определяется как ^ ( ^ ( ^ (... ^ ))), где ^ означает возведение в степень (или мощность) и выражение содержит число ровно п раз.
Другими словами, тетрация - это право-ассоциативное повторное возведение в степень. Для n = 4 и a = 1.6 тетракция равна 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
Обратная функция тетрации по n является супер-логарифмом . В предыдущем примере 4 является супер-логарифмом 3,5743 с «супер-базой» 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
приближается к бесконечности?