Étant donné un entier positif n et un nombre a , la n -ième tétration de a est définie comme un ^ ( a ^ ( a ^ (... ^ a ))), où ^ désigne l'exponentiation (ou la puissance) et l'expression contient le nombre a exactement n fois.
En d'autres termes, la tétration est une exponentiation itérative associative à droite. Pour n = 4 et a = 1,6, la tétration est de 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
La fonction inverse de la tétration par rapport à n est le super-logarithme . Dans l'exemple précédent, 4 est le super-logarithme de 3,5743 avec "super-base" 1,6.
Le défi
Étant donné un entier positif n , trouvez x tel que n est le super-logarithme de lui-même dans la super-base x . Autrement dit, trouver x tel que x ^ ( x ^ ( x ^ (... ^ x ))) (avec x apparaissant n fois) est égal à n .
Règles
Programme ou fonction autorisé.
Les formats d'entrée et de sortie sont flexibles comme d'habitude.
L'algorithme devrait théoriquement fonctionner pour tous les entiers positifs. En pratique, l'entrée peut être limitée à une valeur maximale en raison de restrictions de mémoire, de temps ou de type de données. Cependant, le code doit fonctionner pour les entrées jusqu'à 100
au moins en moins d'une minute.
L'algorithme devrait théoriquement donner le résultat avec 0.001
précision. En pratique, la précision de sortie peut être pire en raison des erreurs accumulées dans les calculs numériques. Cependant, la sortie doit être précise jusqu'à 0.001
pour les cas de test indiqués.
Le code le plus court gagne.
Cas de test
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implémentation de référence
Voici une implémentation de référence dans Matlab / Octave (essayez-la sur 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)
Car N = 10
cela donne result = 1.5085
.
Le code suivant est une vérification de la précision de sortie, à l'aide d'une arithmétique à précision 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
Cela donne:
- Pour
x = 1.5085
:y = 10.00173...
- Pour
x = 1.5085 + .001
:y = 10.9075
- Car
x = 1.5085 - .001
ça donney = 9.23248
.
1.5085
est donc une solution valable avec .001
précision.
x
Converge- t-il à l' n
approche de l'infini?