【博弈论】SG(Sprague–Grundy)定理证明和Nim游戏正确性证明
【博弈论】SG(Sprague–Grundy)定理证明和Nim游戏正确性证明
网上好像都是引用的维基,或者证的很不严谨
这里提供一个稍微严谨一点的证明,SG的部分基本上参考了维基 (自己想过,没想出来www)
要转载的话随便转载,就是不知道这垃圾玩意有没有转载的必要啊
定义
公平组合游戏,Nim游戏
满足如下条件的游戏被称为公平组合游戏:
- 两人轮流操作
- 如果有人不能操作,那么他就输了
- 对于当前状态,可以做的决策只与状态有关,和哪个人操作无关
Nim游戏:有 堆石子,二人轮流操作,每人可以在某堆中任意取若干个,但不能不取。如果某人不能取了那么它就输了。
常见的棋类就不是公平组合游戏,因为你不可以动别人的棋子。但Nim就是公平组合游戏,因为任何一方都可以拿任何一堆中的石子。
描述一个局面
对于一个局面,我们其实只关心它能到达哪些局面,因此我们用集合来描述一个局面,集合中包含它能到达的后继局面。 (因此你如果要展开这个集合,你会看到很多集合套集合)。如果它没有后继局面(即无法操作),我们用空集描述它。
特殊地,我们记 表示一堆含有 个石子的Nim局面。容易发现 ,是一个递归的结构。如果要展开就会变成集合套集合。
比如 。
对于一个局面,如果是先手必胜,我们说它是 的,否则就是 的。
关于胜负情况,好像没有找到相关的函数描述。这里我们用 表示局面 的胜负情况,其值为 或者 。
判定局面的胜负性:
- 如果当前局面可以到达 至少一个 局面,那当前是 局面
- 如果当前局面后继 全部都是 局面,那当前是 局面
局面间的关系
局面的和:对于两个局面 ,定义 表示:现在同时进行 和 两个游戏,两边都不能操作就算输,这样的一个局面。如何描述它呢?
很明显,如果你要走一步,要么走 的一个后继,要么走 的一个后继。比如说你走了 的后继 ,那接下来就是 和 两个游戏同时进行,是一个子结构。另一边同理。因此我们可以写出这样的定义式:
把它递归展开就可以得到 局面的集合表达了。当然,这一般只用于给出形式化的定义,实际上不会用,因为复杂度爆炸。当我们需要考虑两个局面相加时,通常我们是根据意义来理解这件事情,想象发生了什么,并描述出关系,而不会用它来暴力展开。比如说你可以很容易发现,局面的相加满足交换律和结合律。
局面的等价性:通常在我们研究问题的过程中,如果有两个东西,把一个换成另一个不会影响问题,我们就说它俩等价
局面的等价怎么描述?如果根据输赢,你会发现,只要 , 就是 的。但显然我们很有必要关心每一堆里具体有多少石子。因此只根据输赢描述肯定不行。
我们发现问题出在把局面组合起来的时候。因此我们这样描述:对于局面 , (这里的等于是指输赢情况相等),则我们说 和 等价,记作 。
SG 定理
SG 定理是说,对于每个局面 ,都存在恰好一个 使得 。并且 的值为所有 的后继状态 值的 mex。这个 值就是 函数的值 。
SG 的另一个性质是,若 ,则 ,其中 为 Nim 和,也就是我们熟悉的异或和。关于这个的证明:首先使用 SG 定理,然后参考【Nim游戏的正确性证明】,得到它是对的。这个放在 SG 定理证明的后面。
证明
引理1
对于一个 的局面 和任意局面 ,。
对于任意 ,需要满足 。分类讨论。
如果 ,那么 一定也是 。为什么呢?整个局面可以看成 ,由两个后手必胜的局面组成。无论先手在哪个部分操作,后手都可以用对应的必胜策略来应对。两边后手都不会输,因此总局面也一定是后手必胜。
如果 ,那么 一定也是 。同样分成 和 两部分, 是先手必胜的,先手按必胜策略在这里操作一步后,就形成两个先手必败的局面给后手。按照上一种情况中的讨论可知,操作完这一步后的先手(即原来的后手)必败。 那也就是原来的先手必胜,就是
引理2
考虑 。
一方面它等于 。发现 一定是后手必胜的,因为后手可以和先手做对称的操作,只要先手能走,后手就一定能走,后手永远不会输。因此它是一个 的局面 ,根据引理1知它等价于
另一方面它等于 ,由于 是 的,所以它等价于 。
从而 。
前置知识:结构归纳法
结构归纳法可以看成是数学归纳法在DAG上的拓展:我们先说明一些命题是对的,然后命题之间存在依赖关系(无环),对于每个依赖关系证明:若前置命题对,则某命题对,从而推得所有命题都对。
数学归纳法可以看成是对一条退化成链的DAG进行结构归纳法
SG定理的证明
我们使用结构归纳法证明:首先没有后继状态的局面等价于 ,然后对于局面 ,我们证明:如果它的后继中SG定理成立,那么 中SG定理成立。
即,设:对于局面 ,假设 都等价于一些单堆 Nim 游戏,设它们为 ,那么存在 使得 ,并且我们知道
显然 。 考虑证明 。
根据引理2,这件事情等价于 。分类讨论
- 假设先手在 中操作,走到了 。若 ,显然后手可以在 中也走到 ,变成两个相同局面同时进行,显然是后手必胜。如果 ,那么后手可以继续在 中操作,走到 ,又变成两个相同局面,后手必胜。
- 假设先手在 中操作,走到了 ,那显然后手就在 中走,走到 ,后手必胜
综上,,从而 。又因为 ,从而 。
Nim游戏正确性证明
我们知道,取 的异或和,大于 就是先手必胜,为 就是后手必胜。
我们使用数学归纳法证明。设命题 表示:当 时,结论成立。
显然 成立,因为此时 一定全 ,异或和为 ,后手胜。
下证: 当 成立时, 成立。
设此时 的异或和为 。分类讨论:
若 ,设 二进制最高位为 位。那么一定有至少一个 ,它的 位为 。我们把 变成 ,那么 比 高的位不变, 位上由 变成 ,不管后面怎么变 都会变小。这样一来,所有 的异或和变成了 ,并且和一定 。根据 成立,此时的 的后手必胜。也就是说原来的 先手必胜。
若 ,无论先手如何操作,和都会变小,并且异或一定会变成一个非 的数。(将 变成 ,异或和变化为 ,当且仅当 时它可以为 ,由于 ,因此它一定不为 )根据 成立,此时的 先手必胜,也就是原来的 后手必胜。
综上, 成立时, 成立。
证明概括
SG:你发现一个SG值和单堆Nim唯一的不同在于它可以变大,但是变大的话你显然可以再变回来,所以和单堆Nim等价
Nim:你发现你找一个最高位重合的异或一下就可以把非0的异或和变成0,并且异或和为0时无论如何都会变成非0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2021-08-03 Atcoder Regular Contest 124 (vp)比赛记录