博弈论总结

Nim 和

\[a\oplus b=\operatorname{mex}(\{a\oplus c\mid 0\le c<b\}\cup\{d\oplus b\mid 0\le d<a\}) \]

可知 \(a\oplus b=a\operatorname{xor}b\)
设一个 Nim 游戏的值为 \(x\),则两个 Nim 游戏的和即为 \(x\oplus y\)
它是 Acrostic Twins 的 SG 函数。

Nim 积

在 Nim 和之上,我们希望定义一个优先级更高的运算 \(\otimes\),使得 Nimber(Nim number) 和 \((\oplus,\otimes)\) 构成一个域。
然后就出现了:

\[a\otimes b=\operatorname{mex}\{(x\otimes y)\oplus(a\otimes y)\oplus(x\otimes b)\mid 0\le x<a,0\le y<b\} \]

这是 Turning Corner 的 SG 函数。
Turning Corner:
给定一个 \(n\times m\) 的二维矩阵,上面每个方格中均放有一枚硬币,初始时为正面或反面的一种。Alice 先手,她和 Bob 交替地翻转一个矩形的四个顶点,并限制矩形的右下角必须从反面翻至正面。

它有很多优美的性质,与普通乘法类似:

  • \(x\otimes 0=0\)
  • \(x\otimes 1=x\)
  • \(x\otimes y=y\otimes x\)
  • \((x\otimes y)\otimes z=x\otimes(y\otimes z)\)
  • \(x\otimes(y\oplus z)=x\otimes y\oplus x\otimes z\)

现在问题来了:如何计算 \(x\otimes y\) 的值?

Nim 积的计算

对于费马数 \(F_n=2^{2^n}(n\in\mathbb N)\),有:

  • \(a<F_k\),则 \(a\otimes F_k=a\times F_k\)
  • \(F_k\otimes F_k=\frac{3}{2}F_k\)

这里给出一些计算 Nim 积的方式。

第一种:将 \(x\otimes y\) 拆成 \((aF_k\oplus b)\otimes(cF_k\oplus d)\),其中 \(0\le a,c<F_k\),然后有:

\[\begin{aligned}x\otimes y&=(aF_k\otimes cF_k)\oplus(aF_k\otimes d)\oplus(b\otimes cF_k)\oplus(b\otimes d)\\&=\left(a\otimes c\otimes\left(\frac{3}{2}F_k\right)\right)\oplus((a\otimes d\oplus b\otimes c)\otimes F_k)\oplus b\otimes d\\&=(a\otimes c\oplus a\otimes d\oplus b\otimes c)\otimes F_k\oplus a\otimes c\otimes \frac{1}{2}F_k\oplus b\otimes d\\&=((a\oplus b)\otimes(c\oplus d)\oplus a\otimes d)\otimes F_k\oplus a\otimes c\otimes \frac{1}{2}F_k\oplus b\otimes d\end{aligned} \]

\(n=2^k\),则上式可写作

\[((a\oplus b)\otimes(c\oplus d)\oplus a\otimes d)\otimes 2^n\oplus a\otimes c\otimes 2^{n-1}\oplus b\otimes d \]

每次找到最小的 \(k\),使得 \(2^{2^k}>\max(x,y)\),然后递归计算上述四项。时间复杂度为 \(\mathcal O\left(4^{\mathcal O(\log\log V)}\right)\)

第二种:将一个数拆成二进制形式,两两计算 \(2^x\otimes 2^y\) 的值,再拆成费马数的形式计算。直接做的时间复杂度是 \(\mathcal O(\log^2 n\log\log n)\) 的。
可以优化为 \(\mathcal O(\log^2 n)\),但是速度不及下一种方法。

第三种:对于第一种方法,相当于逐位计算,实际上可以选取一个好的 \(k\),产生折半的效果。这样做的时间复杂度是 \(\mathcal O\left(4^{\mathcal O(\log\log\log V)}\right)\)。速度极快。

第四种:如果给定有限域,那么存在原根,可以直接将乘法转换为指数上的加法,速度更快。
(当 \(k=4\) 时最小的原根为 \(258\)

Nimber 在 \([0,F_k)\cap\mathbb N\) 中的有限域上有:

\[x^{F_k-1}=1 \]

\[\sqrt{x}=x^{\frac{1}{2}F_k}=x^{2^{2^k-1}} \]

Tartan 定理

\(SG(x)\)\(x\) 的 SG 函数,那么 \(G_1\times G_2\) 的 SG 函数为 \(SG(G_1)\otimes SG(G_2)\)
比如 Turning Corners 游戏,它其实就是 Acoustic Twins 与 Acoustic Twins 的乘积。
它很容易计算 SG 函数,但不容易寻找必胜策略。

例题:Bad Cryptography Switch lights

posted @ 2024-06-04 09:18  yzy4090  阅读(87)  评论(0)    收藏  举报  来源