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 100
setidaknya dalam waktu kurang dari satu menit.
Algoritme secara teoritis harus memberikan hasil dengan 0.001
presisi. Dalam praktiknya, ketepatan output mungkin lebih buruk karena akumulasi kesalahan dalam perhitungan numerik. Namun, hasilnya harus akurat hingga 0.001
untuk 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 = 10
ini 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 - .001
itu memberiy = 9.23248
.
begitu 1.5085
juga solusi yang valid dengan .001
presisi.
x
konvergen n
mendekati infinity?