Dies ist eine weitere Herausforderung bei den Fibonacci-Zahlen.
Ziel ist es, die 20'000'000- te Fibonacii-Zahl so schnell wie möglich zu berechnen . Die Dezimalausgabe ist ungefähr 4 MiB groß; es beginnt mit:
28543982899108793710435526490684533031144309848579
Die MD5-Summe der Ausgabe ist
fa831ff5dd57a830792d8ded4c24c2cb
Sie müssen ein Programm einreichen, das die Anzahl während der Ausführung berechnet und das Ergebnis an legt stdout
. Das schnellste Programm, gemessen auf meiner eigenen Maschine, gewinnt.
Hier sind einige zusätzliche Regeln:
- Sie müssen den Quellcode und eine Binärdatei unter x64 Linux einreichen
- Der Quellcode muss kürzer als 1 MiB sein. Im Falle einer Montage ist es auch akzeptabel, wenn nur die Binärdatei so klein ist.
- Sie dürfen die zu berechnende Zahl nicht in Ihre Binärdatei aufnehmen, auch nicht getarnt. Die Anzahl muss zur Laufzeit berechnet werden.
- Mein Computer hat zwei Kerne; Sie dürfen Parallelität verwenden
Ich habe eine kleine Implementierung aus dem Internet genommen, die in ungefähr 4,5 Sekunden ausgeführt wird. Es sollte nicht sehr schwierig sein, dies zu übertreffen, vorausgesetzt, Sie haben einen guten Algorithmus.
quelle
phi = (1+sqrt(5))/2
Antworten:
C mit GMP, 3,6 s
Götter, aber GMP macht Code hässlich. Mit einem Trick im Karatsuba-Stil konnte ich auf 2 Multiplikationen pro Verdopplungsschritt reduzieren. Jetzt, wo ich die Lösung von FUZxxl lese, bin ich nicht der erste, der auf die Idee kommt. Ich habe noch ein paar Tricks im Ärmel ... vielleicht probiere ich sie später aus.
Gebaut mit
gcc -O3 m.c -o m -lgmp
.quelle
Salbei
Hmm, Sie scheinen anzunehmen, dass das schnellste ein kompiliertes Programm sein wird. Keine Binärdatei für dich!
Auf meinem Computer dauert es 0,10 CPU-Sekunden, 0,15 Wandsekunden.
Bearbeiten: Zeitgesteuert auf der Konsole anstelle des Notebooks
quelle
Haskell
Dies ist mein eigener Versuch, obwohl ich den Algorithmus nicht selbst geschrieben habe. Ich habe es lieber von haskell.org kopiert und an
Data.Vector
die berühmte Stream-Fusion angepasst :Bei der Kompilierung mit GHC 7.0.3 und den folgenden Flags dauert dies ungefähr 4,5 Sekunden:
quelle
enumFromStepN (s-1)
statt seinenumFromStepN s
KUH
Muhen! (Dauert eine Weile. Trink etwas Milch ...)
quelle
Mathematica, interpretiert:
Zeitlich festgelegt:
Und natürlich keine Binärdatei.
quelle
stdout
.-batchoutput
werden nur Timing-Informationen und nicht die Fibonacci-Nummer gedruckt .curl 'http://www.wolframalpha.com/input/?i=Fibonacci%5B2+10^6%5D' | grep 'Decimal approximation:' | sed ...
Es läuft in konstanter Zeit in Bezug auf die Geschwindigkeit Ihrer Internetverbindung. ;-)Ocaml, 0,856s auf meinem Laptop
Benötigt die Zarith-Bibliothek. Ich habe Big_int verwendet, aber es ist langsam im Vergleich zu Zarith. Es dauerte 10 Minuten mit dem gleichen Code! Die meiste Zeit wurde damit verbracht , die verdammte Nummer zu drucken (9½ Minuten oder so)!
Ich kann nicht glauben, wie viel Unterschied die Bibliothek gemacht hat!
quelle
Haskell
Auf meinem System läuft dies fast so schnell wie die Antwort von FUZxxl (~ 18 Sekunden statt ~ 17 Sekunden).
quelle
C, naiver Algorithmus
War neugierig und ich hatte gmp noch nie benutzt ... also:
fib (1 Million) dauert ungefähr 7 Sekunden ... also wird dieser Algorithmus das Rennen nicht gewinnen.
quelle
Ich habe die Matrixmultiplikationsmethode (von sicp, http://sicp.org.ua/sicp/Exercise1-19 ) in SBCL implementiert, aber es dauert ungefähr 30 Sekunden, bis sie fertig ist. Ich habe es mit GMP nach C portiert und es gibt auf meinem Computer in ca. 1,36 Sekunden das richtige Ergebnis zurück. Es ist ungefähr so schnell wie die Antwort von Standby.
quelle
Java: 8 Sekunden zum Berechnen, 18 Sekunden zum Schreiben
quelle
Gehen
Es ist peinlich langsam. Auf meinem Computer dauert es etwas weniger als 3 Minuten. Es sind jedoch nur 120 rekursive Aufrufe (nach dem Hinzufügen des Caches). Beachten Sie, dass dies viel Speicherplatz beanspruchen kann (wie 1,4 GiB)!
quelle
Pseudocode (Ich weiß nicht, was ihr benutzt)
Mein Computer brauchte 56 Stunden, um diese beiden Begriffe zu erledigen. Mein Computer ist irgendwie beschissen. Ich werde die Nummer am 22. Oktober in einer Textdatei haben. 1.2 Gigs sind ein bisschen groß, um sie auf meiner Verbindung zu teilen.
quelle