в котором каждый бит это три умножения. Его можно переписать, что умножений будет два ( меньше для рекурсий второго порядка не получить)
Там ведь даже не умножения, а возведения в квадрат, а это должно быть быстрее чем просто умножение.
Поздравляю)
Примерно в полтора раза быстрее.
Вольфрам, как я слышал, небыстрый. pari/gp тоже интерпретатор, но вот на подобные вычиcления немного лучше заточен, вот и всё.
Очень может быть, и, кстати, похоже на правду, так как это объясняет различие в полтора раза.
Не не, в программах на pari/gp что я запускал не используется встроенная функция вычисления Фибоначчи, она такие большие числа не умеет.
Использовалось два кода, подсказанный ув.
maxal, через производящую функцию, по модулю
fibomod_2(n,m)=lift(polcoef(lift(Mod(x,(x^2-x-1)*Mod(1,10^m))^n),1,x))и возведением "производящей матрицы" в степень, тоже по модулю:
fibomod_1(n,m)=lift(((Mod([1,1;1,0],10^m))^(n-1))[1,1])Обе берут на вход
n - номер числа Фибоначчи,
m - сколько последних цифр вернуть в качестве результата (ведущие нули опускаются).
С кодом
fibomod_2(), использующим производящую функцию, надо быть осторожным: переменная
x не должна использоваться до этого кода, или надо выполнить команду
kill(x) если использовалась.
P.S. Ну а вообще, сермяжная правда конечно в том, что числа Фибоначчи (и вообще ЛРП, но Фибоначчи в особенности) и всё про них украдено задолго до нас.
Но сейчас вычисления
такого объема , как например предложили вы (стомиллионнозначные числа по тысячезначному модулю), стало доступно на гаджетах (я пользуюсь андроид планшетом, и он по скорости примерно такой же как мой ноутбук) лёжа на диване, и позволяет легко удовлетворить праздный интерес.