Khinchins Konstante auf so viele Dezimalstellen wie möglich in 64 Bytes oder weniger


22

Khinchin Konstante ist eine merkwürdige mathematische Konstante, die nach Wolfram MathWold , ist „notorisch schwierig zu hohen Genauigkeit zu berechnen“ .

Hier ist es zu 100 Stellen:

2.685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

Schreiben Sie ein Programm mit 64 Bytes oder weniger, das die Khinchin-Konstante mit der maximalen Anzahl korrekter Dezimalstellen ausgibt.

  • Sie dürfen keine eingebauten Bibliothekskonstanten oder Funktionen verwenden, die in direktem Zusammenhang mit der Khinchin-Konstante stehen. (zB Math.Khinchin (Präzision) ist definitiv nicht erlaubt.)
  • Sie können Mathematikbibliotheken verwenden, um Logarithmen, Summierungen usw. zu berechnen.
  • Sie können Ihre Antwort ganz oder teilweise fest codieren.
  • Ihr Programm muss eine endliche Ausgabe erzeugen und auf einem einigermaßen modernen Computer (wie den hier aufgeführten ) in weniger als einer Stunde ausgeführt werden .
  • Sie müssen auf stdout ausgeben. Es erfolgt keine Eingabe.
  • Sie können beliebige Zeichen verwenden, solange http://mothereff.in/byte-counter 64 Byte oder weniger registriert.

Wertung

Ihre Punktzahl ist die Anzahl der aufeinanderfolgenden Stellen in Khinchins Konstante, die Ihr Programm korrekt ausgibt, beginnend mit 2,68 ... Sie können falsche Stellen ausgeben, aber nur die letzte richtige Stelle wird für Ihre Punktzahl gezählt.

Zum Beispiel eine Ausgabe von

2.68545200 2 06530644530971483548179569382038229399446295305115234555721

würde 9 Punkte erzielen. Eine für jede der Ziffern, 2 6 8 5 4 5 2 0 0aber nichts nach der 2 , die eine 1 sein sollte.


2
Warum erlauben Sie die Hardcodierung der gesamten Antwort?
William Barbosa

5
@ WilliamBarbosa warum nicht? idealerweise sollte es eine Lösung geben, die besser als 31 ist. Wenn nicht, ist das unglücklich.
Martin Ender

1
Ist Unicode erlaubt? Wie man es zählt
Aditsu

3
Sie sollten 64b statt 32 zulassen und alle Zeichen als UTF-8-Bytes ( mothereff.in/byte-counter ) zählen (= 1 bis 4 Bytes pro Zeichen, abhängig von der Unicode-Ebene). Auch die bestehenden Lösungen könnten problemlos an 64b
xem

3
@PeterTaylor Ich habe eine CJam-Gleitkomma-Lösung codiert und ich möchte Ihnen sagen, dass begrenzte Präzision nicht das Hauptproblem ist: p
aditsu

Antworten:


11

Ahorn, 200+

Der folgende Maple- Befehl berechnet die Khinchin-Konstante mit der angeforderten Genauigkeit (hier 200 Stellen):

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

Dieser Code sollte funktionieren, wenn Sie ihn in die grafische Oberfläche von Maple kopieren und einfügen. Das ζdauert zwei Bytes in UTF-8 und die drei für insgesamt 62 Bytes.

Das Ausschreiben der ASCII-Versionen dieser Symbole, auch mit dem Trick der Verwendung min()anstelle von infinity, leider, bringt die Byteanzahl auf 66:

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

Die Anzahl der berechneten Stellen kann einfach angepasst werden, indem Sie die Zahl in eckigen Klammern nach ändern evalf. Auf meinem ziemlich alten Computer scheinen 200 Stellen in ungefähr einer halben Stunde fertig zu sein; Ihr könnte zu mehr fähig sein. Beachten Sie, dass Maple das Ergebnis auf die angeforderte Genauigkeit rundet, anstatt es abzuschneiden, sodass die tatsächliche Anzahl der übereinstimmenden Stellen möglicherweise etwas geringer ist.

Diese Methode zur Berechnung der Konstanten basiert auf der Formel (9) von der MathWorld-Seite , die dort an Gosper (1996, pers. Comm.) Zitiert wurde:

            Gleichung

Dies war die effizienteste Methode, die ich (kaum) in 64 Bytes oder weniger komprimieren konnte.


Ziemlich ordentlich. Wenn ich nur Maple hätte: /
Calvins Hobbys

12

CJam - 118

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

Versuchen Sie es unter http://cjam.aditsu.net/

Da stackexchange einige der Zeichen zerstört, ist hier ein Programm, das das obige Programm generiert. Führe es zuerst aus und dann die Ausgabe aus:

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

Erläuterung:

2pushes 2
'.pushes Der Punkt
"…"ist eine Zeichenfolge, die die restlichen Ziffern in codierter Form enthält.
128bDie Zeichenfolge wird in eine Zahl umgewandelt, wobei die Zeichen als Ziffern in der Basis 128 behandelt werden (über ihren ASCII-Code).


2
Sehr schön. Kannst du es ein bisschen erklären?
Kyle Kanos

@KyleKanos hinzugefügt Erklärung
Aditsu

Das ist großartig. Ich sollte eines Tages CJam lernen ... Außerdem kann ich Ihren Online-Interpreter nicht dazu bringen, im Opera-Webbrowser zu arbeiten, obwohl er in meinem Firefox funktioniert. Wahrscheinlich eine Opera-Ausgabe, aber ich dachte, ich würde es erwähnen.
Kyle Kanos

1
@ Calvin'sHobbies 1997 berechnete Xavier Gourdon die ersten 110.000 Stellen in 22 Stunden mit höchstens einem 250-MHz-Prozessor. So können Sie in einer Stunde möglicherweise 1000-mal so viele Stellen wie mit dieser Lösung berechnen. web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/…
Alex L

1
@ Calvin'sHobbies Unter diesem Link finden Sie ein vollständiges Programm, das Berichten zufolge in 7 Sekunden 2000 Stellen berechnet hat.
Aditsu

5

Kona 63

Einfache, fest codierte Antwort:

2.68545200106530644530971483548179569382038229399446295305115234

mmm ist es nicht 63?
xem

@xem: kleiner Tippfehler. Fest. : D
Kyle Kanos

1
Funktioniert auch in GNU BC
Digital Trauma

@DigitalTrauma: Funktioniert wahrscheinlich auch in mehreren anderen Sprachen. Ich bin nur bei Kona geblieben, weil ich vorher darauf geantwortet habe.
Kyle Kanos

5

Haskell, 5

Nun, da niemand eine Lösung unter Verwendung der tatsächlichen Mathematik veröffentlicht hat, entschied ich, dass ich es tun würde, obwohl es nicht annähernd so nah ist wie die anderen Antworten.

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

Dies berechnet 2.6854453689859192satte 5 Zeichen der Konstante. Wolfram hatte Recht, als sie sagten, es sei "schwierig, mit hoher Präzision zu rechnen".


63-Byte-Programm - 1 Byte übrig! Nett!
Digital Trauma

Das zusätzliche Byte könnte ein anderes sein 9, aber mein Computer könnte das nicht verarbeiten, und selbst wenn dies möglich wäre, bin ich mir nicht sicher, ob es zu einer weiteren genauen Ziffer führen würde.
Zaq

Mit Ruby habe ich im Grunde das Maximum erreicht, das man mit dieser Formel erreichen kann, und dies in 60 Sekunden ausgeführt. Ich habe 2.685451312659854: tio.run/##KypNqvz/P9vWkEvDUE/…
Einfach schöne Kunst

3

Mathematica, 6

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

gibt

2.68545843

und verwendet nur 50 Bytes, so gibt es etwas Raum, um etwas besseres zu finden als Piund einen größeren fortgesetzten Bruch zu verwenden, aber ich bin nicht sicher, ob es mit einer Laufzeit von einer Stunde viel besser wird. (Zumal die Suche nach einer besseren Kombination wahrscheinlich mehrere Tage dauern würde, wenn ich nur rohe Gewalt anwenden würde.)

(Natürlich waren Sie klug genug, um zu verbieten Khinchin~N~2000, wo 2000Sie durch eine beliebige Zahl ersetzt werden könnten, die Ihnen innerhalb einer Stunde ein Ergebnis liefert;).


1
+1 für die Verwendung der Konstantenbedeutung, nicht nur einer Formel.
Vi.

2

wxMaxima 3

Eine tatsächlich berechnete Methode!

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

Nach ungefähr 25 Minuten kehrte es zurück

2.681499686663101b0

Jetzt verstehe ich, warum dies auf der Mathematica-Seite angegeben wurde. Ich habe 6 Charaktere zum Spielen, aber ich kann mir nicht vorstellen, 6 Nullen hinzuzufügen, die (a) in weniger als 60 Minuten ablaufen und (b) mir eine genauere Lösung bieten.


Verdacht: Jede weitere Null fügt weniger als eine weitere richtige Ziffer hinzu: '(
Simply Beautiful Art

1

GNU BC , 5-stellig (54-Byte-Programm)

Ein Versuch, tatsächlich zu berechnen. GNU BC ist schrecklich langsam. Dies dauerte 53 Minuten auf einer Ubuntu 14.04-VM, die Mitte 2012 auf einem MacBook Pro Retina ausgeführt wurde. Seltsamerweise läuft es in der VM schneller als in OSX Bare Metal - vermutlich ist die GNU-Version besser für diese Aufgabe optimiert als die BSD-Version.

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

Ausgabe:

2.68544536902156538295

Hinweis:

bc -lmuss für e()und l()Funktionen verwendet werden (und Skala = 20 einstellen).


1

CJam Gleitkommaberechnung - 6

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

Es passt in die ursprünglichen 32 Bytes :)

Läuft es mit dem Java Interpreter unter Verwendung von Java 8, gibt es dies nach ungefähr einer Minute auf meinem Laptop aus:

2.6854513126595827

Der Online-Dolmetscher würde wahrscheinlich zu lange dauern.


1

Python, 64 66

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

Ausgänge:

2.68545200106530644530971483548179569382038229399446295305115234555

Sie können das Leerzeichen nach dem ausschneiden print, um ein anderes Zeichen einzupressen.
xnor

1

Rubin - 73

Leider können Sie mit to_iRuby nur bis zur Basis 36 konvertieren :

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

was zurückkehrt

"2.6854520010653064453097148354817956938203822939944629530511523455572188595"

1

RPL / 2, 7 berechnete Stellen, 61 Bytes

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

kehrt in einer Minute auf meinem alten (Intel Core2) Laptop 2.68545210493822 zurück.

Ich kenne keine Zeta-Funktion in RPL / 2, deshalb habe ich die Integration verwendet (Formel 15 von der Mathworld-Seite). Im Prinzip könnte man die Genauigkeit verbessern, indem man 1e-9 und 1e-7 durch eine kleinere Zahl ersetzt, aber mir fehlte anscheinend der Speicher dafür.

Natürlich greift man auf das unendliche Produkt zurück, um diesen Punkt zu lösen, wie es aussieht

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

und soll funktionieren wie auf einem HP RPL calc, aber es stellt sich heraus, dass es zwei Größenordnungen langsamer ist (auf dem Laptop, habe ich nicht auf meinem HP ausprobiert!) und gibt nur 6 Ziffern.

Der Integrationsalgorithmus in RPL / 2 leistet also wirklich gute Arbeit.


0

Viele Antwortsprachen, 61

Entschuldigung, habe keine bessere Lösung gefunden.

"2.685452001065306445309714835481795693820382293994462953051152"

Die Regeln besagen nicht, dass der korrekten Zahlenfolge keine Anführungszeichen vorangestellt werden können, daher verwende ich diese. Wenn Sie dies beispielsweise in einer JS-Konsole ausführen, erhalten Sie dieselbe Zeichenfolge, einschließlich der Anführungszeichen.


1
Ja, dies gilt auch mit einem Zitat vor. Es ist nur wichtig, dass die 2.685 ... nicht unterbrochen ist.
Calvins Hobbys

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

(Die Ausgabe dauert ca. 2 Sekunden.)

In Übereinstimmung mit den anderen mathematischen Lösungen gebe ich eine noch schlechter konvergierende Lösung an, die das geometrische Mittel der ersten Million fortgesetzter Bruchkoeffizienten einer einzelnen willkürlichen irrationalen Zahl berechnet, von der nicht bekannt ist, dass sie nicht funktioniert. Eigentlich habe ich diese Zahl manipuliert, indem ich ein paar ausprobiert habe, bis ich eine bekommen habe, die mit einer zusätzlichen Ziffer übereinstimmt.

Komische: fror ich meinen Computer und hatte eine harte Abschaltung zu tun , nach dem Versuch , diesen Code mit dem Python Golf Trick zu verkürzen , zu ersetzen , for _ in[1]*10**6:codemit exec("code"*10**6).


0

ES7, 56

alert`2.6854520010653064453097148354817956938203822939944629531`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.