To kolejne wyzwanie dotyczące liczb Fibonacciego.
Celem jest, aby obliczyć 20'000'000 th liczby Fibonacii tak szybko jak to możliwe. Wyjście dziesiętne ma około 4 MiB; zaczyna się od:
28543982899108793710435526490684533031144309848579
Suma MD5 wyniku wynosi
fa831ff5dd57a830792d8ded4c24c2cb
Musisz przesłać program, który oblicza liczbę podczas działania i podaje wynik stdout
. Najszybszy program, mierzony na moim komputerze, wygrywa.
Oto kilka dodatkowych zasad:
- Musisz przesłać kod źródłowy i plik binarny do uruchomienia na Linuksie x64
- Kod źródłowy musi być krótszy niż 1 MiB, w przypadku złożenia jest również dopuszczalne, jeśli tylko plik binarny jest tak mały.
- Nie wolno dołączać liczby do obliczenia w pliku binarnym, nawet w przebraniu. Liczbę należy obliczyć w czasie wykonywania.
- Mój komputer ma dwa rdzenie; możesz używać równoległości
Wziąłem małą implementację z Internetu, która działa w około 4,5 sekundy. To nie powinno być trudne do pokonania, zakładając, że masz dobry algorytm.
fastest-code
fibonacci
FUZxxl
źródło
źródło
phi = (1+sqrt(5))/2
Odpowiedzi:
C z GMP, 3.6s
Bogowie, ale GMP sprawia, że kod jest brzydki. Dzięki sztuczce w stylu Karatsuba udało mi się zmniejszyć do 2 mnożników na krok podwojenia. Teraz, gdy czytam rozwiązanie FUZxxl, nie jestem pierwszym, który wpadł na ten pomysł. Mam jeszcze kilka sztuczek w rękawie ... może spróbuję później.
Zbudowany z
gcc -O3 m.c -o m -lgmp
.źródło
szałwia
Hmm, wydaje się, że najszybszym będzie skompilowany program. Brak pliku binarnego dla Ciebie!
Na mojej maszynie zajmuje to 0,10 cpu sekundy, 0,15 sekundy ściany.
edit: czas na konsoli, a nie na notebooku
źródło
Haskell
To moja własna próba, chociaż sam nie napisałem algorytmu. Raczej skopiowałem go z haskell.org i dostosowałem do
Data.Vector
swojej słynnej syntezy strumieniowej:Trwa to około 4,5 sekundy po skompilowaniu z GHC 7.0.3 i następującymi flagami:
źródło
enumFromStepN (s-1)
zamiastenumFromStepN s
KROWA
Muczeć! (Trwa chwilę. Wypij trochę mleka ...)
źródło
Matematyka, interpretowana:
Tymczasowy:
I oczywiście nie ma pliku binarnego.
źródło
stdout
.-batchoutput
drukuje tylko informacje o czasie, a nie liczbę Fibonacciego.curl 'http://www.wolframalpha.com/input/?i=Fibonacci%5B2+10^6%5D' | grep 'Decimal approximation:' | sed ...
Działa w sposób ciągły w zależności od szybkości połączenia internetowego. ;-)Ocaml, 0,856s na moim laptopie
Wymaga biblioteki zarith. Użyłem Big_int, ale jest on wolniejszy niż zarith. Ten sam kod zajął 10 minut! Większość czasu spędziłem na drukowaniu tego cholernego numeru (około 9½ minuty)!
Nie mogę uwierzyć, jak bardzo zmieniła się biblioteka!
źródło
Haskell
W moim systemie działa to prawie tak szybko, jak odpowiedź FUZxxl (~ 18 sekund zamiast ~ 17 sekund).
źródło
C, naiwny algorytm
Byłem ciekawy i wcześniej nie korzystałem z gmp ... więc:
fib (1 milion) zajmuje około 7 sekund ... więc ten algorytm nie wygra wyścigu.
źródło
Zaimplementowałem metodę mnożenia macierzy (z sicp, http://sicp.org.ua/sicp/Exercise1-19 ) w SBCL, ale jej ukończenie zajmuje około 30 sekund. Przeniesiłem go do C za pomocą GMP, i zwraca prawidłowy wynik w około 1,36 sekundy na moim komputerze. To prawie tak szybko, jak odpowiedź Boothby'ego.
źródło
Java: 8 sekund na obliczenie, 18 sekund na napisanie
źródło
Udać się
Jest zawstydzająco wolny. Na moim komputerze zajmuje to nieco mniej niż 3 minuty. Jednak to tylko 120 połączeń rekurencyjnych (po dodaniu pamięci podręcznej). Pamiętaj, że może to zużywać dużo pamięci (np. 1,4 GiB)!
źródło
pseudo kod (nie wiem, czego używacie)
Te dwa terminy zajęły mojemu komputerowi 56 godzin. Mój komputer jest trochę gburowaty. Będę miał numer w pliku tekstowym 22 października. 1.2 koncerty są trochę duże do udostępnienia na moim połączeniu.
źródło