Nimber系列略学习笔记

Nimber系列略学习笔记

前言

\(\text{Nim+Number=Nimber}\)

基于我们熟悉的博弈问题\(\text{Nim}\)问题,我们定义了多\(\text{Nim}\)问题的和,即\(\text{Nim}\)

我们知道\(\text{Nim}\)和就是异或运算,为了构成一个更完整的\(\text{Number}\)域,又引入一种新的运算

\(\text{Nim}\)

\[\ \]

\[\ \]

定义

对于在\([0,2^{2^m})\)上的整数,定义两种\(\text{Nim}\)运算,构成一个封闭的域

1.\(\text{Nim}\)\(\oplus\)\(\displaystyle x\oplus y=\text{mex}\{\{a\oplus y|a<x\}\cup\{x\oplus b|b<y\}\}\)

其中对于非负整数集合的\(\text{mex}\)运算即求不在集合中的最小非负整数

也就是\(\text{Nim}\)游戏的"和"

\[\ \]

2.\(\text{Nim}\)\(\otimes\)

需要先介绍高维\(\text{Nim}\)游戏

对于一维情况:

数轴上整点处有若干黑点\(x_i\),每次操作可以选择一个黑点\(x_i\),找到\(a<x_i\)

将线段\([a,x_i]\)两端点的黑白翻转

对于二维情况:

平面上整点处有若干黑点\((x_i,y_i)\),每次选择一个黑点\((x_i,y_i)\),找到另一个点\((a,b),a<x_i,b<y_i\)

将矩形\((a,b)-(x_i,y_i)\)四个顶点的颜色翻转

对于三维情况:

空间上整点处有若干黑点\((x_i,y_i,z_i)\),每次选择一个黑点\((x_i,y_i,z_i)\),找到另一个点\((a,b,c),a<x_i,b<y_i,c<z_i\)

将长方体\((a,b,c)-(x_i,y_i,z_i)\)八个顶点的颜色翻转

\(\ldots\)

\(\text{Nim}\)积是高维\(\text{Nim}\)游戏的降维操作,显然各个维度之间无序,每个黑点之间可以通过\(\text{Nim}\)和相加

由此定义在二维\(\text{Nim}\)游戏上的\(\text{Nim}\)积运算

\(x\otimes y=\text{mex}\{(a\otimes y)\oplus (x\otimes b)\oplus(a\otimes b)|a<x,b<y\}\)

相较于\(\text{Nim}\)和,\(\text{Nim}\)积运算十分复杂,需要若干性质简化运算

1.基础运算律

\(x\otimes 1=x\)

\(x\otimes y=y\otimes x\)

\((x\otimes y)\otimes z=x\otimes (y\otimes z)\)

2.\(2^{2^n}\otimes 2^{2^m}=\left\{\begin{aligned}2^{2^n+2^m} && n\ne m\\ 3\cdot 2^{2^n-1} && n=m\end{aligned}\right.\)

3.\(2^{2^n}\otimes x=2^{2^n}\times x\ (x<2^{2^n})\)

对于\(x,y\in [0,2^{2^m})\),利用性质3,用减半的方法优化运算,令\(n=2^{m-1}\)

\(x=a\cdot 2^n+b,y=c\cdot 2^n+d,a,b,c,d\in[0,2^n)\)

\(x\otimes y=(a\otimes 2^n\oplus b)\otimes (c\otimes 2^n\oplus d)\)

\(=((a\otimes c)\otimes (3\cdot 2^{n-1}))\oplus (2^n\cdot ((a\otimes d)\oplus (b\otimes c))\ ) \oplus (b\otimes d)\)

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

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

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

由此进行暴力递归需要依次计算\(a\otimes c,(a\otimes c)\otimes 2^{n-1},b\otimes d,(a\oplus b)\otimes (c\oplus d)\)

复杂度为\(O(4^{m})\),由于\(2^{n-1}\)

对于\(2^{32}\)以内的运算,即\(m=5\),看起来已经可以接受?

\[\ \]

\[\ \]

应用原根的优化

\(\text{Nimber}\)域内是存在原根的,\([0,2^{16})\)域内最小的原根是\(258\)

如果预处理出\([0,2^{16})\)以内所有数的原根指标和乘法表,即可\(O(1)\)查询\([0,2^{16})\)任意数的\(\text{Nimber}\)

由此也可以仅通过一次递归计算\([0,2^{32})\)域内的\(\text{Nimber}\)

\[\ \]

\[\ \]

更多运算

对于\([0,2^{2^m})\)域内的\(\text{Nimber}\),由性质\(x^{2^m}=x\)导出的运算有

\(\displaystyle \frac{1}{x}=x^{2^m-2}\)

\(\sqrt x=x^{2^{m-1}}\)

posted @ 2021-02-25 14:33  chasedeath  阅读(521)  评论(0编辑  收藏  举报