Dado um número inteiro positivo n e um número a , a n- ésima tetração de a é definida como a ^ ( a ^ ( a ^ (... ^ a ))), onde ^ indica exponenciação (ou potência) e a expressão contém o número a exatamente n vezes.
Em outras palavras, a tetração é exponenciação iterativa associativa à direita. Para n = 4 e a = 1,6, a tetração é 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
A função inversa da tetração em relação a n é o superlogaritmo . No exemplo anterior, 4 é o superlogaritmo de 3.5743 com "super-base" 1.6.
O desafio
Dado um número inteiro positivo n , encontre x de modo que n seja o superlogaritmo de si mesmo na super base x . Ou seja, encontre x de modo que x ^ ( x ^ ( x ^ (... ^ x ))) (com x aparecendo n vezes) seja igual a n .
Regras
Programa ou função permitida.
Os formatos de entrada e saída são flexíveis, como de costume.
O algoritmo deve teoricamente funcionar para todos os números inteiros positivos. Na prática, a entrada pode ser limitada a um valor máximo devido a restrições de memória, tempo ou tipo de dados. No entanto, o código deve funcionar para entradas de 100
pelo menos menos de um minuto.
O algoritmo deve teoricamente fornecer o resultado com 0.001
precisão. Na prática, a precisão da saída pode ser pior devido a erros acumulados em cálculos numéricos. No entanto, a saída deve ser precisa até 0.001
os casos de teste indicados.
O menor código vence.
Casos de teste
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implementação de referência
Aqui está uma implementação de referência no Matlab / Octave (tente em 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)
Para N = 10
isso dá result = 1.5085
.
O código a seguir é uma verificação da precisão da saída, usando aritmética de precisão variável:
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
Isto dá:
- Para
x = 1.5085
:y = 10.00173...
- Para
x = 1.5085 + .001
:y = 10.9075
- Pois
x = 1.5085 - .001
dáy = 9.23248
.
assim 1.5085
é uma solução válida com .001
precisão.
x
convergem como n
se aproxima do infinito?