网上好像都是引用的维基,或者证的很不严谨
这里提供一个稍微严谨一点的证明,SG的部分基本上参考了维基 (自己想过,没想出来www)
要转载的话随便转载,就是不知道这垃圾玩意有没有转载的必要啊
满足如下条件的游戏被称为公平组合游戏:
Nim游戏:有 n n n 堆石子,二人轮流操作,每人可以在某堆中任意取若干个,但不能不取。如果某人不能取了那么它就输了。
常见的棋类就不是公平组合游戏,因为你不可以动别人的棋子。但Nim就是公平组合游戏,因为任何一方都可以拿任何一堆中的石子。
对于一个局面,我们其实只关心它能到达哪些局面,因此我们用集合来描述一个局面,集合中包含它能到达的后继局面。 (因此你如果要展开这个集合,你会看到很多集合套集合)。如果它没有后继局面(即无法操作),我们用空集描述它。
特殊地,我们记 ∗ n *n ∗n 表示一堆含有 n n n 个石子的Nim局面。容易发现 ∗ n = { ∗ 0 , ∗ 1... ∗ ( n − 1 ) } *n=\{*0,*1...*(n-1)\} ∗n={∗0,∗1...∗(n−1)},是一个递归的结构。如果要展开就会变成集合套集合。
比如 ∗ 4 = { ∅ , { ∅ } , { ∅ , { ∅ } } } *4=\{\emptyset,\{\emptyset\},\{\emptyset,\{\emptyset\}\}\} ∗4={∅,{∅},{∅,{∅}}}。
对于一个局面,如果是先手必胜,我们说它是 N N N 的,否则就是 P P P 的。
关于胜负情况,好像没有找到相关的函数描述。这里我们用 w i n ( S ) win(S) win(S) 表示局面 S S S 的胜负情况,其值为 P P P 或者 N N N。
判定局面的胜负性:
局面的和:对于两个局面 S , S ′ S,S' S,S′,定义 S + S ′ S+S' S+S′ 表示:现在同时进行 S S S 和 S ′ S' S′ 两个游戏,两边都不能操作就算输,这样的一个局面。如何描述它呢?
很明显,如果你要走一步,要么走 S S S 的一个后继,要么走 S ′ S' S′ 的一个后继。比如说你走了 S S S 的后继 s s s,那接下来就是 s s s 和 S ′ S' S′ 两个游戏同时进行,是一个子结构。另一边同理。因此我们可以写出这样的定义式:
S + S ′ = { s + S ′ ∣ s ∈ S } ∪ { S + s ′ ∣ s ′ ∈ S ′ } S+S'=\{s+S'|s\in S\}\cup\{S+s'|s'\in S'\} S+S′={s+S′∣s∈S}∪{S+s′∣s′∈S′}
把它递归展开就可以得到 S + S ′ S+S' S+S′ 局面的集合表达了。当然,这一般只用于给出形式化的定义,实际上不会用,因为复杂度爆炸。当我们需要考虑两个局面相加时,通常我们是根据意义来理解这件事情,想象发生了什么,并描述出关系,而不会用它来暴力展开。比如说你可以很容易发现,局面的相加满足交换律和结合律。
局面的等价性:通常在我们研究问题的过程中,如果有两个东西,把一个换成另一个不会影响问题,我们就说它俩等价
局面的等价怎么描述?如果根据输赢,你会发现,只要 n > 0 n>0 n>0, ∗ n *n ∗n 就是 N N N 的。但显然我们很有必要关心每一堆里具体有多少石子。因此只根据输赢描述肯定不行。
我们发现问题出在把局面组合起来的时候。因此我们这样描述:对于局面 G , G ′ G,G' G,G′, ∀ H , w i n ( G + H ) = w i n ( G ′ + H ) \forall H,win(G+H)=win(G'+H) ∀H,win(G+H)=win(G′+H) (这里的等于是指输赢情况相等),则我们说 G G G 和 G ′ G' G′ 等价,记作 G ≈ G ′ G\approx G' G≈G′。
SG 定理是说,对于每个局面 S S S,都存在恰好一个 n n n 使得 S ≈ ∗ n S\approx *n S≈∗n。并且 n n n 的值为所有 S S S 的后继状态 n n n 值的 mex。这个 n n n 值就是 S G SG SG 函数的值 S G ( S ) SG(S) SG(S)。
SG 的另一个性质是,若 S = A 1 + A 2 . . . + A n S=A_1+A_2...+A_n S=A1+A2...+An,则 S G ( S ) = S G ( A 1 ) ⊕ S G ( A 2 ) ⊕ . . . ⊕ S G ( A N ) SG(S)=SG(A_1)\oplus SG(A_2)\oplus...\oplus SG(A_N) SG(S)=SG(A1)⊕SG(A2)⊕...⊕SG(AN),其中 ⊕ \oplus ⊕ 为 Nim 和,也就是我们熟悉的异或和。关于这个的证明:首先使用 SG 定理,然后参考【Nim游戏的正确性证明】,得到它是对的。这个放在 SG 定理证明的后面。
对于一个 P P P 的局面 A A A 和任意局面 G G G, G ≈ G + A G\approx G+A G≈G+A。
对于任意 H H H,需要满足 w i n ( G + H ) = w i n ( G + H + A ) win(G+H)=win(G+H+A) win(G+H)=win(G+H+A)。分类讨论。
如果 w i n ( G + H ) = P win(G+H)=P win(G+H)=P,那么 w i n ( G + H + A ) win(G+H+A) win(G+H+A) 一定也是 P P P。为什么呢?整个局面可以看成 ( G + H ) + A (G+H)+A (G+H)+A,由两个后手必胜的局面组成。无论先手在哪个部分操作,后手都可以用对应的必胜策略来应对。两边后手都不会输,因此总局面也一定是后手必胜。
如果 w i n ( G + H ) = N win(G+H)=N win(G+H)=N,那么 w i n ( G + H + A ) win(G+H+A) win(G+H+A) 一定也是 N N N。同样分成 G + H G+H G+H 和 A A A 两部分, G + H G+H G+H 是先手必胜的,先手按必胜策略在这里操作一步后,就形成两个先手必败的局面给后手。按照上一种情况中的讨论可知,操作完这一步后的先手(即原来的后手)必败。 那也就是原来的先手必胜,就是
w i n ( G + G ′ ) = P ⟺ G ≈ G ′ win(G+G')=P \iff G\approx G' win(G+G′)=P⟺G≈G′
考虑 G + G + G ′ G+G+G' G+G+G′。
一方面它等于 ( G + G ) + G ′ (G+G)+G' (G+G)+G′。发现 G + G G+G G+G 一定是后手必胜的,因为后手可以和先手做对称的操作,只要先手能走,后手就一定能走,后手永远不会输。因此它是一个 P P P 的局面 + G ′ +G' +G′,根据引理1知它等价于 G ′ G' G′
另一方面它等于 G + ( G + G ′ ) G+(G+G') G+(G+G′),由于 G + G ′ G+G' G+G′ 是 P P P 的,所以它等价于 G G G。
从而 G ≈ G + G + G ′ ≈ G ′ G\approx G+G+G'\approx G' G≈G+G+G′≈G′。
结构归纳法可以看成是数学归纳法在DAG上的拓展:我们先说明一些命题是对的,然后命题之间存在依赖关系(无环),对于每个依赖关系证明:若前置命题对,则某命题对,从而推得所有命题都对。
数学归纳法可以看成是对一条退化成链的DAG进行结构归纳法
我们使用结构归纳法证明:首先没有后继状态的局面等价于 ∗ 0 *0 ∗0,然后对于局面 S S S,我们证明:如果它的后继中SG定理成立,那么 S S S 中SG定理成立。
即,设:对于局面 S = { S 1 , S 2 . . . S k } S=\{S_1,S_2...S_k\} S={S1,S2...Sk},假设 S 1 , S 2 . . . S k S_1,S_2...S_k S1,S2...Sk 都等价于一些单堆 Nim 游戏,设它们为 ∗ n 1 , ∗ n 2 . . . ∗ n k *n_1,*n_2...*n_k ∗n1,∗n2...∗nk,那么存在 m m m 使得 S ≈ ∗ m S\approx *m S≈∗m,并且我们知道 m = m e x { n 1 , n 2 . . . n k } m=mex\{n_1,n_2...n_k\} m=mex{n1,n2...nk}
显然 S ≈ S ′ = { ∗ n 1 , ∗ n 2 . . . ∗ n k } S\approx S'=\{*n_1,*n_2...*n_k\} S≈S′={∗n1,∗n2...∗nk}。 考虑证明 S ′ ≈ ∗ m S'\approx *m S′≈∗m。
根据引理2,这件事情等价于 w i n ( S ′ + ∗ m ) = P win(S'+*m)=P win(S′+∗m)=P。分类讨论
综上, w i n ( S ′ + ∗ m ) = P win(S'+*m)=P win(S′+∗m)=P,从而 S ′ ≈ ∗ m S'\approx *m S′≈∗m。又因为 S ≈ S ′ S\approx S' S≈S′,从而 S ≈ ∗ m S\approx *m S≈∗m。
我们知道,取 a i a_i ai 的异或和,大于 0 0 0 就是先手必胜,为 0 0 0 就是后手必胜。
我们使用数学归纳法证明。设命题 P ( k ) P(k) P(k) 表示:当 ∑ a i ≤ k \sum a_i\le k ∑ai≤k 时,结论成立。
显然 P ( 0 ) P(0) P(0) 成立,因为此时 a i a_i ai 一定全 0 0 0,异或和为 0 0 0,后手胜。
下证: 当 P ( k − 1 ) P(k-1) P(k−1) 成立时, P ( k ) P(k) P(k) 成立。
设此时 a i a_i ai 的异或和为 x x x。分类讨论:
若
x
>
0
x>0
x>0,设
x
x
x 二进制最高位为
2
p
2^p
2p 位。那么一定有至少一个
a
i
a_i
ai,它的
2
p
2^p
2p 位为
1
1
1。我们把
a
i
a_i
ai 变成
a
i
⊕
x
a_i\oplus x
ai⊕x,那么
a
i
a_i
ai 比
p
p
p 高的位不变,
p
p
p 位上由
1
1
1 变成
0
0
0,不管后面怎么变
a
i
a_i
ai 都会变小。这样一来,所有
a
i
a_i
ai 的异或和变成了
0
0
0,并且和一定
<
k
若 x = 0 x=0 x=0,无论先手如何操作,和都会变小,并且异或一定会变成一个非 0 0 0 的数。(将 a a a 变成 a ′ < a a'a′<a,异或和变化为 a ⊕ a ′ a\oplus a' a⊕a′,当且仅当 a ′ = a a'=a a′=a 时它可以为 0 0 0,由于 a ′ < a a'a′<a,因此它一定不为 0 0 0)根据 P ( k − 1 ) P(k-1) P(k−1) 成立,此时的 a i a_i ai 先手必胜,也就是原来的 a i a_i ai 后手必胜。
综上, P ( k − 1 ) P(k-1) P(k−1) 成立时, P ( k ) P(k) P(k) 成立。
SG:你发现一个SG值和单堆Nim唯一的不同在于它可以变大,但是变大的话你显然可以再变回来,所以和单堆Nim等价
Nim:你发现你找一个最高位重合的异或一下就可以把非0的异或和变成0,并且异或和为0时无论如何都会变成非0