Проблема Иосифа

Проблема Иосифа Флавия или перестановка Иосифа Флавия - теоретическая проблема информатики или математики .

В схеме расположены пронумерованные объекты; затем, начиная с номера , удаляется каждый- й объект, круг снова и снова замыкается. Порядок удаленных объектов называется перестановкой Иосифа Флавия.

Цель этой задачи - определить последний объект данной перестановки и .

история

Проблема была названа в честь еврейского историка Флавия Иосифа , который спрятался от римлян в пещере с 40 другими мужчинами во время битвы за галилейский город Йотапата в 67 г. н.э. (всего 41 человек). Он сообщает об этом в своей книге « Еврейская война» (книга 3, глава 8). Когда убежище было предано, римляне попросили их сдаться в плен. Однако его последователи предпочли смерть и предпочли умереть коллективным самоубийством , порядок решал жребий. К счастью, Иосиф и еще один мужчина сдались последними. Позже это было превращено в головоломку, в которой каждый должен выстроиться в круг и каждый третий должен быть убит своим правым соседом. В этом особом случае Иосиф занял 16-е место, оставшись предпоследним и обогнав более слабого на 31-м месте. Оба сдались римлянам и выжили.

После Вильгельма Аренс , Кардано назвал проблему типа Иосифа игра (Ludus Josephi) в своей работе Practica arithmeticae (1539), но он был старше. После Морица Кантора его можно найти в рукописи Николя Шуке La triparty en la science des nombres (Лион, 1484 г.). Проблемой занимается также Клод Гаспар Баше де Мезириак (Problèmes plaisans et delectables, 1612), который также предлагает вариант: 15 турок и 15 христиан находятся на корабле в шторм. Капитан должен пожертвовать 15 из них, чтобы корабль не затонул, и выстроил их в ряд, причем каждый девятый был принесен в жертву.

решение

Проблема здесь решается в случае удаления каждого 2-го элемента ( ). Для общего случая решение следует ниже. Решение выводится с помощью рекурсии. обозначают последний элемент перестановки, если элементы присутствовали в начале (с ). На первом проходе удаляются все четные элементы. Во втором раунде элементы, которые находятся в новой позиции 2, 4 и т. Д., Удаляются, как если бы первого раунда не было. Если начальное количество элементов четное, то элемент из второго раунда был на позиции в первом раунде . Элемент изначально был на месте . Это приводит к следующей формуле рекурсии:

Если количество элементов вначале нечетное, то первоначальный первый элемент удаляется во втором раунде, но здесь также удаляется новый 2-й, 4-й и т. Д. Элемент. В этом случае оказывается, что Element был на позиции на первом круге . Отсюда следует формула рекурсии:

Если вы отобразите значения для и в таблице, вы увидите закономерность:

1 2 3 4-й 5 6-е 7-е 8-е 9 10 11 12-е 13-е 14-е 15-е 16
1 1 3 1 3 5 7-е 1 3 5 7-е 9 11 13-е 15-е 1

Эта таблица предполагает, что существует возрастающая последовательность нечетных чисел, которая начинается снова, когда индекс равен степени двойки. Если кто-то выбирает и так то, а потом следует . Очевидно, что значения из таблицы удовлетворяют этому уравнению. Доказательство дается ниже по полной индукции .

Утверждение: Если и , то следует .

Доказательство: полная индукция окончена . Дело верно. Рассмотрим отдельно случаи для четного и нечетного .

Если прям, то выбирайте и так, что и . Это применимо . Имеем место, где второе уравнение следует из предположения индукции.

Если нечетное, то выберите одно и такое, что и . Это применимо . Имеем место, где второе уравнение также следует из предположения индукции. Следовательно, утверждение доказано.

Наиболее элегантная форма решения следует из двоичного представления : может быть определена сама по себе 1-битным поворотом влево . Если один представлен в двоичном формате как , то решение задается как . Доказательство следует из представления as .

В закрытом виде решение для случая k = 2:

со скобкой Гаусса (функция округления)

Также существует решение в закрытой форме для случая k = 3.

Динамическое программирование является самым простым способом решить эту проблему в общем случае.

В этом методе используется формула рекурсии:

, С участием

что очевидно, если учесть, как изменяется номер последнего элемента при переходе от к . Этот метод имеет время выполнения , но существует другой подход как для малых, так и для крупных . Этот второй подход также использует динамическое программирование, но требует только времени выполнения . Снимает к ., 2 к ., ..., . Элементы за один шаг, а затем меняет нумерацию.

выполнение

Следующий алгоритм рекурсивно реализует проблему в соответствии с приведенной выше формулой рекурсии для случая k = 2 и имеет время работы O (log (n)) .

int josephus(int n) 
{
    if(n == 1) 
        return 1;

    if((n%2) == 0) 
        return 2 * josephus(n / 2) - 1;

    if((n%2) == 1) 
        return 2 * josephus((n - 1) / 2) + 1;
}

Согласно закрытой формуле f (n) = 2 * l + 1 может быть указан следующий нерекурсивный алгоритм. Его время работы составляет O (1) .

int josephus(int n)
{
    m = floor( log2(n) );
    l = n - 2^m;
    j = 2*l + 1;

    return j;
}

литература

веб ссылки

Индивидуальные доказательства

  1. Аренс, Mathematische Unterhaltungen und Spiele, Teubner 1901, глава 15, стр. 286ff
  2. ^ Мориц Кантор, Лекции по истории математики, Том 2, стр. 332
  3. ^ Проблема Флавий , MathWorld
  4. Л. Хальбайзен, Н. Хунгербюлер: Проблема Иосифа Флавия , J. Théor. Nombres Bordeaux, Том 9, 1976, стр. 303-318.