LINUX.ORG.RU

[программирование] Интересная задача

 


0

0

Написать программу, считающую n-e число фибоначчи: f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)
Программе передаётся один параметр - целое число от 0 до 2^31-1. Программа должна подсчитать соответствующее число фибоначчи и записать его в некий файл (или выдать в stdout) в бинарной форме (255 = 0xff, 256 = 0x0100, ...). Рекомендуется использовать многопоточность.

Критерием сравнения наверное будет скорость выполнения, при условии, что программа укладывается в некие разумные рамки по памяти (пусть будет гигабайт ulimit-ом).

Полагаю, оптимальный вариант - многопоточное решение на C с GMP, но не уверен. Может что-нибудь ленивое на хаскеле себя покажет )

Я на джаве простой вариант накидывал, но оно тормозит и жрёт память :) f(1000000) не дождался.

★★★★★
Ответ на: комментарий от dilmah

> Есть целочисленное решение: возвести матрицу [1 1; 1 0] в степень N.

Ура, первый правильный ответ! Возводится в степень N естественно за O(log(N)).

balodja ★★★
()
Ответ на: комментарий от hired777

> Я вроде помню решение за logN - там нужно матрицу 2х2 возвести в эту степень. Если интересно - могу вспоминать дальше.

Тред почитай. Прям перед тобой решение это написано на сях, а еще раньше dilmah озвучил.

balodja ★★★
()
Ответ на: комментарий от balodja

Тут особенность в том, что logN операций сложения/умножения, а не операций процессора. С какого то момента числа становятся большими, и складываются/перемножаются всё дольше и дольше.

Legioner ★★★★★
() автор топика

в gmp, как помню, есть функции для вычисления числа фибоначчи: mpz_fib_ui and mpz_fib2_ui. Считают очень быстро.

najar
()
Ответ на: комментарий от Legioner

Ага, и сколько требуется операций процессора на умножение N*N? Берем http://en.wikipedia.org/wiki/Sch%C3%B6nhage%E2%80%93Strassen_algorithm

В итоге получаем O(log(N)^2 * log(log(N)) * log(log(log(N)))) , короче, почти O(log(N)^2). И чо? С помощью фиксированной точки надеешься получить лучше?

balodja ★★★
()
Ответ на: комментарий от balodja

По ссылке найдешь решение коммивояжёра за O(n). Но только ищи хорошо!

balodja ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.