Khinchin'in 64 bayt veya daha az sürede mümkün olduğu kadar çok ondalık basamağa sabiti


22

Khinchin'in sabiti , Wolfram MathWold'a göre , “yüksek hassasiyetle hesaplanması bilmesi zor olan” meraklı bir matematiksel sabittir .

İşte 100 hane:

2,685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

Khinchin'in sabitini maksimum doğru ondalık basamağa kadar çıkaran 64 bayt veya daha az bir program yazın .

  • Herhangi bir yerleşik kütüphane sabiti veya doğrudan Khinchin sabiti ile ilgili fonksiyonlar kullanamazsınız. (örn. Math.Khinchin (hassas) kesinlikle yasaktır.)
  • Sen olabilir hesaplama logaritma, toplamları, vb matematik kütüphaneleri kullanmak
  • Sen olabilir Cevabınız tamamını veya bir kısmını hardcode.
  • Programınız sonlu çıktılar üretmeli ve oldukça modern bir bilgisayarda ( burada listelenenler gibi) bir saatten az bir sürede çalışmalıdır .
  • Stdout'a çıktı vermelisin. Giriş yok.
  • Http://mothereff.in/byte-counter adresinde 64 bayt veya daha az kayıt olduğu sürece istediğiniz karakterleri kullanabilirsiniz .

puanlama

Puanınız, Khinchin'deki sabit basamaktaki programın doğru çıktı aldığı sabit basamak sayısıdır, 2.68 ile başlayanlar ... Hatalı basamaklar yazabilirsiniz ancak yalnızca son doğru basamak puanınıza göre sayılır.

Örneğin, bir çıktı

2.68545200 2 06530644530971483548179569382038229399446295305115234555721

9 puan alacaktı. Her bir rakam için bir tane 2 6 8 5 4 5 2 0 0fakat 2'den sonra 1 olması gereken hiçbir şey yok .


2
Neden cevabın tamamını kodlamaya izin veriyorsun?
William Barbosa

5
@WilliamBarbosa neden olmasın? ideal olarak 31'den daha iyi puan alan bir çözüm olmalıdır. Olmazsa, bu talihsiz bir durumdur.
Martin Ender

1
Unicode'a izin verilir mi? Nasıl sayılır?
aditsu

3
32 yerine 64b'ye izin vermeli ve tüm karakterleri UTF-8 bayt olarak saymalısınız ( mothereff.in/byte-counter ) (Unicode düzlemine bağlı olarak karakter başına = 1 - 4 bayt). Ayrıca, mevcut çözümler
xem

3
@PeterTaylor Bir CJam kayan nokta çözümünü kodladım ve size söyleyeyim, sınırlı hassasiyet ana sorun değil: p
aditsu

Yanıtlar:


11

Akçaağaç, 200+

Aşağıdaki Maple komutu Khinchin'in sabitliğini istenen hassasiyete göre hesaplar (burada, 200 basamak):

evalf[200](exp(sum((-1)^k*(2-2^k)*ζ(1,k)/k,k=2..∞)/ln(2)));

Maple grafik arayüzüne kopyalayıp yapıştırırsanız bu kod çalışmalıdır. ζİki UTF-8 bayt ve alır 62 bayt olmak üzere toplam, üç.

Bu sembollerin ASCII sürümlerini yazmak , ne yazık ki, allas min()yerine kullanma hilesiyle bile infinity, bayt sayısını 66'ya kadar getirir:

evalf[200](exp(sum((-1)^k*(2-2^k)*Zeta(1,k)/k,k=2..min())/ln(2)));

Hesaplanan basamak sayısı, sonradan köşeli parantez içindeki sayı değiştirilerek kolayca ayarlanabilir evalf. Oldukça eski bilgisayarımda 200 basamak yaklaşık yarım saatte bitiyor gibi görünüyor; seninki daha fazlasını yapabilir. Maple , sonucu kesinti yapmak yerine istenen hassasiyete yuvarlar , bu nedenle gerçek eşleme rakamlarının sayısı daha az olabilir.

Bu sabiti hesaplama yöntemi, MathWorld sayfasındaki (9) formülüne dayanarak Gosper'a (1996, pers. Comm.) Dayanmaktadır:

            Denklem

Bu, zorlukla 64 byte veya daha azına sıkmayı başardığım en etkili yöntemdi.


Oldukça temiz. Sadece
Calvin's Hobbies

12

CJam - 118

2'."*;TeT?_aN{.i9B*ZEay
G`9~eW}nE=Lr-`B}    )D>9m9"136b

Http://cjam.aditsu.net/ adresinde deneyin

Stackexchange bazı karakterleri yok ettiğinden, yukarıdaki programı üreten bir program var; önce çalıştır, sonra çıktısını çalıştır:

"2'.\""685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697995153465905288090 136b:c"\"136b"

Açıklama:

2iter 2
'.iter, nokta
"…"kodlanmış formdaki basamakların geri kalanını içeren bir dizedir
128b, dizeyi sayıya dönüştürür, karakterleri 128 tabanındaki basamaklar olarak kabul eder (ASCII kodları aracılığıyla)


2
Çok hoş. Biraz açıklayabilir misin?
Kyle Kanos

@KyleKanos bir açıklama ekledi
aditsu

Bu harika. Bir gün CJam'ı öğrenmeliyim ... Ayrıca, çevrimiçi tercümanınızın Opera web tarayıcısında çalışmasını sağlayamıyorum, ancak Firefox'umda çalışıyor. Muhtemelen bir Opera sorunu, ama bundan bahsedeceğimi sanıyordum.
Kyle Kanos

1
@ Calvin's Hobbies 1997'de Xavier Gourdon en fazla 250MHz işlemci kullanarak ilk 110.000 haneyi 22 saatte hesapladı. Böylece, bir saat içinde bu çözümden 1000 kat daha fazla rakam hesaplayabilirsiniz. web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/…
Alex L

1
@ Calvin's Hobbies, bu bağlantıyı 7 saniyede 2000 basamağı hesapladığı bildirilen tam bir program için görüyor .
aditsu


5

Haskell, 5

Eh, kimse gerçek matematik kullanarak bir çözüm yollamadığı için, diğer cevaplar kadar yakın olmasa da yapmaya karar verdim.

main=print$product[(1+1/r/(r+2))**2`logBase`r|r<-[1..99999999]]

Bu 2.6854453689859192, sabitin 5 karakterinden oluşan bir hesaplama yapar . Wolfram, "yüksek hassasiyetle hesaplamanın zor olduğunu" söylediklerinde haklıydı.


63 baytlık program - 1 baytlık yedek! Güzel!
Dijital Travma

Ekstra bayt başka olabilir 9, ancak bilgisayarım bunu kaldıramadı ve olsa bile, başka bir doğru rakamla sonuçlanıp sonuçlanmayacağından emin değilim.
Zaq

Ruby kullanarak, bu formülü kullanarak 60 saniyede çalıştıran maksimum olanı vurdum. Anladım 2.685451312659854: tio.run/##KypNqvz/P9vWkEvDUE/…
Simply Beautiful Art

3

Mathematica, 6

(Times@@Rest@ContinuedFraction[Pi,977])^(1.`9/976)

verir

2.68545843

ve yalnızca 50 bayt kullanır, bu nedenle daha Pibüyük bir kesirden daha iyi bir şey bulmak ve kullanmak için biraz yer vardır , ancak bir saatlik çalışma süresinde daha iyi olacağından emin değilim. (Özellikle daha iyi bir kombinasyon bulmaktan dolayı, eğer sadece kaba kuvvet kullanıyorsam, muhtemelen birkaç gün alacaktır.)

(Tabii ki, red etme kadar zeki olduğumuzu Khinchin~N~2000, 2000size bir saat içinde bir sonuç verir herhangi bir sayı ile değiştirilebilir olabilir).)


1
Sadece bir formül değil, sabitin anlamını kullanmak için +1.
Vi.

2

wxMaxima 3

Gerçekten hesaplanmış bir yöntem!

bfloat(product((1+1/(n*(n+2)))^(log(n)/log(2)),n,1,10000));

Yaklaşık 25 dakika sonra geri döndü

2.681499686663101b0

Şimdi neden Mathematica sayfasının bunu ifade ettiğini anladım. Oynamak için 6 karakterim var, fakat (0) <60 dk.


Şüphe: Her yeni sıfır, bir doğru rakamdan daha az bir rakam ekler: '(
Simply Beautiful Art

1

GNU BC , 5 hane (54 baytlık program)

Aslında hesaplamak için bir girişim. GNU BC korkunç derecede yavaş. Bu 2012 ortalarında MacBook Pro Retina'da çalışan Ubuntu 14.04 VM'de 53 dakika sürdü. Garip bir şekilde VM'de OSX çıplak metalden daha hızlı çalışır - muhtemelen GNU sürümü bu görev için BSD sürümünden daha iyi optimize edilmiştir.

for(k=r=1;r++<10^7;)k*=e(l(1/(r*(r+2))+1)*l(r)/l(2))
k

Çıktı:

2.68544536902156538295

Not:

bc -le()ve l()işlevlerinde kullanılması gerekir (ve ölçek ayarı = 20).


1

CJam kayan nokta hesaplaması - 6

1e8{I{1.II2+*/)I2mL#*}1.?}fI

Orijinal 32 byte'a uyar :)

Java 8 kullanarak Java tercümanı ile çalıştığımda, dizüstü bilgisayarımda bir dakika sonra bunu çıktılar:

2.6854513126595827

Çevrimiçi tercüman muhtemelen çok uzun sürecektir.


1

Python, 64 66

print"2.%i"%int('anljsgqif7gwwwsrntcz7zv2obv6gv5us7fzfwjcaj',36)

Çıktılar:

2.68545200106530644530971483548179569382038229399446295305115234555

Boşluktan sonraki boşluğu printbaşka bir karakterde sıkmak için kesebilirsiniz .
xnor

1

Yakut - 73

Ne yazık ki, to_iRuby'yi kullanarak yalnızca 36 tabanına dönüştürebilirsiniz :

"2.#{"hmegxpkvliy1vaw4lb054ep8wsqwkz2yx9cm9jvc9yfd48j".to_i 36}"

hangi döner

"2.6854520010653064453097148354817956938203822939944629530511523455572188595"

1

RPL / 2, 7 hesaplanmış rakam, 61 bayt

'LN(FLOOR(1/X))/(X+1)/LN(2)' { 'X' 1e-9 1 } 1e-7 INT DROP EXP

eski (intel Core2) dizüstü bilgisayarımda bir dakika içinde 2.68545210493822 döndürür.

RPL / 2'de bildiğim kadarıyla hiçbir Zeta işlevi yok, bu yüzden entegrasyonu kullandım (Mathworld sayfasından formül 15). Prensip olarak doğruluk, 1e-9 ve 1e-7'nin daha küçük sayılarla değiştirilmesiyle geliştirilebilir, ancak bunun için hafızam yoktu.

Tabii ki sonsuz ürüne başvurmak bu noktayı çözüyor gibi görünüyor.

1 1 1e9 FOR I 1 1 I dup 2 + * / + I LN 2 LN / ^ * NEXT

ve bir HP RPL hesap makinesinde olduğu gibi çalışacaktır, ancak iki büyüklük sırası daha yavaş çıkmaktadır (dizüstü bilgisayarda HP'mde denenmemiştir!) ve sadece 6 rakam verir.

Dolayısıyla RPL / 2'deki entegrasyon algoritması aslında oldukça iyi bir iş çıkarır.


0

Birçok repl dili, 61

üzgünüm, daha iyi bir çözüm bulamadım.

"2.685452001065306445309714835481795693820382293994462953051152"

Kurallar, doğru sayı sırasının tırnak işaretleri tarafından verilemeyeceğini söylemiyor, bu yüzden bunu kullanıyorum. Bunu bir JS konsolunda çalıştırarak, tırnak işaretleri de dahil olmak üzere aynı dizeyi alırsınız.


1
Evet, bu öndeki bir teklifle bile geçerlidir. Sadece 2.685'in kesintisiz olması önemli.
Calvin'in Hobileri

0

Python (5)

x=3**.1
p=1
for _ in[1]*10**6:p*=(x//1)**1e-6;x=1/(x%1)
print(p)

Output: 2.6854396408091694

(Çıkış ~ 2 saniye sürer.)

Diğer matematik çözümleriyle dayanışma içinde, çalışmadığı bilinen bir tür olmayan tek irrasyonel irrasyonel sayının geometrik ortalamalarını hesaplayan daha da yakınsak bir tane vereceğim. Aslında, bu rakamı fazladan bir basamağa denk gelen bir tane bulana kadar birkaç tane deneyerek hileledi.

Komik şey: Bilgisayarımı dondu ve değiştirme Python golf hile ile bu kodu kısaltmak için denedikten sonra kapanışın sert yapmak zorunda for _ in[1]*10**6:codeolan exec("code"*10**6).


0

ES7, 56

alert`2.6854520010653064453097148354817956938203822939944629531`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.