ヨセフス問題

クロード・ガスパール・バシェ・ド・メジリアックによるヨセフス問題の解釈。兵士41名、ステップサイズ3。16番と31番の場所が最後に殺されることを示しています。時間は螺旋に沿って内側に進み、緑の点は生存している兵士、灰色の点は死亡した兵士、十字は殺害数を示します。

コンピュータサイエンス数学において、ヨセフス問題(またはヨセフス順列)は、特定の数え上げゲームに関連する理論的な問題です。このようなゲームは、 eeny、meeny、miny、moeといったグループから人物を選び出すために用いられます。

500人を対象としたヨセフス問題列の図。スキップ数は6。横軸は人数、縦軸(上から下)は時間(サイクル数)。生きている人は緑色で、死んでいる人は黒色で描かれている。[ 1 ]

ヨセフス問題を引き起こす特定のカウントアウトゲームでは、何人かの人々がになって処刑を待ちます。カウントは円内の指定された地点から始まり、指定された方向に円を一周します。指定された人数が飛ばされた後、次の人が処刑されます。この手順は、残りの人々に対しても繰り返され、次の人から同じ方向に同じ人数が飛ばされ、最後の一人だけが残り、解放されます。

問題は、人数、出発点、方向、スキップする人数が与えられた場合、処刑を回避するために最初の円内の位置を選択することです。

歴史

この問題は、1世紀に生きたユダヤ人の歴史家で指導者であったフラウィウス・ヨセフスにちなんで名付けられました。ヨドファトの包囲戦に関するヨセフス自身の証言によると、彼と40人の兵士はローマ兵によって洞窟に閉じ込められました。彼らは捕らえられるよりも自殺を選び、くじ引きによる連続自殺の方法に落ち着きました。ヨセフスは、幸運かおそらくは神の手によって、彼ともう1人の男が最後まで残り、自殺するのではなくローマ人に投降したと述べています。これは、ヨセフスのユダヤ戦記彼自身を三人称で書いている)の第3巻第8章第7部に書かれている話です。

しかし、この極度の苦難の中でも、彼はいつもの聡明さを失ってはいなかった。神の摂理に身を委ね、彼は次のように命を危険にさらした。「さあ、」と彼は言った。「あなたたちの間で死ぬことが決定されたのだから、さあ、互いの死をくじで決めよう。くじに最初に当たった者は、次に当たった者に殺される。こうして運命は我々全員に巡り来る。我々のうち誰も、自分の右の手で滅びることはない。残りの者がいなくなった後に、誰かが悔い改めて自ら命を救おうとしたら、それは不公平だからだ。」この提案は彼らに非常に正当に思われた。そして、彼らを説得してくじでこの件を決めさせると、彼は自分もくじを一つ引いた。最初に当たった者は、将軍がすぐに彼らの間で死ぬだろうと考えて、次に当たった者に自分の首をさらした。ヨセフスが共に死ねるなら、死は生よりも甘美だと彼らは考えていたのだ。しかし、彼は最後まで他の者と共に生き残った。それは偶然の産物か、それとも神の摂理によるものだったのかは定かではない。そして、彼は運命によって罪に定められることを、そしてもし最後まで生き残ったとしても、同胞の血に右手を染めることを強く望んでいなかったため、その者を説得して、自分への忠誠を誓わせ、自らも健全に生きるよう仕向けた。

ヨセフス、『ユダヤ戦記』第3巻第8章第7節、579ページ

この偉業に用いられたメカニズムの詳細は曖昧である。ジェームズ・ダウディとマイケル・メイズによると[ 2 ] 、 1612年にクロード・ガスパール・バシェ・ド・メジリアックが、男性を円陣に並べ、3ずつ数えて排除の順番を決めるという具体的なメカニズムを提案したという。[ 3 ]この話は何度も繰り返されており、具体的な詳細は出典によって大きく異なる。例えば、イスラエル・ネイサン・ハーシュタインアーヴィング・カプランスキー(1974)は、ヨセフスと39人の仲間が円陣に立ち、7人ごとに排除するという設定にしている。[ 4 ]この問題の歴史は、SLザベルがフィボナッチ・クォータリー誌編集者に宛てた手紙に記載されている。[ 5 ]

意図性について、ヨセフスは「これは神の摂理か、それとも単なる幸運か」と問いかけた。[ 6 ] しかし、現存するスラヴ語写本は異なる説を述べている。ヨセフスは「巧妙に数字を数え、他の者全員を欺いた」のである。[ 6 ] [ 7 ] ヨセフスには共犯者がいた。問題は、生き残った最後の二人(彼らの共謀によって生存が確実となる)の順位を見つけることだった。彼は自身ともう一人の男をそれぞれ31位と16位に置いたとされている(以下k = 3)。[ 8 ]

変種と一般化

ヨセフス問題の変種で、30人、ステップサイズ9です。時間は螺旋に沿って内側に進み、緑の点は生存している兵士、灰色の死んでいる兵士、十字は殺害を表します。

中世版のヨセフス問題では、15人のトルコ人と15人のキリスト教徒が船に乗って嵐に見舞われます。船は乗客の半数を海に投げ込まなければ沈没してしまいます。30人全員が輪になり、9人ごとに1人が海に投げ込まれます。キリスト教徒は、トルコ人だけが海に投げ込まれるように、どこに立つかを決めなければなりません。[ 9 ]他のバージョンでは、トルコ人とキリスト教徒の役割が入れ替わっています。

Graham、Knuth、Patashnik 1989、p. 8 は、「標準的な」変種について説明および研究しています。開始時にn人の人がいて、2 人ごとに (以下k = 2) 排除された場合に、最後の生存者がどこにいるかを決定します。

この問題を一般化すると以下のようになる。n人の集団からm人ごとに処刑され、p人目が生存者となるとするこのx人が追加された場合、生存者はp + mx番目の位置(n + x以下)に位置する。xp + mx > n + xとなる最小ある場合生存者は( p + mx ) − ( n + x )の位置に位置する。[ 10 ]

解決

ヨセフス問題における最後から2番目の場所(ピンク)と最後の場所(群青色)を、グループサイズnとステップサイズkごとに示します。SVGファイルでは、値にマウスポインターを合わせると、殺害順序全体が表示されます。

以下では、は最初の円内の人数を表し、 は各ステップのカウントを表します。つまり、人がスキップされ、番目が実行されます。円内の人々は から まで番号が振られ、開始位置は で、カウントは を含みます。 n{\displaystyle n}{\displaystyle k}1{\displaystyle k-1}{\displaystyle k}1{\displaystyle 1}n{\displaystyle n}1{\displaystyle 1}

k = 2

この問題は、2 人ごとに 1 人の人が殺される (すべての人が自分の左または右の人を殺す)、つまり のときに明示的に解決されます(より一般的なケース については、以下に解決法の概要を示します)。この解決法はで再帰的に表現されます。最初にn人の人がいる場合 (および)の生存者の位置を で表します。円を 1 周目すると、偶数番号の人全員が死亡します。円を 2 周目すると、新しい 2 人目の人が死亡し、次に新しい 4 人目の人が死亡する、というように、円を 1 周目はなかったかのようになります。 2{\displaystyle k=2}2{\displaystyle k\neq 2}fn{\displaystyle f(n)}2{\displaystyle k=2}

当初の人数が偶数だった場合、円を2周目にxの位置にいた人は、元々( xのあらゆる選択において)xの位置にあったことになります。 とします。今生き残ることになる人は、元々 の位置 にいました。このことから、次の回帰式が得られます。2×1{\displaystyle 2x-1}n2j{\displaystyle n=2j}fj{\displaystyle f(j)}2fj1{\displaystyle 2f(j)-1}

f2j2fj1{\displaystyle f(2j)=2f(j)-1\;.}

初期の人数が奇数だった場合、1人目は円を一周した時点で死亡すると考えられます。2周目では、新たに2人目が死亡し、続いて4人目が死亡し、というように続きます。この場合、位置xの人物は元々位置xにいました。このことから、次の回帰式が得られます。 2×+1{\displaystyle 2x+1}

f2j+12fj+1{\displaystyle f(2j+1)=2f(j)+1\;.}

値が表にまとめられ、パターンが浮かび上がると(OEIS:  A006257、上の図の一番左の青い数字の列): n{\displaystyle n}fn{\displaystyle f(n)}

n12345678910111213141516
fn{\displaystyle f(n)}1131357135791113151

これは、指数nが2のべき乗であるときはいつでも、がから始まる増加奇数列であることを示唆しています。したがって、mlを、およびとなるように選択すると、となります。表の値がこの式を満たすことは明らかです。あるいは、l人が死亡した後は人だけが残り、st人まで進むと考えることもできます。この人が生存者でなければなりません。したがって、となります。以下では、帰納法によって証明を示します。 fn{\displaystyle f(n)}fn1{\displaystyle f(n)=1}n2メートル+l{\displaystyle n=2^{m}+l}0l<2メートル{\displaystyle 0\leq l<2^{m}}fn2l+1{\displaystyle f(n)=2l+1}2メートル{\displaystyle 2^{m}}2l+1{\displaystyle 2l+1}fn2l+1{\displaystyle f(n)=2l+1}

定理: かつならば。n2メートル+l{\displaystyle n=2^{m}+l}0l<2メートル{\displaystyle 0\leq l<2^{m}}fn2l+1{\displaystyle f(n)=2l+1}

証明: nに対して強帰納法を用いる。基本ケースは真である。n偶数の場合と奇数の場合を別々に考える。 n1{\displaystyle n=1}

nが偶数の場合、およびとなるおよびを選択します。 となることに注意してください。 2 番目の等式は帰納法の仮定から導かれます。 l1{\displaystyle l_{1}}メートル1{\displaystyle m_{1}}n/22メートル1+l1{\displaystyle n/2=2^{m_{1}}+l_{1}}0l1<2メートル1{\displaystyle 0\leq l_{1}}l1l/2{\displaystyle l_{1}=l/2}fn2fn/2122l1+112l+1{\displaystyle f(n)=2f(n/2)-1=2((2l_{1})+1)-1=2l+1}

nが奇数の場合、 およびとなるおよびを選びます。 となる点に注意してください。 この場合、2 番目の等式は帰納法の仮定から導かれます。これで証明は完了です。 l1{\displaystyle l_{1}}メートル1{\displaystyle m_{1}}n1/22メートル1+l1{\displaystyle (n-1)/2=2^{m_{1}}+l_{1}}0l1<2メートル1{\displaystyle 0\leq l_{1}}l1l1/2{\displaystyle l_{1}=(l-1)/2}fn2fn1/2+122l1+1+12l+1{\displaystyle f(n)=2f((n-1)/2)+1=2((2l_{1})+1)+1=2l+1}

lを解くと、 の明示的な式が得られます。 fn{\displaystyle f(n)}

fn2n2ログ2n+1{\displaystyle f(n)=2(n-2^{\lfloor \log _{2}(n)\rfloor })+1}

最もエレガントな形の答えは、サイズnの2進表現です。n自身を1ビット左巡回シフトすることで得られます。n2進数で と表すと、解は となります。この証明は、 nをと表すこと、または について上記の式から得られます。 fn{\displaystyle f(n)}n1b1b2b3bメートル{\displaystyle n=1b_{1}b_{2}b_{3}\dots b_{m}}fnb1b2b3bメートル1{\displaystyle f(n)=b_{1}b_{2}b_{3}\dots b_{m}1}2メートル+l{\displaystyle 2^{m}+l}fn{\displaystyle f(n)}

実装: nが人数を表す場合、安全な位置は関数( および)によって与えられます。 fn2l+1{\displaystyle f(n)=2l+1}n2メートル+l{\displaystyle n=2^{m}+l}0l<2メートル{\displaystyle 0\leq l<2^{m}}

数を2進数で表すと、最初のビットは l を表し、残りのビットはlを表します。例えば、の場合、その2進数表現は次のようになります。 2メートル{\displaystyle 2^{m}}n41{\displaystyle n=41}

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 . fastestOneBit ( 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 で乗算します | // 両方のオペランドにビットをコピーする Bitwise And が存在します。}

k = 3

1997年、ローレンツ・ハルバイゼンとノルベルト・フンガービューラーは、このケースの閉じた形式を発見した。彼らは、ある定数が存在することを示した。 3{\displaystyle k=3}

α0.8111...{\displaystyle \alpha \approx 0.8111...}

任意の精度で計算できる。この定数が与えられた場合、mを(またはのいずれか)を満たす最大の整数として選ぶ。すると、最終的な生存者は ラウンドα3/2メートルn{\displaystyle \operatorname {round} (\alpha \cdot (3/2)^{m})\leq n}メートルラウンドログ3/2n/α{\displaystyle m^{\prime }=\operatorname {round} (\log _{3/2}n/\alpha )}メートル1{\displaystyle m^{\prime }-1}

fn3nラウンドα3/2メートル+2{\displaystyle f(n)=3(n-\operatorname {round} (\alpha \cdot (3/2)^{m}))+(2}切り上げの場合、そうでない場合1{\displaystyle 1)}

すべてのために。 n5{\displaystyle n\geq 5}

計算例として、ハルバイゼンとフンガービューラーは(実際にはヨセフスの問題の元々の定式化である)以下の式を計算している。 n413{\displaystyle n=41,k=3}

メートルラウンドログ3/241/0.8111ラウンド9.6810{\displaystyle m^{\prime }\approx \operatorname {round} (\log _{3/2}41/0.8111)\approx \operatorname {round} (9.68)=10}
ラウンドα3/2メートルラウンド0.81113/21047{\displaystyle \operatorname {round} (\alpha \cdot (3/2)^{m^{\prime }})\approx \operatorname {round} (0.8111\cdot (3/2)^{10})=47}そしてそれゆえメートル9{\displaystyle m=9}
ラウンド0.81113/29ラウンド31.1831{\displaystyle \operatorname {round} (0.8111\cdot (3/2)^{9})\approx \operatorname {round} (31.18)=31}(切り捨てられていることに注意してください)
fn34131+131{\displaystyle f(n)=3(41-31)+1=31}

これは、数字の各パスを見ることで確認できます。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

一般的なケース

動的計画法は、一般的なケースでは、最初のステップを実行し、次に残りの問題の解を使用することで、この問題を解くために使用されます。インデックスが1から始まる場合、の人物は の位置から に移動します。ここで、nは人々の総数です。生存者の位置を とします。-人目の人が殺された後、 の円が残り、次のカウントは元の問題で番号が だった人物から始まります。カウントを から開始した場合、残った円における生存者の位置は になります。開始点が であるという事実を考慮してこれをシフトすると、再発式が得られます[ 12 ]s{\displaystyle s}s1モッドn+1{\displaystyle ((s-1){\bmod {n}})+1}fn{\displaystyle f(n,k)}k{\displaystyle k}n1{\displaystyle n-1}(kmodn)+1{\displaystyle (k{\bmod {n}})+1}f(n1,k){\displaystyle f(n-1,k)}1{\displaystyle 1}(kmodn)+1{\displaystyle (k{\bmod {n}})+1}

f(n,k)=((f(n1,k)+k1)modn)+1, with f(1,k)=1,{\displaystyle f(n,k)=((f(n-1,k)+k-1){\bmod {n}})+1,{\text{ with }}f(1,k)=1\,,}

よりシンプルな形をとる

g(n,k)=(g(n1,k)+k)modn, with g(1,k)=0{\displaystyle g(n,k)=(g(n-1,k)+k){\bmod {n}},{\text{ with }}g(1,k)=0}

代わりに、位置が からまで番号付けされている場合。 0{\displaystyle 0}n1{\displaystyle n-1}

このアプローチは実行時間 ですが、小規模および大規模の場合は別のアプローチがあります。2つ目のアプローチも動的計画法を用いますが、実行時間 です。これは、k人目、2 k人目、…人目の殺害を 1 ステップとみなし、その後番号を変更するというものです。 O(n){\displaystyle O(n)}k{\displaystyle k}n{\displaystyle n}O(klogn){\displaystyle O(k\log n)}(n/kk){\displaystyle (\lfloor n/k\rfloor k)}

この改善されたアプローチは、

g(n,k)={0if n=1(g(n1,k)+k)modnif 1<n<k{g(nnk,k)nmodk+nif g(nnk,k)<nmodkk(g(nnk,k)nmodk)k1if g(nnk,k)nmodk}if kn{\displaystyle g(n,k)={\begin{cases}0&{\text{if }}n=1\\(g(n-1,k)+k){\bmod {n}}&{\text{if }}1<n<k\\{\begin{Bmatrix}g(n-\left\lfloor {\frac {n}{k}}\right\rfloor ,k)-n{\bmod {k}}+n&{\text{if }}g(n-\left\lfloor {\frac {n}{k}}\right\rfloor ,k)<n{\bmod {k}}\\\lfloor {\frac {k(g(n-\left\lfloor {\frac {n}{k}}\right\rfloor ,k)-n{\bmod {k}})}{k-1}}\rfloor &{\text{if }}g(n-\left\lfloor {\frac {n}{k}}\right\rfloor ,k)\geq n{\bmod {k}}\end{Bmatrix}}&{\text{if }}k\leq n\\\end{cases}}}

参照

参考文献

引用

  1. ^ R.Ugalde, Laurence. 「Fōrmulæプログラミング言語におけるJosephus問題」 . Fōrmulæ . 2021年7月26日閲覧
  2. ^ダウディ&メイズ 1989、125ページ。
  3. ^バシェ1612、174ページ。
  4. ^ハーシュタイン&カプランスキー 1974年、121~126頁。
  5. ^ザベル 1976、48、51ページ。
  6. ^ a bコーエン、リチャード『 歴史を創る:過去を形作ったストーリーテラー』 54ページ(サイモン&シュスター、2022年)。
  7. ^ Hailperin, Max; Kaiser, Barbara; Knight, Karl (1999). 「3.5 応用:ヨセフス問題」(PDF) .具体的な抽象化:Schemeを用いたコンピュータサイエンス入門. Brooks/Cole Publishing Company. pp.  65– 67.
  8. ^ラウズ・ボール 1905、19ページ。
  9. ^ニューマン 1988年、2403–2405頁。
  10. ^ロビンソン 1960、47–52ページ。
  11. ^ 「ビット演算を使用したJosephus問題(Java)」 . GitHub . 2018年1月7日. 2018年1月7日閲覧
  12. ^ Park & Teixeira 2018、1–7 ページ。

出典

さらに読む