スナネコです。
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)。
となることから、たしかに「 ならば 『 または 』」が成り立っていることがわかりました。
これで が証明できました。