Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
公平ゲームとNim、Grundy数
Search
R.K.
August 17, 2020
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
公平ゲームとNim、Grundy数
R.K.
August 17, 2020
More Decks by R.K.
See All by R.K.
Scratchからアルゴリズムへ 〜二分探索〜
asmape0104
0
1.1k
Other Decks in Programming
See All in Programming
ChromeでローカルLLM
ryu1013
0
140
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
440
すこし踏み込む CancellationToken
htkym
2
1.7k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
960
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Railsバージョンを4倍にした話
optim
0
430
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
610
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
カツオ、ご期待ください
suneo3476
0
190
Agents on Rails - Rails at Scale 2026
irinanazarova
0
560
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Faster Mobile Websites
deanohume
310
32k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
The Pragmatic Product Professional
lauravandoore
37
7.5k
Documentation Writing (for coders)
carmenintech
77
5.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Building Applications with DynamoDB
mza
96
7.2k
Transcript
公平ゲームと Nim、Grundy数 あすまるびぃ (@asmape_RK)
このスライドについて • このスライドは、東京⼤学⼯学部電⼦情報⼯学科・電気電⼦⼯ 学科の授業である、アルゴリズム(https://iis- lab.org/algorithms2020)の期末レポート課題として制作され たものを⼀般に公開したものになります。 本スライドの内容に関して、お気づきの点やさらに良くするた めのコメントがございましたら、ぜひ本スライドの制作者にご 共有ください。
ゲーム理論 • ゲームとは • 複数主体(プレイヤー)が、⼀定の規則に則りそれぞれの⽬標を達成し ようと⾏動を選択する。 • プレイヤーの⽬標の達成は、他⼈の選択にも依存する。 • このような対象を扱う学問がゲーム理論。
• いわゆる遊びを指すゲームだけとは限らない。
協⼒ゲームと⾮協⼒ゲーム • 協⼒ゲーム • プレイヤー間に協⼒の可能性が存在し、提携を結ぶ事ができるゲーム。 • ⾮協⼒ゲーム • プレイヤー間の利害が常に対⽴するゲーム。 •
今回はこちらを扱う。
情報完備ゲーム • ゲームのルールがすべてのプレイヤーの共通知識であるゲーム。 • いわゆる遊びのゲームもここに分類される。 • このようなゲームで最適な⼿を調べる⽅法は?
ゲームを表す有向グラフ • ゲームに存在する状態を頂 点、可能な操作を辺とした グラフでゲームを表現でき る。 • グラフを対象とするような アルゴリズムを使える!
情報完備ゲームの最適⼿の探索 • 例としてオセロを考える • 盤⾯のパターンを考えると3!×! ≅ 3×10#$。全探索はすでに怪しい。 • 最適解を求めるのは難しそう…。 •
minmax法、alpha-beta法などと呼ばれるアルゴリズムがある • 理論上は最適解を得られるが、時間がかかる。 • 途中で探索を打ち切ることにより、近似的な解を得る。 • あるいは、機械学習の出番… • ⼀般に、ゲームの最適⼿の探索は難しい!
情報完備ゲームの最適⼿の探索 • ゲームの種類にもう少し制限を加えて、⽐較的簡単に最適⼿を 考えられる問題を考える。
公平ゲーム • 次の条件を満たす情報完備ゲーム 1. 2⼈で交互に操作を繰り返す。 2. それ以上操作できない「最終状態」が存在し、操作をして最終状態 になったら勝ち(相⼿に最終状態を渡されたら負け)。 3. 有限回の操作で「最終状態」に必ず達する。
4. 等しい状態であれば、2⼈のプレイヤーが出来る操作の集合も等し い 。 5. 常にお互い全ての情報を持っていて、偶然性に決して左右されない。
例:30⾔っちゃいけないゲーム • 2⼈で、数字を交互に1からカウントアップしていく。 • ただし、1回でカウントできる数の個数に上限がある。 • 30と⾔ったほうが負け。 (例:上限が3個) A「1、2」 B「3、4、5」
A「6」… A「25、26」 B「27、28、29」 A「30」 →Aの負け
公平ゲームの勝敗 • 公平ゲームには必勝法が存在し、両者が必ず最適な⾏動をする 場合、先攻、後攻のどちらが勝つかはゲームをする前から分か る。 • 勝つのはどちらか?
公平ゲームを表す有向グラフ • 公平ゲームの場合、グラフ に以下のような特徴がある。 • 初期状態と最終状態が1つで ある。 • ループがない。 最終状態
初期状態
頂点ごとの勝敗 • 頂点ごとに必勝、必敗が決まる。 • 次に相⼿に必敗の状態を渡せるとそのノードは必勝。 • 次に相⼿に必敗の状態を渡せないとき(必勝の状態しか渡せない とき)そのノードは必敗。 • 公平ゲームの定義より「最終状態」は必敗。
• 最終状態から逆⽅向にBFSをすることでノードの必勝・必敗を 決められる!
必勝・必敗を決める • 必勝をW、必敗をLとする。 • 定義より「最終状態」は必 敗。 L 最終状態 初期状態
必勝・必敗を決める • ⼀つ戻る。 • 元のノードは必敗なので、 次のノードは必勝 • 後に述べる「暫定的に必敗 (L)」である場合も必勝に 上書きする。
W L W 最終状態 初期状態
必勝・必敗を決める • ⼀つ戻る。 • 元のノードは必勝。 • ⾏き先が1つでそれが必勝 の場合は必敗。 • ⾏き先に未訪問がある場合
は「暫定的に必敗(L)」か つ未訪問のままにし、そこ でその頂点の探索は打ち切 る。 (L) W (L) L W L 最終状態 初期状態
必勝・必敗を決める • 戻れるところは戻っていく。 (L) W W (L) L W L
最終状態 初期状態
必勝・必敗を決める • 先程「暫定的に必敗(L)」 にした頂点に戻ってくる。 • ⾏き先の頂点はすべて探索 済みかつ「暫定的に必敗」 のまま=⾏き先の頂点に必 敗がなかった。 •
Lに確定する。 (L) W W L L W L 最終状態 初期状態
必勝・必敗を決める • 1つ戻る。 • ここは⾏き先に必敗がある ので必勝 W W W L
L W L 最終状態 初期状態
必勝・必敗を決める • 1つ戻る。 • ⾏き先すべてが必勝なので 必敗。 L W W W
L L W L 最終状態 初期状態
必勝・必敗を決める • こうしてすべての頂点の必 勝、必敗が決まる。 • この「初期状態」からゲー ムが始まる場合、先攻の負 け。 L W
W W L L W L 最終状態 初期状態
計算量 • ゲームの状態数を、操作の数をとする。 • BFSで( + ) 。 • 頂点の出次数が2以上のとき、接続されているノードすべてが
訪問済みか、⾒なければならないが…
計算量 • グラフ構築の時に出次数を記録しておき、頂点ごとにカウン ターをもたせ、訪問時にカウンターを増加させれば、「カウン ターが出次数と等しくなった」ときに、接続先がすべて訪問さ れたと判断することが出来る。→ 1 • よってBFSの計算量と合わせて( +
)
DFSで必勝必敗を求める実装例 ⽮印の逆⽅向に探索することに注意 予めすべてを暫定的に必敗にしておくこ とで処理が簡潔になる。
DFSで必勝必敗を求める実装例 win[0]が答え。
30⾔っちゃいけないゲームの場合 • ⾃分が初めに⾔う数をそれぞれの頂点とする。 • 30が最終状態で必敗。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … L
30⾔っちゃいけないゲームの場合 • 相⼿に30を⾔わせることができるのは27〜29。 • これらは必勝。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … W W W L
30⾔っちゃいけないゲームの場合 • 26から相⼿に⾔わせることが出来るのは27〜29。 • 必敗。 数 … 21 22 23
24 25 26 27 28 29 30 勝敗 … L W W W L
30⾔っちゃいけないゲームの場合 • 繰り返していくとこう求まる。 数 … 21 22 23 24 25
26 27 28 29 30 勝敗 … W L W W W L W W W L
30⾔っちゃいけないゲームの場合 • 30⾔っちゃいけないゲームの場合、「WWWL」の周期になっ ているため、(1)で勝敗が求められる。 • N⾔っちゃいけないゲーム(⾔える数の上限K個)に関して、 N mod (K+1) ==
1ならば後攻の勝ち、それ以外なら先攻の勝 ち 数 … 21 22 23 24 25 26 27 28 29 30 勝敗 … W L W W W L W W W L
Grundy数 • 各状態に振られる数。 • 必勝、必敗を拡張した概念 と⾔える。 • 0のとき必敗、1以上のとき 必勝となる性質がある。 0
1 2 1 0 0 1 0 最終状態 初期状態
Grundy数の定義 • ある頂点について、その頂点から⼀回操作をすることでたどり 着ける頂点のGrundy数の集合をXとするとき、Xに含まれない ⾮負整数のうち最も⼩さいもの(これをXのmexという)を、その 頂点のGrundy数と定義する。 • mexはminimum excludedの略。 •
例 • X={0,1,2,4}のとき、Grundy数は3。 • X={1,2}のとき、Grundy数は0。 • X={}、つまり最終状態のとき、Grundy数は0。
Grundy数の例 • 試しに先程のグラフで Grundy数を求めてみる。 • Grundy数も最終状態から 逆⽅向に決まっていく。 • 最終状態のGrundy数は前 ページより0。
0 最終状態 初期状態
Grundy数の例 • 1つ戻る。 • 0に移動することが可能な ので、Grundy数は1。 1 0 1 最終状態
初期状態
Grundy数の例 • 次にここが決まる。 • 1に移動することが出来る が0に移動することができ ない。よって0。 1 0 1
0 最終状態 初期状態
Grundy数の例 • 同様に埋めていく。 1 1 0 0 1 0 最終状態
初期状態
Grundy数の例 • ここは0と1に移動ができる ので、Grundy数は2になる。 1 2 1 0 0 1
0 最終状態 初期状態
Grundy数の例 • 最後の頂点が埋まり終了。 0 1 2 1 0 0 1
0 最終状態 初期状態
Grundy数の性質 • 定義は、次に移動出来る頂点のGrundy数以外の数のうち⾮負の 最⼩の数。 • 逆に⾔えば、そのGrundy数より⼩さい任意のGrundy数の状態 に必ず移動できる。(定義と同値) • 1以上なら必ず0(必敗)に移動できる。このことからGrundy数が1以上 であることが必勝に相当することが分かる。
Grundy数の利点 • 単純に必勝必敗だけを求めるためには( + )だけの計算量が かかるが、 , はとても⼤きいことが多い。 • 例えば次ページ以降に⽰すNimと⾔うゲームでは、
= %と指数関数 で表される。 • この場合、 擬多項式時間アルゴリズムであるということになる。 • Grundy数を使うと、ゲームを複数のゲームに分解して考えるこ とで計算量を削減することが出来る!
Nim • 公平ゲームの⼀つ。 • ⽯が積まれたN個の⼭がある。 • 1つの⼭を選び、好きな数だけ⽯を取り 除く。 • 2つの⼭から同時に⽯を取り除くことはでき
ない。 • ⽯を0個にしたほうが勝ち。 真ん中から 3つ取り除く
Nim • このゲームの必勝必敗を求めたい。 • ゲームの状態数は、番⽬の⼭の⽯の数 を! とすれば、∏!"# $ (! +1)通り。
• 愚直に必勝・必敗を求めると、計算量は ! の制約を1 ≤ ! ≤ とすれば辺の数を 無視しても(%)。指数関数的に増加し てしまう! • 何とか削減したい。 真ん中から 3つ取り除く
NimのGrundy数 • N=1の場合を考える。 • 0個にすれば勝利なので、0個の状態の Grundy数は0。
NimのGrundy数 1 0個(Grundy数=0)にできるので Grundy数は1
Grundy数を考える 1 2 0個(Grundy数=0)、 1個(Grundy数=1)にできるので Grundy数は2
Grundy数を考える 1 2 3 0個(Grundy数=0)、 1個(Grundy数=1) 2個(Grundy数=2)にできるので Grundy数は3 なにか規則性が…?
Grundy数を考える 1 2 3 4 5 6 7 8 ⾃分より少ない⽯の数に出来るので
Grundy数は⽯の数と⼀致する!
NimのGrundy数 • Nが任意の場合を考える(例ではN=3) • ⼭ごとのGrundy数は2、4、3。 • どうにかこの3つの数字を使った演算で 全体のGrundy数を求めることが出来な いか?
NimのGrundy数 • 答え:XOR演算 • 2 xor 4 xor 3 =
5 • よって右の状態のGrundy数は5 • ゆえに先攻の勝ち • N個のXORを求めるので() !
XOR演算 • 2進数に対する演算。 • 各ビットごとに⾒て、1の数が奇 数個なら1、偶数個なら0とする 演算。 • 結合法則、交換法則が成り⽴つ。 •
Python、C++では演算⼦は「^」 • 項が2つのとき、指定したbitのみ 反転する演算と捉えることも出 来る。 • 桁ごとのmod 2の⾜し算とも考え られる。 010 = 2 100 = 4 xor 011 = 3 ────── 101 = 5
XORがGrundy数になる証明 • XOR演算をした結果が、以下の2つを満たすことを確認すれば 良い。 1. 同じGrundy数の状態には移動できない。 2. ⾃分より⼩さい任意のGrundy数の状態に移動できる。
XORがGrundy数になる証明 • 1. 同じGrundy数の状態には移動できない。 • ⼭は1つしか変化させることが出来ない。 • 値を変化させれば必ずどれかのビットは変化する。 • XORはそれぞれのビットの偶奇を⽰すので、1つの数のビット
が変化すればXOR計算結果の同じ位置のビットが変化する。 • よって、Grandy数は必ず変化すると⾔える。
XORがGrundy数になる証明 • 2. ⾃分より⼩さい任意のGrundy数の状態に 移動できる。 • まず、必ず0の状態に移動できることを⽰す。 • XOR結果の数をSとする。Sの1であるbitの うち最⾼位の位置と同じ位置のbitが1である
数がXOR演算される数の中に必ず存在する。 • XOR結果のbitが1であるとは、その位置の bitが1である数が奇数個≠0であることを表 すため。 010 = 2 100 = 4 xor 011 = 3 ────── 101 = 5
XORがGrundy数になる証明 • この数を変化させる。 • この数は、2進数で0xy (x,y = 0,1)と表さ れる任意の数に変化させられる。 •
2進数の数の変化を考えれば⾃明。 • x、yをうまく調整し、Grundy数を0にす ることが出来る。 010 = 2 001 = 1 xor 011 = 3 ────── 000 = 0
XORがGrundy数になる証明 • 今のを数式で表す。 2 xor 4 xor 3 = 5
Grundy数を0にしたいので両辺にxor 5すると。 2 xor 4 xor 3 xor 5 = 5 xor 5 = 0 前までの議論により、4 xor 5 < 4が分かり、 結合法則が成り⽴つので、 2 xor (4 xor 5) xor 3 = 0 4を(4 xor (Grundy数))に変えれば0に変えられ る。 010 = 2 001 = 1 xor 011 = 3 ────── 000 = 0
XORがGrundy数になる証明 • 次に、その頂点のGrundy数以下の任意の状態に移動できるこ とを⽰す。 • 前ページの数式を⽤いる。 2 xor 4 xor
3 = 5 移動先のGrundy数をhとして、両辺xor 5 xor hすると、 2 xor 4 xor 3 xor 5 xor h = 5 xor 5 xor h = h よって、それぞれの⼭の⽯の数s=2,4,3のうち、s xor 5 xor h < sを満たすsが存在すれば、sをs xor 5 xor hに変化させることで Grundy数をhに変化させられる。
XORがGrundy数になる証明 • s xor 5 xor h < sとなるようなsを探す。 •
次の条件を考える。 • sの1であるbitの最⾼位と(5 xor h)の1であるbitの最⾼位が等しい。 • これは、上記の不等式よりも厳しい条件。 • このとき、5はもとのGrundy数であるからh<5であることに注 意する。
XORがGrundy数になる証明 • (5 xor h)の1であるbitの最⾼位が n桁⽬であるとする。このとき、 5のn桁⽬のbitが1であり、hのn 桁⽬のbitが0になる。 • n桁⽬より⼤きい桁では、XOR演算
がすべて0のため同じ数。 • このとき、5のn桁⽬のbitが0でhの n桁⽬のbitが1になってしまうと、 それより上位の桁の数は等しいた めh>5になってしまう。 101 = 5 xor 011 = h=3 (例) ────── 110
XORがGrundy数になる証明 • 5(=Grundy数)のn桁⽬は1なので、⽯の⼭の中にもn桁⽬のbit が1の⽯の⼭が存在する。 • 0になることの証明と同じ議論。 • (5 xor h)の1であるbitの最⾼位はn桁⽬で、同じ桁が1である
⽯の数が存在するため、0に出来ることの証明の議論において 5を(5 xor h)と読み替えれば同様に証明することが出来る。 • よって⽰された。
Nimに帰着する問題 • 競プロで出題される多くのゲームはNimに帰着できる!
yukicoder No.2 素因数ゲーム 出典:https://yukicoder.me/problems/no/2
解法 • 例:540 = 2&×3'×5 • 指数の部分(2、3、1)を⽯の数としたNimに帰着できる! • 答えは2 xor
3 xor 1=0よりBobの勝ち。 • 素因数分解の計算量が( ) • 素因数分解をしながらXORを計算することが出来る。 • よって全体でも計算量( )
実装例 a = a + bをa += bと書けるのと同様に a =
a ^ bをa ^= bと書ける。
発展 • 取れる⽯の数に限りがあるNim • NimK ‒ 複数の⼭を選んで⽯を取れる
取れる⽯の数に限りがあるNim • ⽯が積まれたN個の⼭がある。 • 1つの⼭を選び、1個以上個以下の⽯を 取り除く。 • 2つの⼭から同時に⽯を取り除くことはでき ない。 •
⽯を0個にしたほうが勝ち。 • 同様に = 1のときのGrundy数を考えて みる ≤ 2では この⼿はだめ
Grundy数を考える 1 2 3 = 3の場合 ここまではさっきと同じ
Grundy数を考える 1 2 3 = 3の場合 0 0個には出来ないので Grundy数は0
Grundy数を考える 1 2 3 = 3の場合 0 1 1個には出来ないのでGrundy数は1 (4個(Grundy数=0)にはできるので0ではない)
Grundy数を考える 1 2 3 = 3の場合 0 1 2 3
0 同様にGrundy数を考えていくと… ⽯の数を + 1で割ったあまりになっている! (1)で求められる!
取れる⽯の数に限りがあるNim • = 1なら30⾔っちゃいけないゲームと同じ! • ルールを⾒れば⾃明である。 • ≥ 2では限りがないときと同じようにXORを計算すれば 良い。
NimK • ⽯が積まれたN個の⼭がある。 • 1個以上個以下の⼭を選び、1個以上 個以下の⽯を取り除く。 • ⽯を0個にしたほうが勝ち。 • =
1のとき = 1しかありえないので 今までの議論と同じ。 • ≥ 2のときのGrundy数は? 真ん中から3つ、 右から1つ 取り除く
≥ 2のGrundy数 • 2進数に展開し、⾜し算をする。 • それぞれの桁でmod ( + 1)を取る。 •
+ 1進数と考えれば1つのGrundy数として 捉えられる! • = 1のときmod 2の⾜し算=XOR • これがGrundy数になることは、 = 1のと きとほぼ同様にして証明できる。 010 = 2 110 = 6 + 011 = 3 ────── 131 ────── 101 (mod 3をとる) = 2の例
まとめ • 公平ゲーム • 先攻、後攻のどちらが勝つかが決まる • Grundy数 • ゲームを複数のゲームに分解し、単純なゲームの組み合わせとして捉 えられる。
参考⽂献 • 岡⽥章 (2014). 『ゲーム理論・⼊⾨』. 有斐閣 • Grundy数(Nim数, Nimber)の理論 -
https://www.creativ.xyz/grundy-number-1065/ • 競プロにおけるNim、Grundy数とNimK - http://yang33- kassa.hatenablog.com/entry/2017/12/21/202812