Dato un intero positivo n ed un numero a , il n -esimo tetrazione di un è definito come un ^ ( un ^ ( un ^ (^ ... un ))), dove ^ indica l'elevamento a potenza (o corrente) e l'espressione contiene il numero uno esattamente n volte.
In altre parole, la tetrazione è esponenziazione iterata associativa di destra. Per n = 4 e a = 1.6 la tetrazione è 1.6 ^ (1.6 ^ (1.6 ^ 1.6)) ≈ 3.5743.
La funzione inversa della tetrazione rispetto ad n è il super-logaritmo . Nell'esempio precedente, 4 è il super-logaritmo di 3.5743 con "super-base" 1.6.
La sfida
Dato un numero intero positivo n , trova x tale che n è il super-logaritmo di se stesso in super-base x . Cioè, trova x tale che x ^ ( x ^ ( x ^ (... ^ x ))) (con x che appare n volte) è uguale a n .
Regole
Programma o funzione consentiti.
I formati di input e output sono flessibili come al solito.
L'algoritmo dovrebbe teoricamente funzionare per tutti i numeri interi positivi. In pratica, l'input può essere limitato a un valore massimo a causa delle limitazioni di memoria, tempo o tipo di dati. Tuttavia, il codice deve funzionare per input fino ad 100almeno in meno di un minuto.
L'algoritmo dovrebbe teoricamente dare il risultato con 0.001precisione. In pratica, la precisione dell'output potrebbe essere peggiore a causa di errori accumulati nei calcoli numerici. Tuttavia, l'output deve essere accurato fino ai 0.001casi di test indicati.
Il codice più corto vince.
Casi test
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implementazione di riferimento
Ecco un'implementazione di riferimento in Matlab / Octave (provalo su 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)
Per N = 10questo dà result = 1.5085.
Il codice seguente è un controllo della precisione dell'output, usando l'aritmetica a precisione variabile:
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
Questo da:
- Per
x = 1.5085:y = 10.00173... - Per
x = 1.5085 + .001:y = 10.9075 - Perché
x = 1.5085 - .001dày = 9.23248.
quindi 1.5085è una soluzione valida con .001precisione.
xconverge come ntende all'infinito?