Mengingat bilangan bulat positif n dan sejumlah satu , yang n th tetration dari sebuah didefinisikan sebagai suatu ^ ( a ^ ( a ^ (... ^ a ))), di mana ^ menunjukkan exponentiation (atau kekuasaan) dan ekspresi berisi angka yang tepat n kali.
Dengan kata lain, tetrasi adalah eksponensiasi iterasi yang diasosiasikan dengan benar. Untuk n = 4 dan a = 1.6 tetrasi adalah 1.6 ^ (1.6 ^ (1.6 ^ 1.6)) ≈ 3.5743.
Fungsi kebalikan dari tetrasi terhadap n adalah super-logaritma . Pada contoh sebelumnya, 4 adalah super-logaritma 3.5743 dengan "super-base" 1.6.
Tantangan
Dengan bilangan bulat positif n , temukan x sedemikian rupa sehingga n adalah super-logaritma itu sendiri dalam super-basis x . Yaitu, temukan x sedemikian sehingga x ^ ( x ^ ( x ^ (... ^ x )))) (dengan x muncul n kali) sama dengan n .
Aturan
Program atau fungsi diizinkan.
Format input dan output fleksibel seperti biasa.
Algoritme secara teoritis harus bekerja untuk semua bilangan bulat positif. Dalam praktiknya, input mungkin terbatas pada nilai maksimum karena batasan memori, waktu atau tipe data. Namun, kode harus bekerja untuk input hingga 100setidaknya dalam waktu kurang dari satu menit.
Algoritme secara teoritis harus memberikan hasil dengan 0.001presisi. Dalam praktiknya, ketepatan output mungkin lebih buruk karena akumulasi kesalahan dalam perhitungan numerik. Namun, hasilnya harus akurat hingga 0.001untuk kasus uji yang ditunjukkan.
Kode terpendek menang.
Uji kasus
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Implementasi referensi
Berikut ini adalah implementasi referensi di Matlab / Oktaf (coba di 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)
Untuk N = 10ini memberi result = 1.5085.
Kode berikut adalah pemeriksaan dari presisi keluaran, menggunakan aritmatika presisi-variabel:
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
Ini memberi:
- Untuk
x = 1.5085:y = 10.00173... - Untuk
x = 1.5085 + .001:y = 10.9075 - Untuk
x = 1.5085 - .001itu memberiy = 9.23248.
begitu 1.5085juga solusi yang valid dengan .001presisi.
xkonvergen nmendekati infinity?