Это еще одна проблема, связанная с числами Фибоначчи.
Цель состоит в том, чтобы как можно быстрее вычислить 20'000'000- е число Фибоначчи. Десятичный вывод составляет около 4 МБ; начинается с:
28543982899108793710435526490684533031144309848579
Сумма MD5 на выходе равна
fa831ff5dd57a830792d8ded4c24c2cb
Вы должны отправить программу, которая вычисляет число во время работы и помещает результат в stdout
. Самая быстрая программа, измеренная на моей машине, побеждает.
Вот несколько дополнительных правил:
- Вы должны предоставить исходный код и исполняемый двоичный файл на Linux x64
- Исходный код должен быть короче 1 МБ, в случае сборки также допустимо, если только двоичный файл настолько мал.
- Вы не должны включать число для вычисления в вашем двоичном файле, даже в замаскированном виде. Число должно быть рассчитано во время выполнения.
- Мой компьютер имеет два ядра; вам разрешено использовать параллелизм
Я взял небольшую реализацию из Интернета, которая работает около 4,5 секунд. Это не должно быть очень сложно, если у вас есть хороший алгоритм.
fastest-code
fibonacci
FUZxxl
источник
источник
phi = (1+sqrt(5))/2
Ответы:
C с GMP, 3,6 с
Боги, но GMP делает код ужасным. С помощью трюка в стиле Карацубы мне удалось сократить 2 умножения за шаг удвоения. Теперь, когда я читаю решение FUZxxl, я не первый, кто понял эту идею. У меня есть еще пара трюков в рукаве ... может быть, я попробую их позже.
Построен с
gcc -O3 m.c -o m -lgmp
.источник
шалфей
Хм, вы, похоже, предполагаете, что самой быстрой будет скомпилированная программа. Нет бинарных для вас!
На моей машине это занимает 0,10 секунды, 0,15 секунды.
редактировать: приурочен к консоли, а не к ноутбуку
источник
Haskell
Это моя собственная попытка, хотя я сам не написал алгоритм. Я скорее скопировал его с haskell.org и адаптировал для использования
Data.Vector
с его знаменитым потоковым синтезом:Это занимает около 4,5 секунд при компиляции с GHC 7.0.3 и следующими флагами:
источник
enumFromStepN (s-1)
вместоenumFromStepN s
КОРОВА
Moo! (Занимает какое-то время. Выпей молока ...)
источник
Mathematica, интерпретируется:
Timed:
И, конечно же, нет двоичного файла.
источник
stdout
.-batchoutput
, он печатает только информацию о времени, а не число Фибоначчи.curl 'http://www.wolframalpha.com/input/?i=Fibonacci%5B2+10^6%5D' | grep 'Decimal approximation:' | sed ...
Он работает в постоянном времени относительно скорости вашего интернет-соединения. ;-)Ocaml, 0,856 с на моем ноутбуке
Требуется библиотека зарита. Я использовал Big_int, но это собака медленная по сравнению с Зарит. Прошло 10 минут с тем же кодом! Большая часть времени была потрачена на печать чертового номера (9,5 минут или около того)!
Я не могу поверить, как много изменила библиотека!
источник
Haskell
В моей системе это работает почти так же быстро, как ответ FUZxxl (~ 18 секунд вместо ~ 17 секунд).
источник
С, наивный алгоритм
Было любопытно, и я не использовал gmp раньше ... так:
fib (1 миллион) занимает около 7 секунд ... так что этот алгоритм не выиграет гонку.
источник
Я реализовал метод умножения матриц (из sicp, http://sicp.org.ua/sicp/Exercise1-19 ) в SBCL, но для его завершения требуется около 30 секунд. Я перенес его на C, используя GMP, и он возвращает правильный результат примерно за 1,36 секунды на моей машине. Это примерно так же быстро, как ответ Бутби.
источник
Java: 8 секунд для вычисления, 18 секунд для записи
источник
Идти
Это смущающе медленно. На моем компьютере это занимает чуть меньше 3 минут. Впрочем, это всего лишь 120 рекурсивных вызовов (после добавления кеша). Обратите внимание, что для этого может потребоваться много памяти (например, 1,4 ГБ)!
источник
псевдокод (я не знаю, что вы, ребята, используете)
Моему компьютеру потребовалось 56 часов, чтобы выполнить эти два условия. Мой компьютер отчасти дерьмовый. У меня будет номер в текстовом файле 22 октября. 1,2 гига немного больше, чтобы поделиться на моем соединении.
источник