Este é mais um desafio sobre os números de Fibonacci.
O objetivo é calcular o 20'000'000 th número Fibonacii o mais rápido possível. A saída decimal é aproximadamente 4 MiB grande; começa com:
28543982899108793710435526490684533031144309848579
A soma MD5 da saída é
fa831ff5dd57a830792d8ded4c24c2cb
Você deve enviar um programa que calcule o número durante a execução e coloque o resultado em stdout
. O programa mais rápido, medido em minha própria máquina, vence.
Aqui estão algumas regras adicionais:
- Você deve enviar o código-fonte e um executável binário em um Linux x64
- O código fonte deve ser menor que 1 MiB; no caso de montagem, também é aceitável se apenas o binário for pequeno.
- Você não deve incluir o número a ser calculado no seu binário, mesmo de maneira disfarçada. O número deve ser calculado em tempo de execução.
- Meu computador possui dois núcleos; você tem permissão para usar paralelismo
Tirei uma pequena implementação da Internet, que é executada em cerca de 4,5 segundos. Não deve ser muito difícil superar isso, supondo que você tenha um bom algoritmo.
fastest-code
fibonacci
FUZxxl
fonte
fonte
phi = (1+sqrt(5))/2
Respostas:
C com GMP, 3,6s
Deuses, mas o GMP torna o código feio. Com um truque no estilo Karatsuba, consegui reduzir para duas multiplicações por etapa de duplicação. Agora que estou lendo a solução da FUZxxl, não sou a primeira a ter a idéia. Tenho mais alguns truques na manga ... talvez os experimente mais tarde.
Construído com
gcc -O3 m.c -o m -lgmp
.fonte
Sábio
Hmm, você parece supor que o mais rápido será um programa compilado. Não é binário para você!
Na minha máquina, são necessários 0,10 cpu segundos, 0,15 segundos na parede.
editar: cronometrado no console, em vez do notebook
fonte
Haskell
Esta é minha própria tentativa, embora eu não tenha escrito o algoritmo sozinho. Eu o copiei do haskell.org e o adaptei para usar
Data.Vector
com sua famosa fusão de fluxo:Isso leva cerca de 4,5 segundos quando compilado com o GHC 7.0.3 e os seguintes sinalizadores:
fonte
enumFromStepN (s-1)
em vez deenumFromStepN s
VACA
Moo! (Demora um pouco. Beba um pouco de leite ...)
fonte
Mathematica, interpretado:
Cronometrado:
E, claro, não binário.
fonte
stdout
.-batchoutput
, ele apenas imprime informações de tempo e não o número de Fibonacci.curl 'http://www.wolframalpha.com/input/?i=Fibonacci%5B2+10^6%5D' | grep 'Decimal approximation:' | sed ...
É executado em tempo constante com relação à velocidade da sua conexão com a Internet. ;-)Ocaml, 0.856s no meu laptop
Requer a biblioteca zarith. Eu usei o Big_int, mas ele é lento em comparação com o zarith. Demorou 10 minutos com o mesmo código! Passava a maior parte do tempo imprimindo o número maldito (mais ou menos 9 minutos e meio)!
Não acredito na diferença que a biblioteca fez!
fonte
Haskell
No meu sistema, isso é executado quase tão rápido quanto a resposta do FUZxxl (~ 18 segundos em vez de ~ 17 segundos).
fonte
C, algoritmo ingênuo
Era curioso, e eu não tinha usado o gmp antes ... então:
fib (1 milhão) leva cerca de 7 segundos ... então esse algoritmo não vence a corrida.
fonte
Eu implementei o método de multiplicação de matrizes (do sicp, http://sicp.org.ua/sicp/Exercise1-19 ) no SBCL, mas leva cerca de 30 segundos para concluir. Eu o portado para C usando GMP, e ele retorna o resultado correto em cerca de 1,36 segundos na minha máquina. É tão rápido quanto a resposta de Boothby.
fonte
Java: 8 segundos para calcular, 18 segundos para escrever
fonte
Vai
É embaraçosamente lento. No meu computador, leva um pouco menos de 3 minutos. São apenas 120 chamadas recursivas (depois de adicionar o cache). Observe que isso pode usar muita memória (como 1,4 GiB)!
fonte
pseudo código (não sei o que vocês estão usando)
Meu computador levou 56 horas para executar esses dois termos. Meu computador é meio ruim. Vou ter o número em um arquivo de texto em 22 de outubro. 1,2 GB é um pouco grande para ser compartilhado na minha conexão.
fonte