что такое рекуррентная формула
Рекуррентная формула
Рекуррентная формула — формула вида , выражающая каждый член последовательности
через p предыдущих членов.
Общая проблематика вычислений с использованием рекуррентных формул является предметом теории рекурсивных функций.
Содержание
Примеры
Приложения
Рекуррентные формулы используются для описания времени работы алгоритма, рекурсивно обращающегося к самому себе. В такой формуле время, требуемое для решения задачи объемом ввода n, выражается через время решения вспомогательных подзадач. [1]
См. также
Примечания
Полезное
Смотреть что такое «Рекуррентная формула» в других словарях:
рекуррентная формула — — [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом EN recurrence formularecursion formula … Справочник технического переводчика
рекуррентная формула — rekurentinė formulė statusas T sritis fizika atitikmenys: angl. recurrence formula vok. Rekursionsformel, f rus. рекуррентная формула, f pranc. formule de récurrence, f … Fizikos terminų žodynas
Рекуррентная формула — (от лат. recurrens, родительный падеж recurrentis возвращающийся) формула приведения, формула, сводящая вычисление n го члена какой либо последовательности (чаще всего числовой) к вычислению нескольких предыдущих её членов. Обычно эти… … Большая советская энциклопедия
РЕКУРРЕНТНАЯ ТОЧКА — д и н а м и ч е с к о й с и с т е м ы точка хдинамич. системы ft (или, в иных обозначениях, f(t,.), см. [2]), заданной на метрич. пространстве S, удовлетворяющая условию: для всякого e>0 найдется T>0 такое, что все точки траектории ftx… … Математическая энциклопедия
Математическая формула — Эта статья об обозначениях элементарной математики; Для более общего контекста см.: Математические обозначения. Математическая формула (от лат. formula уменьшительное от forma образ, вид) принятая в математике (а также… … Википедия
Решение рекуррентных соотношений
Содержание
Определения [ править ]
[math] F_0 = 0,\qquad F_1 = 1,\qquad F_
Для этого можно использовать метод производящих функций (англ. generating function method).
Метод производящих функций [ править ]
Примеры [ править ]
[math]1[/math] пример [ править ]
Производящие функции позволяют решать рекуррентные соотношение механически по одному и тому же алгоритму. Рассмотрим общую схему на простом примере, который позволит продемонстрировать базовые приёмы работы.
Задано линейное однородное рекуррентное соотношение порядка [math]2[/math] с постоянными коэффициентами:
[math]\begin
Будем искать производящую функцию последовательности в виде
[math] G(z)=\displaystyle\sum_
Теперь сложим все уравнения для всех значений [math]n[/math] :
[math] \underbrace
Аналогичные манипуляции со второй суммой дают нам выражение
[math] \displaystyle\sum_
откуда получаем производящую функцию последовательности в замкнутом виде:
[math] G(z) = \dfrac
Теперь разобьём дробь на сумму простых дробей:
[math] \dfrac
Из этого разложения следует, что
[math] \dfrac<1><1-3z>= \displaystyle\sum_
С другой стороны, мы искали [math]G(z)[/math] в виде
[math] G(z)=\displaystyle\sum_
поэтому, в силу равенства рядов, [math]a_n=3^n-2^n[/math] (для [math]n\geqslant 0[/math] ).
[math]2[/math] пример: числа Фибоначчи [ править ]
Рассмотрим рекуррентное соотношение для чисел Фибоначчи:
[math]\begin
Первый шаг алгоритма мы уже выполнили, записав рекуррентное соотношение. Выполним второй шаг:
[math]\begin
Складываем все строчки:
[math] f_0 + f_1 z + \displaystyle\sum_
Третий шаг алгоритма требует привести все суммы к замкнутому виду:
[math]\begin
откуда получаем замкнутое выражение для производящей функции:
[math] G(z) = \dfrac
Осталось разложить её в ряд (чего требует четвёртый шаг алгоритма). С этой целью нужно разложить знаменатель на множители. Найдем корни уравнения:
[math]\displaylines< 1-z-z^2 = 0 \cr z_1=-\dfrac<1-\sqrt<5>><2>, z_2=-\dfrac<1+\sqrt<5>><2>. > [/math]
Нам известно разложение следующей рациональной функции:
[math] \dfrac<1> <1-z>= \displaystyle\sum_
Рассмотрим первую дробь и поделим в ней числитель и знаменатель на [math]z_1[/math] :
[math] \dfrac
Аналогично (но с делением на [math]z_2[/math] ) поступим со второй дробью:
[math] \dfrac
[math]3[/math] пример [ править ]
Рекуррентное соотношение:
[math] \begin
[math]4[/math] пример [ править ]
Рассмотрим следующее рекуррентное соотношение:
[math]\begin
Вспомним, что
[math] (z^n)’ = nz^
поэтому
[math] \displaystyle\sum_
Последняя сумма может быть свёрнута:
[math] \displaystyle\sum_
Подставив свёрнутое выражение обратно, имеем,
[math] z\biggl(\displaystyle\sum_
Это уравнение для производящей функции. Из него выражаем [math]G(z)[/math] :
[math] G(z) = \dfrac<1-6z+11z^2-5z^3><(1-6z+8z^2)(1-z)^2>. [/math]
Дальше мы знаем что делать со всеми этими дробями, кроме, разве лишь, первой. Рассмотрим её (без множителя) подробнее:
[math] \dfrac<1> <(1-z)^2>=(1-z)^ <-2>=\displaystyle\sum_
Вывод формулы n-ного члена для рекуррентной последовательности на примере задачи из квеста Амнезия
Пеленгский фермер Бух’ерик разводит хрякоплюхов. Эти животные размножаются так быстро, что их поголовье ежедневно возрастает в 3 раза. Но, начиная со второго дня, на ферму повадилась нападать стая страшных зверей долбогрызов, каждый вечер пожирающих вдвое больше хрякоплюхов, чем их было в предыдущий день. Сколько хрякоплюхов будет у фермера на 7-й вечер, если вначале их было 10?
Вы спросили у гаальца, что он думает по поводу этой задачки. После некоторого размышления тот ответил:
— В начале было 10 хрякоплюхов. В первый день они размножились, и к началу второго дня их стало 30. Во второй день они опять размножились (их стало 90), но вечером пришли долбогрызы и съели вдвое больше хрякоплюхов, чем было вчера (в первый день), т.е. 20 штук. Итого, в начале третьего дня получаем 70 хрякоплюхов. Мне кажется, что, продолжая решать таким образом, можно вычислить число хрякоплюхов в любой день.
Это задача из игры «Космические Рейнджеры 2», квест Амнезия.
Попробуем вывести формулу для количества хрякоплюхов на n-ный день, и посчитать для примера количество хрякоплюхов на 32-й день.
Посмотрим на первые несколько дней (я добавил день «0» только для удобства формулы, можно все делать и без него)
День «0» | День 1 | День 2 | День 3 | |
---|---|---|---|---|
Утро | 0 | 10 | 30 | 70 |
После размножения | 0 | 10 * 3 = 30 | 30 * 3 = 90 | 70 * 3 = 210 |
После долбогрызов (вечер) | 0 | 10 * 3 — 0 * 2 = 30 | 30 * 3 — 10 * 2 = 70 | 70 * 3 — 30 * 2 = 150 |
Нас будет интересовать количество хрякоплюхов на утро n-ного дня, и, несмотря на то, что в задаче спрашивается про вечер, верным будет утреннее количество.
Таким образом, количество хрякоплюхов (на утро) являет собой последовательность
Про эту последовательность мы знаем (по условию задачи) что и
Так же, по условию задачи, ночью ничего не происходит, поэтому хрякоплюхи вечером в полном составе без изменений переносятся на утро следующего дня (т.е. количество хрякоплюхов утром равно их количеству вечером предыдущего дня).
Т.е. на утро второго дня их стало .
На утро третьего дня их уже .
День n-2 | День n-1 | День n | |
---|---|---|---|
Утро | |||
После размножения | |||
После долбогрызов (вечер) |
Начиная со второго дня действует такая рекуррентная формула:
Итого, ещё раз всё вместе
Мы получили формальное определение последовательности и этого уже достаточно чтобы можно было вручную посчитать сколько будет хрякоплюхов на какой день. Более того, если у нас магическим образом появилась какая-то формула для , и эта формула выполняется для этих 3-х условий, то эта формула будет тем, что нам нужно.
Мы же будем пытаться получить эту формулу.
Как правило, чтобы что-то найти нужно составить уравнение, поэтому так и поступим.
Наша последовательность — это то, что мы хотим найти (точнее, мы хотим получить формулу для её членов).
Будем делать уравнение из последовательностей. Для этого изобретём сложение для последовательностей:
Т.е. сумма последовательностей есть тоже последовательность.
Важно упомянуть что наши последовательности вообще-то бесконечные, и так просто что-то с ними делать нельзя. Нельзя, к примеру, безо всяких оговорок просуммировать все члены последовательности — никто не может бесконечное время сидеть и суммировать.
Бесконечная последовательность — это то, где для любого номера члена мы можем сказать как его посчитать за конечное время. В случае последовательности мы как бы говорим: возьмите день0, возьмите день1 и далее потихоньку, шаг за шагом, считайте следующие дни пока не дойдёте до нужного вам.
Для суммы последовательностей мы говорим: если вам нужен 100-й член суммы, то возьмите по 100-му члену из слагаемых последовательностей и сложите их. Нужен миллионный — так же, возьмите миллионный там, возьмите миллионный сям, сложите эти числа и получите что вам нужно.
Это похоже на то, как суммируются многочлены, к примеру:
Можно даже представить себе бесконечный многочлен
где — просто какие-то символы. И если мы складываем два таких «бесконечночлена», то их сумма будет как раз сумма последовательностей (мы так определили сумму последовательностей).
Тут важно понимать что на самом деле нет никаких бесконечных многочленов, это просто иная но более удобная запись бесконечной последовательности: пишем , а видим
.
Теперь придумаем умножение для последовательностей. Просто попарно перемножить члены так же как со сложением не пойдёт — хотя это и будет похоже на умножение, интересных свойств это не даст. Да и хочется чтобы умножение было бы похоже на умножение многочленов.
К примеру, вот так умножаются обычные конечные многочлены:
Берутся и перемножаются: раскрываются скобки, и группируются члены с одной и той же степенью икса
Другими словами, каждый член первого многочлена умножается на каждый член второго.
Каждый с каждым.
Так просто это обобщить на бесконечные последовательности нельзя — опять же, потому что никто не может бесконечное количество раз умножить на бесконечное количество элементов. Тут важно правильно сказать, а именно что пускай n-ный член произведения последовательностей равен
Теперь мы умеем складывать бесконечные последовательности и так же умеем их перемножать. Можно заметить некоторые хорошие свойства, к примеру что ;
;
. Мы придумали это сложение и умножение, нужно обязательно проверять что такие свойства выполняются (это «группа» и «кольцо»). Это несложно проверить, и, в целом-то, эти все свойства довольно естественны, особенно для тех кто хоть сколько-то складывал и умножал конечные многочлены.
Попробуем теперь для примера посчитать . Согласно определению умножения получаем
Выглядит логично — умножение последовательности на число даст умножение каждого члена на это число. И это сходится с
Важное замечание: , где соответственно
Теперь посчитаем . Так же согласно определению умножения получаем
Что, собственно, так же сходится с
Так же получаем что .
Это базовые операции над нашей последовательностью, и теперь вот это всё хорошо бы собрать и применить к начальной рекуррентной формуле :
Из первой строчки вычитаем вторую и прибавляем третью:
Итого получаем (используя хорошие свойства сложения и умножения):
что, напомню еще раз, на самом деле
Это и есть уравнение, и его мы будем решать. Мы не можем взять так просто и поделить на , хотя бы потому что мы не определяли операцию деления. Вместо этого мы будем умножать обе части уравнения на что-то такое, что как бы является
, и в конечном итоге оставим одинокую F слева.
На текущий момент из того что мы имееем мы не можем достоверно сказать существует ли вообще такое (хотя так-то оно существует, и мы его сейчас сделаем).
Но из этого абсолютно не следует что если , то
. К примеру, из того что
вовсе не следует что
.
Для того, чтобы было верно
нужно чтобы существовал такой элемент , что
.
Тогда можно получить что
Это, опять же, не просто так, это потому что последовательность умноженная на
и умноженная на
даёт в результате
Вот теперь уже чуть легче, теперь хорошо бы отыскать такие и
, да и умножить на них наше уравнение.
Такие обратные последовательности есть, и вот их формула
Ясно что , тут без вариантов. Теперь посмотрим что может получится у 1-й степени x:
(я просто покомпонентно перемножаю первую последовательность на вторую). Ясно что
. Так же далее получаем что
.
Для общего случая действуем подобным образом.
Посмотрим повнимательней на
По определению произведения получаем формулу для n-ного члена:
При умножении на все члены умножились на 10 и сдвинулись на 1 вправо.
Итого получаем результат
Именно эту формулу нужно использовать для прохождения квеста, и именно её можно найти в подсказках в квесте.
К примеру на 32-й день получаем .
Глядя на формулу можно сказать что хрякоплюхам долбогрызы не помеха — они даже будучи поедаемыми успевают экспоненциально размножаться.
Таким же образом можно вывести формулу для n-ного члена последовательности Фибоначчи, правда там числа будут пострашней — с корнями, и при этом при любом n формула даст натуральное число.
Если реализовывать алгоритм расчета хрякоплюхов согласно рекуррентному определению (необязательно при этом использовать рекурсию), то сложность получается O(n).
А вот если по формуле — то тут можно и поспорить, будет ли это O(n) либо O(1). Зависит как мы считаем 2**n — это O(1) или O(n). С одной стороны, это битовый сдвиг, с другой стороны при n больших чем разрядность процессора потребуется больше времени на вычисления.
К примеру, если сделать Ethereum контракт, который будет считать этих хрякоплюхов, и посмотреть что получится по потреблению gas в зависимости от алгоритма: