IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Последние 40 цифр числа Фибоначчи, (Олимпиадная задача)
сообщение
Сообщение #1


Гость






Вот недавно встертил интересную задачку:
Нужно вывести последние 40 цифр n-ого числа фибонначи,
где n<10^18, вот и все
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Гость , я думаю вам поможет FAQ : Длинная арифметика, числа > LongInt

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(klem4 @ 15.03.2006 9:43) *

я думаю вам поможет Длинная арифметика

klem4, тут дело не в этом. Или не совсем в этом. Я уже второй день думаю над этой задачей..
Первое поползновение - прикинуть количество операций для расчета 10^18-го числа Фибоначи. Собственно, тут и прикидывать не надо. Положим, что на сложение двух предыдущих уходит один цикл (что явно неверно для длинной арифметики, но это есть оценка снизу). Далее, берем машину, работающую на 3 ГГц. В час она выполнит 10^9*3*3600 сложений, что приблизительно есть 10^13. Получается, что нужно 10^5 часов. Будем считать, что в году 10000 часов (приблизительно). И получится, что на расчеты нам потребуется 10 лет.. А на длинную арифметику нужно как минимум десятку накинуть! Сто лет..
Но самое интересное не в этом. На хранение одного только последнего числа уйдет количесво памяти, сравнимое с произведенным на данный момент на всей Земле.. smile.gif

Конечно, можно считать только последние 40 знаков, тогда вопрос с памятью отпадает, но вопрос с временем остается.. Я долго думал, и придумал, что должна быть периодичность в младших разрядах. Стал вычислять - и действительно ее обнаружил. Но только это не решает проблемы, поскольку период растет медленно.. Будем думать дальше! smile.gif

Разделено в отдельную тему, т.к. в ПЕРВОМ ЖЕ ПОСТЕ прикрепленной темы русским языком написано:
Цитата
Внимание!
В этой теме публикуем только сами задачи и их решения... Обсуждения - в отдельных темах!!!


Сообщение отредактировано: volvo -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


ну так есть же формула для вычисления n-ого числа Фиббоначи.
Используем ее +длинную арифметику и вычисляем.... blink.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Altair, ты гений! smile.gif
Про формулу Бине я однозначно забыл [жжет лист бумаги, собирает пепел и посыпает голову]... sad.gif А она ведь дает точное значение до последнего знака!

Но с нахрапа все равно не получается взять. Там фигурирует n-ая степень выражения, содержащего Sqrt(5). Если бы был просто корень из пяти, без слагаемых - то просто поделил n на два, потом дихотомией вычислить 5^(n/2). При этом n должно быть четным, но это ерунда - нечетное ЧФ вычислим по двум боковым четным. Вычислять в лоб (брать корень, прибавлять 1, делить пополам и возводить в степень дихотомическим умножением) нельзя, т.к. вычислять корень придется с точностью до 10^18 знаков..

Думаем.. [скрип мозгов за кадром]


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Или возведением матрицы
     | 0   1 |
A = | |
| 1 1 |,
в степень N (что можно сделать за O(log n) операций, также как и при вычислении по формуле Бине, но по-моему, с матрицей будет проще в смысле ошибок округления, т.к. можно будет работать именно с целочисленной длинной арифметикой)...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.09.2025 20:29
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name