stringtranslate.com

проблема Иосифа Флавия

Интерпретация Клодом Гаспаром Баше де Мезириаком задачи Иосифа Флавия с 41 солдатом и шагом 3, показывающая, что позиции 16 и 31 убиваются последними — время движется внутрь по спирали, зеленые точки обозначают живых солдат, серые мертвые солдаты, а крестики — убийства

В информатике и математике проблема Иосифа (или перестановка Иосифа ) — это теоретическая проблема, связанная с определенной игрой-счётом . Такие игры используются для выбора человека из группы, например, eeny, meeny, miny, moe .

Рисунок для последовательности задач Иосифа Флавия для 500 человек и пропускаемого значения 6. Горизонтальная ось — номер человека. Вертикальная ось (сверху вниз) — время (номер цикла). Живой человек нарисован зеленым цветом, мертвый — черным. [1]

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

Задача — учитывая количество людей, начальную точку, направление и количество пропущенных объектов — выбрать позицию в начальном круге, чтобы избежать казни.

История

Задача названа в честь Иосифа Флавия , еврейского историка и лидера, жившего в I веке. Согласно рассказу Иосифа Флавия об осаде Йодфата , он и его 40 солдат были заперты в пещере римскими солдатами . Они предпочли самоубийство пленению и остановились на последовательном методе совершения самоубийства путем жеребьевки. Иосиф утверждает, что по счастливой случайности или, возможно, по воле Бога, он и еще один человек остались до конца и сдались римлянам, а не покончили с собой. Это история, приведенная в Книге 3, Главе 8, Части 7 «Иудейской войны » Иосифа Флавия ( писавшего о себе в третьем лице ):

Однако в этом крайнем бедствии он не был лишен своей обычной проницательности; но, доверившись провидению Божьему, он подверг свою жизнь опасности [следующим образом]: "И теперь", сказал он, "поскольку среди вас решено, что вы умрете, давайте предоставим нашу общую смерть определению жребия. Тот, кому жребий выпадет первым, пусть будет убит тем, кому выпадет второй жребий, и таким образом удача будет совершать свой прогресс через всех нас; и никто из нас не погибнет от своей собственной правой руки, ибо было бы несправедливо, если бы, когда остальные уйдут, кто-то раскаялся и спас себя". Это предложение показалось им очень справедливым; и когда он убедил их решить этот вопрос жребием, он вытянул один из жребиев и для себя. Тот, у кого был первый жребий, обнажил свою шею тому, у кого был следующий, как будто предполагая, что генерал умрет среди них немедленно; ибо они думали, что смерть, если Иосиф умрет вместе с ними, слаще жизни; но он был с другим, оставленным до последнего, должны ли мы сказать, что это произошло так случайно, или по провидению Божию. И поскольку он очень не желал ни быть осужденным жребием, ни, если бы он был оставлен до последнего, обагрить свою правую руку кровью своих соотечественников, он убедил его довериться своей верности ему и жить так же хорошо, как и он сам.

—  Иосиф Флавий, стр. 579, «Иудейские войны», книга III, гл. 8, параграф 7

Детали механизма, использованного в этом подвиге, довольно расплывчаты. Согласно Джеймсу Дауди и Майклу Мейсу, [2] в 1612 году Клод Гаспар Баше де Мезириак предложил конкретный механизм расстановки людей в круг и подсчета по трое для определения порядка выбывания. [3] Эта история часто повторялась, и конкретные детали значительно различаются от источника к источнику. Например, Израиль Натан Херштейн и Ирвинг Каплански (1974) заставляют Иосифа и 39 товарищей стоять в кругу, и каждый седьмой человек выбывает. [4] Историю проблемы можно найти в письме С. Л. Забелла редактору Fibonacci Quarterly . [5]

Что касается преднамеренности, Иосиф Флавий спросил: «Должны ли мы отнести это на счет божественного провидения или просто удачи?» [6] Но сохранившаяся славянская рукопись Иосифа Флавия рассказывает другую историю: что он «хитро подсчитал числа и таким образом сумел обмануть всех остальных». [6] [7] У Иосифа был сообщник; проблема тогда заключалась в том, чтобы найти места двух последних оставшихся в живых (чей заговор обеспечил бы их выживание). Утверждается, что он поместил себя и другого человека на 31-е и 16-е места соответственно (для k = 3 ниже). [8]

Варианты и обобщения

Вариант задачи Иосифа Флавия с 30 людьми и шагом 9 — время движется внутрь по спирали, зеленые точки обозначают живых солдат, серые — мертвых солдат, а кресты — убийства.

Средневековая версия задачи Иосифа Флавия включает 15 турок и 15 христиан на борту корабля во время шторма, который затонет, если только половина пассажиров не будет выброшена за борт. Все 30 встают в круг, и каждый девятый человек должен быть выброшен в море. Христианам нужно определить, где встать, чтобы гарантировать, что будут выброшены только турки. [9] В других версиях роли турок и христиан меняются местами.

Грэм, Кнут и Паташник 1989, стр. 8 описывают и изучают «стандартный» вариант: определяют, где находится последний выживший, если в начале игры есть n человек, а каждый второй человек ( k = 2 ниже) выбывает.

Обобщение этой проблемы выглядит следующим образом. Предполагается, что каждый m -й человек будет казнен из группы размером n , в которой p -й человек является выжившим. Если в круг добавляется x человек, то выживший находится в p + mx -й позиции, если она меньше или равна n + x . Если x - наименьшее значение, для которого p + mx > n + x , то выживший находится в позиции ( p + mx ) − ( n + x ) . [10]

Решение

Предпоследнее (розовое) и конечное (ультрамариновое) места в задаче Иосифа Флавия для различных размеров групп, n и размеров шагов, k . В файле SVG наведите курсор на значения, чтобы увидеть полный порядок убийства.

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

к= 2

Задача решается явно, когда каждый второй человек будет убит (каждый человек убивает человека слева или справа), т. е . . (Для более общего случая решение изложено ниже.) Решение выражается рекурсивно . Пусть обозначает положение выжившего, когда изначально n человек (и ). При первом прохождении круга все четные люди умирают. При втором прохождении круга умирает новый 2-й человек, затем новый 4-й человек и т. д.; как будто первого прохождения круга не было.

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

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

Если значения свести в таблицу и выявить закономерность ( OEIS : A006257 , также самый левый столбец синих чисел на рисунке выше):

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

Теорема: Если и , то .

Доказательство: Сильная индукция используется по n . Базовый случай истинен. Случаи рассматриваются отдельно, когда n четное и когда n нечетное.

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

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

l можно решить, получив явное выражение для :

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

Реализация: Если n обозначает количество людей, то безопасное положение задается функцией , где и .

Теперь, если число представлено в двоичном формате, первый бит обозначает , а остальные биты будут обозначать l . Например, когда , его двоичное представление будет:

п = 1 0 1 0 0 12 м = 1 0 0 0 0 0л = 0 1 0 0 1
/** * @param n количество людей, стоящих в круге * @return безопасное положение, которое переживет казнь * f(N) = 2L + 1, где N =2^M + L и 0 <= L < 2^M */ public int getSafePosition ( int n ) { // найти значение L для уравнения int valueOfL = n - Integer . highestOneBit ( n ); return 2 * valueOfL + 1 ; }              

Побитовый

Самый простой способ найти безопасную позицию — использовать побитовые операторы . В этом подходе сдвиг наиболее значимого бита набора n к наименее значимому биту вернет безопасную позицию. [11] Входные данные должны быть положительным целым числом .

п = 1 0 1 0 0 1п = 0 1 0 0 1 1
/** * @param n (41) количество людей, стоящих в круге * @return безопасное положение, которое переживет казнь */ public int getSafePosition ( int n ) { return ~ Integer . highestOneBit ( n * 2 ) & (( n << 1 ) | 1 ); // ---------------------- --- | ------------ // Получить первый установленный бит | | Сдвиг влево n и инвертирование последнего бита // и взять его дополнение | | // | | // Умножить n на 2 | // Побитовое И для копирования битов, которые существуют в обоих операндах. }                

к= 3

В 1997 году Лоренц Хальбейзен и Норберт Хунгербюлер открыли замкнутую форму для случая . Они показали, что существует определенная константа

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

если округляется в большую сторону иначе

для всех .

В качестве примера вычисления Хальбейзен и Хунгербюлер приводят (что на самом деле является оригинальной формулировкой проблемы Иосифа Флавия). Они вычисляют:

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

Это можно проверить, посмотрев на каждый последующий проход по числам.1 через41 :

1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41
2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40.
2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 35, 38
2, 4, 11, 16, 22, 25, 31, 35
2, 4, 16, 22, 31, 35
4, 16, 31, 35
16, 31
31

Общий случай

Динамическое программирование используется для решения этой задачи в общем случае путем выполнения первого шага и последующего использования решения оставшейся задачи. Когда индекс начинается с единицы, то человек в смещается от первого человека в позицию , где n — общее количество людей. Пусть обозначает позицию выжившего. После того, как -й человек убит, остается круг , и следующий подсчет начинается с человека, номер которого в исходной задаче был . Позиция выжившего в оставшемся круге будет , если подсчет начинается с ; смещение этого с учетом того факта, что начальная точка — , дает рекуррентность [12]

который принимает более простую форму

если позиции пронумерованы от до .

Этот подход имеет время выполнения , но для малых и больших есть другой подход. Второй подход также использует динамическое программирование, но имеет время выполнения . Он основан на рассмотрении убийства k -го, 2 k -го, ..., -го людей как одного шага, затем изменение нумерации. [ необходима цитата ]

Этот улучшенный подход принимает форму

Ссылки

Цитаты

  1. ^ R.Ugalde, Laurence. "Проблема Иосифа в языке программирования Fōrmulæ". Fōrmulæ . Получено 26 июля 2021 г. .
  2. Доуди и Мейс 1989, стр. 125.
  3. Баше 1612, стр. 174.
  4. Херштейн и Каплански 1974, стр. 121–126.
  5. ^ Забелл 1976, стр. 48, 51.
  6. ^ Коэн, Ричард. Создание истории: Рассказчики, сформировавшие прошлое , стр. 54 (Simon & Schuster 2022).
  7. ^ https://gustavus.edu/mcs/max/concrete-abstractions-pdfs/chapter3.pdf [ пустой URL PDF ]
  8. Рауз Болл 1905, стр. 19.
  9. Ньюман 1988, стр. 2403–2405.
  10. Робинсон 1960, стр. 47–52.
  11. ^ «Проблема Иосифа с использованием побитовой операции (Java)». GitHub . 7 января 2018 г. Получено 7 января 2018 г.
  12. ^ Пак и Тейшейра, 2018, стр. 1–7.

Источники

Дальнейшее чтение

Внешние ссылки