рекуррентный рекуррентный

Хорошо, я борюсь с конкретной математикой Кнута, и есть несколько примеров, которые я еще не понимаю.

J(n) = 2*J(n/2) - 1

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

J(n) = (2^k)*J(n/(2^k)) - (2^k - 1)

И я застрял здесь. Любая помощь или подсказки будут оценены.


person user1745356    schedule 16.04.2013    source источник
comment
J(1)=1, J(2)=2*1-1=1, J(4)=2*1-1=1, J(8)=2*1-1=1... Есть еще к проблеме Иосифа Флавия, чем это повторение.   -  person n. 1.8e9-where's-my-share m.    schedule 17.04.2013
comment
На странице 8 этой версии книги Кнута начинается довольно длинное объяснение, включающее множество различных уравнений и доказательств — cse.iitb.ac.in/~vsevani/   -  person גלעד ברקן    schedule 17.04.2013


Ответы (3)


Сначала я напомню проблему Иосифа Флавия.

У нас в кругу собралось n человек. Палач будет обрабатывать круг следующим образом:

  1. Палач начинает с человека на позиции i = 1
  2. Находясь в позиции i, он щадит i, но убивает человека, следующего за i
  3. Он выполняет это до тех пор, пока в живых не останется только один человек.

Быстро взглянув на эту процедуру, мы можем увидеть, что каждый человек в ровном положении будет убит в первом проходе. Когда все «четные» мертвы, кто оставшиеся люди? Ну, это зависит от четности n.

Если n четно (скажем, n = 2i), то оставшихся людей 1,3,5,...,2i-1. Оставшаяся проблема — это круг из i человек вместо n. Давайте введем отображение mapeven между позицией в «новом» круге и исходной позицией в кругу из n человек.

картачетный(x) = 2.x - 1

Это означает, что человек на позиции x в новом круге был на позиции 2.x - 1 в исходном. Если положение выжившего в новом круге равно J(i), то положение, которое должен занять кто-то, чтобы выжить в кругу из n = 2.i человек, равно

mapчетный(J(i)) = 2.J(i) - 1

У нас есть первое правило рекурсии:

Для любого целого числа n :
J(2.n) = 2.J(n) - 1

Но если n нечетно (n = 2.j + 1), то первый запуск заканчивается убийством всех «четных», а палач находится на позиции n. n последователей равно 1 ... Таким образом, следующим будет убит 1. Выживших 3,5,..,2j+1 и палач действует так, как если бы у нас был круг из j человек. Отображение немного отличается от четного случая:

картанечетная(x) = 2.x + 1

3 — это новая 1, 5 — это новая 2 и так далее…

Если позиция выжившего в кругу из j человек равна J(j), то человек, который хочет выжить в кругу из n = 2j+1, должен занять позицию J(2j+1):

J(2j+1) = mapнечетное(J(j)) = 2.J(j) + 1

Нарисовано второе рекурсивное отношение:

Для любого целого числа n имеем:
J(2.n + 1) = 2.J(n) + 1

Теперь мы можем вычислять J(n) для ЛЮБОГО целого числа n, используя 2 рекурсивных соотношения. Но если мы посмотрим немного дальше, мы можем сделать это лучше...

Как следствие, для каждого n = 2k мы имеем J(n) = 1. Хорошо, но для других чисел? Если вы запишете первые результаты (скажем, до n = 20), вы увидите, что последовательность кажется псевдопериодической:
1 2 3 4 5 6 7 8 9 10 11
1 1 3 1 3 5 7 1 3 5 7

Начиная со степени двойки, кажется, что позиция увеличивается на 2 на каждом шаге до следующей степени двойки, где мы снова начинаем с 1... Поскольку для заданного целого числа n существует единственное целое число m(n), такое что

2m(n) ≤ n ‹ 2m(n)+1

Пусть s(n) будет целым числом, таким что n = 2m(n) + s(n) (я называю это "s" для "сдвига"). Математический перевод нашего наблюдения состоит в том, что J(n) = 1 + 2.s(n)

Докажем это с помощью сильной индукции.
При n = 1 имеем J(1) = 1 = 1 + 2.0 = 1 + 2.s(1)
При n = 2 имеем J(2) = 1 = 1 + 2,0 = 1 + 2.s(2)

Предполагая J(k) = 1 + 2.s(k) для любого k такого, что k ∈ [1,n], докажем, что J(n+1) = 1 + 2.s(n+1).

Имеем n = 2m(n+1) + s(n+1). Очевидно, что 2m(n) четно (за исключением тривиального случая, когда n = 1), поэтому четность n передается s(n).

Если s(n+1) четно, то мы обозначаем s(n+1) = 2j. У нас есть

J(n+1) = 2.J((n+1)/2) - 1 = 2.J(2m(n+1)-1 + j) - 1

Поскольку утверждение верно для любого k ∈ [1,n], оно верно для 1 ≤ k = (n+1)/2 ‹ n и, таким образом:

J(n+1) = 2.(2j + 1) - 1 = 2.s(n+1) + 1

Точно так же мы можем решить нечетный случай. Формула установлена ​​для любого целого числа n:

J(n) = 2.s(n) + 1, где m(n), s(n) ∈ ℕ — уникальные целые числа такие, что
2m(n) ≤ n ‹ 2 m(n)+1 и s(n) = n - 2m(n)
Другими словами: m(n) = ⌊ln 2(n)⌋ и s(n) = n - 2⌊ln2(n)⌋

person Rerito    schedule 17.04.2013

Начните с нескольких простых примеров, сделайте предположение, а затем используйте индукцию, чтобы (опровергнуть) ваше предположение.

Рассмотрим n = некоторая степень числа 2.

J (2 ^ 0) = 1 (дано)

J(2^1) = 2J(2^0) - 1 = 1

J(2^2) = 2J(2^1) - 1 = 1

Хорошо, предположим, что J(n) = 1 для всех n >= 1.

Базовый случай: J(1) = 1, что верно по определению.

Индуктивный шаг: предположим, что J(k) = 1 для некоторого произвольного k. Тогда J(2k) = 2J(k) - 1 = 1.

Следовательно, по индукции J (n) = 1 для всех n (при условии, что деление округляется до целых чисел).

person Rafe    schedule 17.04.2013
comment
Вы доказали только J(n) = 1 для каждого n, являющегося степенью двойки. - person Rerito; 17.04.2013
comment
Я так не думаю, если вы принимаете заключительное предположение о округлении деления до целых чисел. То есть (2n+1)/n = n и 2n/2 = n для целого числа n. Хм, хотя теперь вы заставляете меня думать, что мне нужна сильная индукция: предположим, что J(i) = 1 для всех i ‹= k. - person Rafe; 17.04.2013
comment
Не вижу смысла делать такое предположение. В исходной задаче, если вы займёте позицию 1 в круге, а число жертв будет нечетным, вы в конечном итоге умрёте, хотя хотели выжить. - person Rerito; 17.04.2013
comment
Разве более сильное предположение не позволяет нам доказать, что гипотеза индукции также верна для всех i, k ‹ i ‹= 2k? - person Rafe; 18.04.2013
comment
Цель индукционных отношений состоит в том, чтобы построить последовательность, начиная с набора базовых случаев. Здесь базовый случай J(1) = 1. Из этого случая вы можете построить J(2), используя отношение, затем J(4) ... J(2^k) и так далее ... Но вы не построили всю последовательность и не можете, потому что вам нужно еще одно отношение индукции, чтобы построить последовательность над ℕ - person Rerito; 18.04.2013
comment
Мне любопытно. Если у меня есть гипотеза индукции h, и у меня есть h(1), и если предположить, что h(i) для всех 1 ‹= i ‹= 2^k (для произвольного k), я могу показать h(i) для всех 1 ‹= i ‹= 2^(k+1), то разве я не показал h(i) для всех положительных натуральных чисел i? - person Rafe; 22.04.2013

J(n)=2*J(n/2)-1

J(n)-1=2*J(n/2)-2

J(n)-1=2*(J(n/2)-1)

T(n)=2*T(n/2), где T(n)=J(n)-1

T(n)=2^log2(n)*T(1)

J(n)=2^log2(n)*(J(1)-1)+1

person maxim1000    schedule 03.06.2013