C'est encore un autre défi concernant les chiffres de Fibonacci.
L'objectif est de calculer le 20'000'000 e nombre de Fibonacii le plus rapidement possible. La sortie décimale est d'environ 4 Mio de large; ça commence par:
28543982899108793710435526490684533031144309848579
La somme MD5 de la sortie est
fa831ff5dd57a830792d8ded4c24c2cb
Vous devez soumettre un programme qui calcule le nombre lors de l'exécution et met le résultat à stdout
. Le programme le plus rapide, mesuré sur ma propre machine, gagne.
Voici quelques règles supplémentaires:
- Vous devez soumettre le code source et un exécutable binaire sur un Linux x64
- Le code source doit être inférieur à 1 Mio, en cas d'assemblage, il est également acceptable si seul le binaire est aussi petit.
- Vous ne devez pas inclure le nombre à calculer dans votre binaire, même de manière déguisée. Le nombre doit être calculé lors de l'exécution.
- Mon ordinateur a deux cœurs; vous êtes autorisé à utiliser le parallélisme
J'ai pris une petite implémentation sur Internet qui s'exécute en environ 4,5 secondes. Il ne devrait pas être très difficile de battre cela, en supposant que vous avez un bon algorithme.
fastest-code
fibonacci
FUZxxl
la source
la source
phi = (1+sqrt(5))/2
Réponses:
C avec GMP, 3,6 s
Dieux, mais GMP rend le code laid. Avec une astuce de style Karatsuba, j'ai réussi à réduire à 2 multiplications par étape de doublement. Maintenant que je lis la solution de FUZxxl, je ne suis pas le premier à avoir l'idée. J'ai encore quelques trucs dans ma manche ... peut-être que je les essayerai plus tard.
Construit avec
gcc -O3 m.c -o m -lgmp
.la source
sauge
Hmm, vous semblez supposer que le plus rapide sera un programme compilé. Pas de binaire pour vous!
Sur ma machine, cela prend 0,10 seconde de processeur, 0,15 seconde de paroi.
edit: chronométré sur la console, au lieu du portable
la source
Haskell
C'est mon propre essai, même si je n'ai pas écrit l'algorithme moi-même. Je l'ai plutôt copié de haskell.org et l' ai adapté pour l'utiliser
Data.Vector
avec sa fameuse fusion de flux:Cela prend environ 4,5 secondes lors de la compilation avec GHC 7.0.3 et les indicateurs suivants:
la source
enumFromStepN (s-1)
au lieu deenumFromStepN s
VACHE
Meuglement! (Prend un certain temps. Buvez du lait ...)
la source
Mathematica, interprété:
Chronométré:
Et bien sûr, pas de binaire.
la source
stdout
.-batchoutput
, il imprime uniquement les informations de synchronisation et non le numéro de Fibonacci.curl 'http://www.wolframalpha.com/input/?i=Fibonacci%5B2+10^6%5D' | grep 'Decimal approximation:' | sed ...
Il fonctionne en temps constant par rapport à la vitesse de votre connexion Internet. ;-)Ocaml, 0,856s sur mon ordinateur portable
Nécessite la bibliothèque zarith. J'ai utilisé Big_int mais c'est un chien lent par rapport à zarith. Cela a pris 10 minutes avec le même code! La plupart du temps a été consacré à l' impression du foutu numéro (environ 9½ minutes)!
Je ne peux pas croire à quel point la bibliothèque a fait une différence!
la source
Haskell
Sur mon système, cela fonctionne presque aussi vite que la réponse de FUZxxl (~ 18 secondes au lieu de ~ 17 secondes).
la source
C, algorithme naïf
Était curieux, et je n'avais pas utilisé gmp avant ... donc:
fib (1 million) prend environ 7 secondes ... donc cet algorithme ne gagnera pas la course.
la source
J'ai implémenté la méthode de multiplication matricielle (depuis sicp, http://sicp.org.ua/sicp/Exercise1-19 ) dans SBCL mais cela prend environ 30 secondes pour terminer. Je l'ai porté sur C en utilisant GMP, et il renvoie le résultat correct en environ 1,36 secondes sur ma machine. C'est à peu près aussi rapide que la réponse de Boothby.
la source
Java: 8 secondes pour calculer, 18 secondes pour écrire
la source
Aller
C'est d'une lenteur embarrassante. Sur mon ordinateur, cela prend un peu moins de 3 minutes. Ce n'est que 120 appels récursifs, cependant (après l'ajout du cache). Notez que cela peut utiliser beaucoup de mémoire (comme 1,4 Gio)!
la source
pseudo code (je ne sais pas ce que vous utilisez)
Il a fallu 56 heures à mon ordinateur pour faire ces deux termes. Mon ordinateur est un peu merdique. J'aurai le numéro dans un fichier texte le 22 octobre. 1.2 concerts est un peu gros à partager sur ma connexion.
la source