E006. Fibonacci numbers

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
O texto da tarefa é traduzido do russo para o idioma selecionado. O código permanece sem alterações.

Источник: e-maxx.ru/algo, страница PDF 20.

Definição

Последовательность Фибоначчи определяется следующим образом:

Несколько первых её членов:

История

Эти числа ввёл в 1202 г. Леонардо Фибоначчи (Leonardo Fibonacci) (также известный как Леонардо Пизанский (Leonardo Pisano)). Однако именно благодаря математику 19 века Люка (Lucas) название "Fibonacci numbers" стало общеупотребительным. Впрочем, индийские математики упоминали числа этой последовательности ещё раньше: Гопала (Gopala) до 1135 г., Хемачандра (Hemachandra) — в 1150 г.

Fibonacci numbers в природе

Сам Фибоначчи упоминал эти числа в связи с такой задачей: "Человек посадил пару кроликов в загон, окруженный со всех сторон стеной. Сколько пар кроликов за год может произвести на свет эта пара, если известно, что каждый месяц, начиная со второго, каждая пара кроликов производит на свет одну пару?". Soluçãoм этой задачи и будут числа последовательности, называемой теперь в его честь. Впрочем, описанная Фибоначчи ситуация — больше игра разума, чем реальная природа. Индийские математики Гопала и Хемачандра упоминали числа этой последовательности в связи с количеством ритмических рисунков, образующихся в результате чередования долгих и кратких слогов в стихах или сильных и слабых долей в музыке. number таких рисунков, имеющих в целом

долей, равно

. Fibonacci numbers появляются и в работе Кеплера 1611 года, который размышлял о числах, встречающихся в природе (работа "О шестиугольных снежинках"). Интересен Exemplo растения — тысячелистника, у которого number стеблей (а значит и цветков) всегда есть number Фибоначчи. Причина этого проста: будучи изначально с единственным стеблем, этот стебель затем делится на два, затем от главного стебля ответвляется ещё один, затем первые два стебля снова разветвляются, затем все стебли, кроме двух последних, разветвляются, и так далее. Таким образом, каждый стебель после своего появления "пропускает" одно разветвление, а затем начинает делиться на каждом уровне разветвлений, что и даёт в результате Fibonacci numbers. Вообще говоря, у многих цветов (наExemplo, лилий) number лепестков является тем или иным numberм Фибоначчи. Также в ботанике известно явление ''филлотаксиса''. В качестве Exemploа можно привести расположение семечек подсолнуха: если посмотреть сверху на их расположение, то можно увидеть одновременно две серии спиралей (как бы наложенных друг на друга): одни закручены по часовой стрелке, другие — против. Оказывается, что number этих спиралей Exemploно совпадает с двумя последовательными числами Фибоначчи: 34 и 55 или 89 и 144. Аналогичные факты верны и для некоторых других цветов, а также для сосновых шишек, брокколи, ананасов, и т.д. Для многих растений (по некоторым данным, для 90% из них) верен и такой интересный факт. Рассмотрим какой- нибудь лист, и будем спускаться от него вниз до тех пор, пока не достигнем листа, расположенного на стебле точно так же (т.е. направленного точно в ту же сторону). Попутно будем считать все листья, попадавшиеся нам (т.е. расположенные по высоте между стартовым листом и конечным), но расположенными по-другому. Нумеруя их, мы будем постепенно совершать витки вокруг стебля (поскольку листья расположены на стебле по спирали). В зависимости от того, совершать витки по часовой стрелке или против, будет получаться разное number витков. Но оказывается, что number витков, совершённых нами по часовой стрелке, number витков, совершённых против часовой стрелки, и number встреченных листьев образуют 3 последовательных Fibonacci numbers. Впрочем, следует отметить, что есть и растения, для которых приведённые выше подсчёты дадут числа из совсем других последовательностей, поэтому нельзя сказать, что явление филлотаксиса является законом, — это скорее занимательная тенденция.

Свойства

Fibonacci numbers обладают множеством интересных математических свойств. Вот лишь некоторые из них:

● Соотношение Кассини:

● Правило "сложения":

● Из предыдущего равенства при

вытекает:

● Из предыдущего равенста по индукции можно получить, что

всегда кратно

.

● Верно и обратное к предыдущему утверждение:

если

кратно

, то

кратно

.

● НОД-равенство:

● По отношению к Algoritmoу Евклида Fibonacci numbers обладают тем замечательным свойством, что они

являются наихудшими Entradaными данными для этого Algoritmoа (см. "Теорема Ламе" в Algoritmoе Евклида).

Фибоначчиева система счисления

Теорема Цекендорфа утверждает, что любое натуральное number

можно представить единственным образом

в виде суммы чисел Фибоначчи:

где

,

,

,

(т.е. в записи нельзя использовать два соседних Fibonacci numbers). Отсюда следует, что любое number можно однозначно записать в фибоначчиевой системе счисления, наExemplo:

причём ни в каком числе не могут идти две единицы подряд. Нетрудно получить и правило прибавления единицы к числу в фибоначчиевой системе счисления: если младшая цифра равна 0, то её заменяем на 1, а если равна 1 (т.е. в конце стоит 01), то 01 заменяем на 10. Затем "исправляем" запись, последовательно исправляя везде 011 на 100. В результате за линейное время будет получена запись нового числа. Перевод числа в фибоначчиеву систему счисления осуществляется простым "жадным" Algoritmoом: просто перебираем Fibonacci numbers от больших к меньшим и, если некоторое

, то

Entradaит в запись числа

, и

мы отнимаем

от

и продолжаем поиск.

Формула для n-го Fibonacci numbers

Формула через радикалы

Существует замечательная формула, называемая по имени французского математика Бине (Binet), хотя она была известна до него Муавру (Moivre): Эту формулу легко доказать по индукции, однако вывести её можно с помощью понятия образующих функций или с помощью решения функционального уравнения. Сразу можно заметить, что второе слагаемое всегда по модулю меньше 1, и более того, очень быстро убывает (экспоненциально). Отсюда следует, что значение первого слагаемого даёт "почти" значение

. Это

можно записать в строгом виде: где квадратные скобки обозначают округление до ближайшего целого. Впрочем, для практического Applications в вычислениях эти формулы мало подходят, потому что требуют очень высокой точности работы с дробными числами.

Матричная формула для чисел Фибоначчи

Нетрудно доказать матричное следующее равенство:

Но тогда, обозначая

получаем:

Таким образом, для нахождения

-го Fibonacci numbers надо возвести матрицу

в степень

.

Вспоминая, что возведение матрицы в

-ую степень можно осуществить за

(см. Бинарное возведение

в степень), получается, что

-ое number Фибоначчи можно легко вычислить за

c использованием

только целочисленной арифметики.

Периодичность последовательности Фибоначчи по модулю

Рассмотрим последовательность Фибоначчи

по некоторому модулю

. Докажем, что она является периодичной,

и причём период начинается с

(т.е. предпериод содержит только

).

Докажем это от противного. Рассмотрим

пар чисел Фибоначчи, взятых по модулю

:

Поскольку по модулю

может быть только

различных пар, то среди этой последовательности найдётся как

минимум две одинаковые пары. Это уже означает, что последовательность периодична. Выберем теперь среди всех таких одинаковых пар две одинаковые пары с наименьшими номерами. Пусть это пары

с некоторыми номерами

и

. Докажем, что

. Действительно, в противном случае

для них найдутся предыдущие пары

и

, которые, по свойству чисел Фибоначчи, также

будут равны друг другу. Однако это противоречит тому, что мы выбрали совпадающие пары с наименьшими номерами, что и требовалось доказать.

References

● Роналд Грэхэм, Дональд Кнут, Орен Паташник. Конкретная математика [1998]

C# solução

rascunho automático, revisar antes de enviar
// C# draft for: Числа Фибоначчи
// Original e-maxx article has no compact code listing in the extracted PDF text.

C++ solução

correspondente/original
// C++ source for: Числа Фибоначчи
// Compact code block was not extracted from this article.

Java solução

rascunho automático, revisar antes de enviar
// Java draft for: Числа Фибоначчи
// Original e-maxx article has no compact code listing in the extracted PDF text.

Материал разбит как Algoritmoическая Tarefa: изучить постановку, понять асимптотику и реализовать Algoritmo на выбранном языке.

Vacancies for this task

vagas ativas with overlapping task tags are mostradas.

Todas as vagas
Ainda não há vagas ativas.