
コンピュータ科学や数学において、ヨセフス問題(またはヨセフス順列)は、ある数え上げゲームに関連する理論的な問題です。このようなゲームは、グループから人を選ぶために使われます。例えば、イーニー、ミーニー、マイニー、モーなどです。

ヨセフスの問題の発端となった特定の数え上げゲームでは、数人が円になって立ち、処刑を待っている。数え上げは円の中の特定の地点から始まり、特定の方向に円周に沿って進む。特定の人数を飛ばした後、次の人が処刑される。残りの人に対して、次の人から始め、同じ方向に進み、同じ人数を飛ばしながら、一人だけが残るまでこの手順が繰り返され、一人は解放される。
問題は、人数、開始地点、方向、スキップする人数が与えられた場合、実行を回避するために最初の円内の位置を選択することです。
この問題は、1世紀に生きたユダヤ人の歴史家であり指導者であったフラウィウス・ヨセフスにちなんで名付けられました。ヨセフスによるヨドファト包囲戦の直接の記録によると、彼と40人の兵士はローマ兵によって洞窟に閉じ込められました。彼らは捕虜になるより自殺を選び、くじ引きで順番に自殺する方法を決めました。ヨセフスは、幸運にも、あるいは神の手によって、彼ともう一人の男は最後まで生き残り、自殺する代わりにローマ軍に降伏したと述べています。これは、ヨセフスの『ユダヤ戦記』第3巻第8章第7節(三人称で彼自身について書かれている)に記されている物語です。
しかし、この極度の苦境にあっても、彼はいつもの賢明さを失ってはいなかった。むしろ、神の摂理に身を委ね、次のようにして命を危険にさらした。「さて」と彼は言った。「あなた方の間で死ぬことが決まったのなら、くじで互いの死を決定しよう。くじが最初に当たった者は、2番目のくじを引いた者に殺され、こうして運命は我々全員を通して進んでいく。また、我々の誰も自分の右手で死ぬことはない。他の者が死んだ後に、誰かが後悔して自分だけ助かるのは不公平だからだ。」この提案は彼らに非常に公平に思えた。そして、くじでこの件を決定するよう彼らを説得した後、彼自身もくじを引いた。最初のくじを引いた者は、将軍がすぐに彼らの間で死ぬとでも思って、次のくじを引いた者に自分の首を差し出した。彼らは、ヨセフスが自分たちと一緒に死ぬことができれば、死は生よりも甘美だと考えていたからである。しかし、彼は最後に残ったもう一人の男と共にいた。それが偶然だったのか、それとも神の摂理だったのかは定かではない。彼はくじで有罪判決を受けることを強く望まず、また最後に残ったとしても同胞の血で右手を染めることを望まなかったため、彼に忠誠を誓わせ、自分と同じように生き延びるよう説得した。
—ヨセフス、n年不明、579ページ、『ユダヤ戦記』第3巻、第8章、第7節
この偉業で使用されたメカニズムの詳細はかなり曖昧である。ジェームズ・ダウディとマイケル・メイズによれば[ 2 ] 、 1612年にクロード・ガスパール・バシェ・ド・メジリアックは、男性を円形に並べ、3つずつ数えて排除の順序を決定するという具体的なメカニズムを提案した[ 3 ] 。この話は何度も繰り返されており、具体的な詳細は情報源によってかなり異なっている。例えば、イスラエル・ネイサン・ヘルスタインとアーヴィング・カプランスキー(1974)は、ヨセフスと39人の仲間が円形に並び、7人ごとに排除されるという設定にしている[ 4 ] 。この問題の歴史は、SL・ザベルの『フィボナッチ・クォータリー』編集者への手紙に見られる[ 5 ]。
意図性について、ヨセフスは「神の摂理によるものか、それとも単なる幸運によるものか」と問いかけた。[ 6 ] しかし、現存するヨセフスのスラヴ語写本は異なる話を語っている。ヨセフスは「巧妙に数を数え、他の全員を欺くことに成功した」というのだ。[ 6 ] [ 7 ] ヨセフスには共犯者がいた。問題は、最後に残った2人の生存者(彼らの共謀によって生存が保証される)の居場所を見つけることだった。ヨセフスは自分ともう一人の男をそれぞれ31番目と16番目に置いたとされている(以下、 k = 3の場合)。[ 8 ]

ヨセフスの問題の中世版では、嵐の中、船に乗ったトルコ人15人とキリスト教徒15人が、乗客の半分を海に投げ込まなければ沈没するという状況が描かれている。30人全員が円になって立ち、9人ごとに海に投げ込まれる。キリスト教徒は、トルコ人だけが投げ込まれるようにどこに立つべきかを決めなければならない。[ 9 ]他のバージョンでは、トルコ人とキリスト教徒の役割が入れ替わっている。
Graham、Knuth、およびPatashnik 1989 、p. 8は、「標準的な」変種について説明および研究しています。最初にn人の人がいて、2 人ごとに (以下k = 2) が排除された場合、最後の生存者がどこにいるかを決定します。
この問題の一般化は次のとおりです。n 個のグループから m 番目の人が処刑され、p 番目の人が生存者であるとします。円にx人が追加される場合、生存者は p + mx 番目の位置にあり、これが n + x 以下であれば、生存者は p + mx 番目の位置にあります。xがp + mx > n + xとなる最小値である場合、生存者は( p + mx ) − ( n + x )の位置にあります。[ 10 ]

以下では、は最初の円の中にいる人数を表し、各ステップのカウントを表します。つまり、人々はスキップされ、-th が実行されます。円の中の人々は から番号が付けられます。に開始位置はそして、数える際にはすべてを含める。
問題は、2人ごとに1人が殺される(各人が自分の左または右の人を殺す)場合に明確に解決される。(より一般的なケースの場合)(以下に解決策の概要を示します。)解決策は再帰的に表現されます。最初にn人の人がいる場合の生存者の位置を示します(そして) 円周の最初の周回では、偶数番目の人が全員死亡します。円周の 2 周目では、新たに 2 番目の人が死亡し、次に新たに 4 番目の人が死亡するなど、まるで円周の最初の周回がなかったかのようです。
当初の人数が偶数だった場合、円周を2周した時点で位置xにいる人は、元々は位置xにいた。( xの任意の選択について). の人物生き残るのは元々のポジションだったこれにより、次の式が得られます。
初期人数が奇数だった場合、1人目は円周1周目の終わりに死亡したと考えることができます。同様に、2周目には2人目が死亡し、次に4人目が死亡する、といった具合です。この場合、位置xの人は元々位置xにいました。これにより、次の式が得られます。
値が表にまとめられるときそしてあるパターンが浮かび上がってくる(OEIS:A006257 、また上の図の左端の青い数字の列も参照):
これは、は、増加する奇数列で、インデックスnが2 のべき乗であるとき。したがって、mとl が次のように選ばれると、そして、 それから表の値がこの式を満たすことは明らかです。あるいは、l人が亡くなった後には、人々、そしてそれは1人目。この人が生存者でなければならない。以下に、帰納法による証明を示す。
定理:そして、 それから。
証明:nに対して強い帰納法を用いる。基本ケースこれは正しい。nが偶数の場合とnが奇数の場合では、それぞれ別々に検討される。
nが偶数の場合、そしてそのためそして。 ご了承ください。2番目の等式が帰納法の仮説から導かれる場合、この等式が成り立つ。
nが奇数の場合は、そしてそのためそして。 ご了承ください。2番目の等式は帰納法の仮定から導かれる。これで証明は完了する。
lを解くと、明示的な式が得られます。:
最も洗練された回答形式は、サイズnのバイナリ表現を用いるものです。nを 1 ビット左巡回シフトすることで得られます。nをバイナリで表すと次のようになります。すると、解は次のように与えられる。この証明は、 nの表現から導かれる。または上記の式から。
実装: nを人数とすると、安全な位置は次の関数で与えられる。、 どこ そして。
数値がバイナリ形式で表されている場合、最初のビットは残りのビットはlを表します。たとえば、 の場合、そのバイナリ表現は
n = 1 0 1 0 0 1 2 m = 1 0 0 0 0 0 l = 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 ]入力は正の整数である必要があります。
n = 1 0 1 0 0 1 f(n) = 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 を乗算 | // 両方のオペランドに存在するビットをコピーするためのビットごとの AND 演算}1997年、ローレンツ・ハルバイゼンとノルベルト・フンガービューラーは、このケースの閉形式を発見した。彼らは、ある定数が存在することを示した。
任意の精度で計算できる定数。この定数が与えられたとき、m を次の条件を満たす最大の整数として選択する。これはまたはそして、最後の生存者は
すべての人々のために。
計算例として、ハルベイゼンとフンガービューラーは次のように述べている。(これは実際にはヨセフスの問題の本来の定式化である)。彼らは次のように計算する。
これは、数字の各連続パスを確認することで検証できます。1から41 :
動的計画法は、最初のステップを実行してから残りの問題の解を使用することで、一般的にこの問題を解決するために使用されます。インデックスが 1 から始まる場合、最初の人物の位置からシフトしますここで、nは総人数である。生存者の位置を示す。- 番目の人が殺され、残り、次のカウントは元の問題で番号が残りの円の中での生存者の位置はカウントが開始される場合; 開始点が再帰式[ 12 ]が得られる より単純な形をとる 位置が番号付けされている場合にその代わり。
このアプローチには実行時間がありますしかし、小規模なそして大きい別の方法もあります。2番目の方法も動的計画法を使用しますが、実行時間があります。これは、 k番目、2k番目、...を殺すことを考慮に基づいている。1 番目の人を 1 つのステップとして、次に番号を変更します。
この改良されたアプローチは、