Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В информатике и математике , то проблема Флавия (или Флавий перестановка ) теоретическая проблема , связанная с определенной считалкой .

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

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

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

История [ править ]

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

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

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

У Иосифа был сообщник; тогда проблема заключалась в том, чтобы найти места двух последних оставшихся в живых (чей заговор обеспечил их выживание). Утверждается, что он поставил себя и другого мужчину на 31-е и 16-е места соответственно. [7]

Варианты и обобщения [ править ]

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

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

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

Решение [ править ]

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

k = 2 [ редактировать ]

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

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

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

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

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

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

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

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

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

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

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

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

Теперь, если мы представим число в двоичном формате, первый бит будет обозначать, а оставшиеся биты будут обозначать . Например, когда n = 41, его двоичное представление будет

п = 1 0 1 0 0 1

2 м = 1 0 0 0 0 0

л = 0 1 0 0 1

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

Побитовое [ править ]

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

п = 1 0 1 0 0 1

п = 0 1 0 0 1 1

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

k = 3 [ редактировать ]

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

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

если бы мы собрали еще

для всех .

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

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

Мы можем проверить это, просматривая каждый последующий проход чисел через :

Общий случай [ править ]

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

которая принимает более простой вид

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

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

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

Примечания [ править ]

  1. ^ Флавий проблема . Решение задачи Иосифа Флавия в Розеттском кодексе , написанном на языке Fōrmulæ. Вики по Fōrmulæ . Проверено 19 сентября 2019 года.
  2. ^ Флавий Иосиф , Войны евреев III. 8. 7. (Перевод Уильяма Уистона).
  3. ^ Dowdy & Mays 1989 , стр. 125
  4. ^ Баше, CG (1612). Problemes Plaisants ed Delectables qui se font par les Nombres . п. 174.
  5. ^ Herstein, IN; Капланский, И. (1974). Вопросы математические . Харпер и Роу. С.  121–126 .
  6. ^ Zabell, SL (1976). "Письмо редактору". Ежеквартальный отчет Фибоначчи . 14 : 48, 51.
  7. Перейти ↑ Rouse Ball, WW (1896). Математические развлечения и эссе (2-е изд.). Макмиллан.
  8. Перейти ↑ Newman, JR (1988). Мир математики . 4 . Темпус. С. 2403–2405.
  9. ^ Грэм, RL; Knuth, DE ; Паташник, О. (1989). Конкретная математика: фонд компьютерных наук . Эддисон Уэсли. п. 8. ISBN 978-0-201-14236-5.
  10. ^ Робинсон, WJ (1960). «Проблема Иосифа». Математический вестник . 44 (347): 47–52. DOI : 10.2307 / 3608532 . JSTOR 3608532 . 
  11. ^ «Проблема Иосифа с использованием побитовой операции (Java)» . GitHub . 7 января 2018 . Проверено 7 января 2018 года .
  12. Пак, Чан-Ву; Тейшейра, Рикардо (2018). «Серийная казнь Иосифа Проблема». Корейский J. Math . 26 (1): 1–7. DOI : 10,11568 / kjm.2018.26.1.1 .

Ссылки [ править ]

  • Робинсон, WJ (1960). «Проблема Иосифа Флавия». Математика. Вестник . 44 (347): 47–52. DOI : 10.2307 / 3608532 . JSTOR  3608532 .
  • Вудхаус, Дэвид (1973). «Расширенная проблема Иосифа Флавия». Преподобный Мат. Hisp.-амер . 33 (4): 207–218.
  • Якобчик, Ф. (1973). «Об обобщенной проблеме Иосифа Флавия». Glasow Math. Дж . 14 (2): 168–173. DOI : 10.1017 / S0017089500001919 .
  • Ллойд, Эррол Л. (1983). «Алгоритм O (n logm) для проблемы Иосифа Флавия». J. Algor . 4 (3): 262–270. DOI : 10.1016 / 0196-6774 (83) 90025-1 .
  • Дауди, Джеймс; Мэйс, Майкл Э. (1989). "Иосиф Флавий Перестановки" . Журнал комбинаторной математики и комбинаторных вычислений . 6 : 125–130.
  • Одлызко, Андрей М .; Уилф, Герберт С. (1991). «Функциональная итерация и проблема Иосифа Флавия». Glasgow Math. Дж . 33 (2): 235–240. DOI : 10.1017 / S0017089500008272 .
  • Halbeisen, L .; Hungerbühler, Н. (1997). «Проблема Иосифа» . J. Théor. Nombres Bordeaux . 9 (2): 303–318. DOI : 10,5802 / jtnb.204 .
  • Терио, Николя (2001). «Обобщение проблемы Иосифа Флавия». Util. Математика. (58): 161–173. CiteSeer x :  10.1.1.164.2015
  • Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Стейн, Клиффорд (2001). «Глава 14: Расширение структур данных». Введение в алгоритмы (второе изд.). MIT Press и McGraw-Hill. п. 318. ISBN 0-262-03293-7.
  • Шамс-Барах, Армин (2002). «Формулировка расширенной проблемы Иосифа Флавия» (PDF) .
  • Раски, Фрэнк; Уильямс, Аарон (2010). "Проблема кошачьего Иосифа". Lect. Нет. Комп. Sci . Конспект лекций по информатике. 6099 : 343–354. Bibcode : 2010LNCS.6099..343R . DOI : 10.1007 / 978-3-642-13122-6_33 . ISBN 978-3-642-13121-9. FUN2010
  • Раски, Фрэнк; Уильямс, Аарон (2012). "Проблема кошачьего Иосифа". Теория вычисл. Системы . 50 : 20–34. DOI : 10.1007 / s00224-011-9343-6 . S2CID  2273820 .
  • Салливан, Шон; Инско, Эрик (2018). «Вариант проблемы Кошачьего Иосифа». arXiv : 1803.11340 [ math.CO ].

Внешние ссылки [ править ]

  • Армин Шамс-Барах Формулировка расширенной проблемы Иосифа Флавия
  • Хальбайзен, Лоренц Дж. «Проблема Иосифа Флавия» (PDF) .
  • Игра Иосифа Флавия (Java-апплет) в разорванном состоянии, позволяющая выбирать каждого n- го из 50 (максимум).
  • Вайсштейн, Эрик В. "Проблема Иосифа" . MathWorld .
  • "Проблема Иосифа Флавия - Numberphile" на YouTube