Bu ne zaman bir kod golf haline geldi? Ben en iyi algoritma ile gelip bir kod meydan okuma olduğunu düşündüm!
kod golf
APL, 33 karakter
{r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6}
Bu, basit bir doğrusal arayıştır = 1 + 10 ° C den başlayan -6 ve bunu 10 ile artan -6 kadar
günlük Cı günlük Cı log Cı ⋯ bir ≤ 1
günlük burada Cı fonksiyonu yinelemeli B kez uygulanır.
Örnekler
4 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 65536
2.0000009999177335
3 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 7625597484987
3.0000000000575113
Bu kod çok yavaştır, ancak 2 veya 3 gibi küçük bazlar için birkaç saniye içinde tamamlanır. Daha iyi bir şey için aşağıya bakın.
kod meydan okuma
APL, logaritmik karmaşıklık
Aslında kök düzeninde doğrusal karmaşıklık, sonuç boyutu ve hassasiyette logaritmik:
zaman = O (B × log (C) + B × log (D))
burada B kök düzeni, C istenen tetratasyon tabanıdır ve D istenen hassasiyetin basamak sayısıdır. Bu karmaşıklık benim sezgisel anlayışımdır, resmi bir kanıt üretmedim.
Bu algoritma büyük tamsayılar gerektirmez, sadece normal kayan nokta sayılarında günlük işlevini kullanır, bu nedenle kayan nokta uygulamasının sınırına (çift kesinlikli veya rastgele büyük FP numaraları) kadar çok büyük sayılar üzerinde oldukça etkilidir. Bunları sunan APL uygulamaları.)
Sonucun hassasiyeti ⎕CT(karşılaştırma toleransı) istenen kabul edilebilir hataya ayarlanarak kontrol edilebilir (sistemimde varsayılan olarak 1e¯14, kabaca 14 ondalık basamak)
sroot←{ ⍝ Compute the ⍺-th order super-root of ⍵:
n←⍺ ⋄ r←⍵ ⍝ n is the order, r is the result of the tetration.
u←{ ⍝ Compute u, the upper bound, a base ≥ the expected result:
1≥⍵⍟⍣n⊢r:⍵ ⍝ apply ⍵⍟ (log base ⍵) n times; if ≤1 then upper bound found
∇2×⍵ ⍝ otherwise double the base and recurse
}2 ⍝ start the search with ⍵=2 as a first guess.
(u÷2){ ⍝ Perform a binary search (bisection) to refine the base:
b←(⍺+⍵)÷2 ⍝ b is the middle point between ⍺ and ⍵
t←b⍟⍣n⊢r ⍝ t is the result of applying b⍟ n times, starting with r;
t=1:b ⍝ if t=1 (under ⎕CT), then b is the super-root wanted;
t<1:⍺∇b ⍝ if t<1, recurse between ⍺ and b
b∇⍵ ⍝ otherwise (t>1) returse between b and ⍵
}u ⍝ begin the search between u as found earlier and its half.
}
1≥⍵⍟⍣nYukarıdaki bir Etki Alanı Hatası ile başarısız olup olmadığından emin değilim (çünkü negatif bir argümanın günlüğü hemen başarısız olabilir veya alan adında olmayan karmaşık bir sonuç verebilir ≥), ancak bulamadım başarısız olan bir dava.
Örnekler
4 sroot 65536
1.9999999999999964
4 sroot 65537
2.000000185530773
3 sroot 7625597484987
3
3 sroot 7625597400000
2.999999999843567
3 sroot 7625597500000
3.000000000027626
'3' tam bir değer olarak ortaya çıkar çünkü ikili aramanın doğrudan çarptığı değerlerden biri olur (2'den başlayarak, 4'ten ikiye, iki ila 3'e). Bu gerçekleşmeyen genel durumda, sonuç ⎕CT hatası ile kök değerine yaklaşık olarak yaklaşacaktır (daha kesin olarak, her aday tabanın logaritmik testi ⎕CT toleransı ile gerçekleştirilir.)