スナネコです。
Grundy数がxorで計算できることの説明をしてほしいとサーバルさんに頼まれたのでします。
ざっと検索してみましたが、「Grundy数が0でないとき0にできる」くらいしか証明が書いてあるものは見つけられないですね。これではXORになることの説明には不十分です。
(追記)よく調べたらこの記事にきちんと証明が書かれていました Grundy数(Nim数, Nimber)の理論(追記終わり)
私が以前 Nimber の解説を書いたときも、方針だけ書いて細かい証明は書いていませんでした。
せっかくなのでちゃんと証明しましょう。
ここから先では XOR を で表すことにします。
"山"の個数に関する帰納法から、"山"が2個のときを示せば十分です。
grundy数が a と b の2つの"山"を合わせた局面のgrundy数を と表すことにします。
定義から分かっていることは で、示したいことは
です。
に関する帰納法で示します。
の小さい順だと思ってもいいですし、
の辞書順だと思ってもいいです。
定義から であり、
のとき成り立っています。
のとき帰納法の仮定から
です。なので示すべきことは
・ は
に含まれない
・0 以上 未満の任意の数は
に含まれる
の2つです。
1つ目は と
が成り立つので言えます。
2つ目を示すのはちょっと大変です。
示したいことは「 ならば 『
または
』」です。
なら、
とすれば
にできて、
なら、
とすれば
にできますからね。
証明には、「 ⇔
の最上位bitの位置では、
のbitが0で、
のbitが1」という事実を使います。
⇔
の最上位bitの位置では、
のbitは0で、
のbitは1。つまり(n,a,b)は(0,0,1)か(0,1,0)。
⇔
の最上位bitの位置では、
のbitは0で、
のbitは1。つまり(n,a,b)は(0,1,0)か(1,1,1)。
⇔
の最上位bitの位置では、
のbitは0で、
のbitは1。つまり(n,a,b)は(0,0,1)か(1,1,1)。
となることから、たしかに「 ならば 『
または
』」が成り立っていることがわかりました。
これで が証明できました。