Dado un número entero positivo n y un número a , el n -ésimo tetración de una se define como un ^ ( un ^ ( un ^ (... ^ una ))), donde ^ denota exponenciación (o potencia) y la expresión contiene el número de una exactamente n veces.
En otras palabras, la tetración es exponenciación iterativa asociativa derecha. Para n = 4 y a = 1.6 la tetración es 1.6 ^ (1.6 ^ (1.6 ^ 1.6)) ≈ 3.5743.
La función inversa de la tetración con respecto a n es el superlogaritmo . En el ejemplo anterior, 4 es el superlogaritmo de 3.5743 con "superbase" 1.6.
El reto
Dado un número entero positivo n , encuentre x tal que n sea el superlogaritmo de sí mismo en la superbase x . Es decir, encuentre x tal que x ^ ( x ^ ( x ^ (... ^ x ))) (con x apareciendo n veces) es igual a n .
Reglas
Programa o función permitida.
Los formatos de entrada y salida son flexibles como de costumbre.
El algoritmo debería funcionar teóricamente para todos los enteros positivos. En la práctica, la entrada puede limitarse a un valor máximo debido a restricciones de memoria, tiempo o tipo de datos. Sin embargo, el código debe funcionar para entradas hasta al 100
menos en menos de un minuto.
El algoritmo teóricamente debería dar el resultado con 0.001
precisión. En la práctica, la precisión de salida puede ser peor debido a los errores acumulados en los cálculos numéricos. Sin embargo, la salida debe ser precisa 0.001
para los casos de prueba indicados.
El código más corto gana.
Casos de prueba
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implementación de referencia
Aquí hay una implementación de referencia en Matlab / Octave (pruébelo en 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)
Por N = 10
esto da result = 1.5085
.
El siguiente código es una verificación de la precisión de salida, usando aritmética de precisión variable:
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
Esto da:
- Para
x = 1.5085
:y = 10.00173...
- Para
x = 1.5085 + .001
:y = 10.9075
- Por
x = 1.5085 - .001
eso day = 9.23248
.
Por lo tanto, 1.5085
es una solución válida con .001
precisión.
x
Converge a medida que se n
acerca al infinito?