【学习笔记】平等博弈及常见的公平博弈类型

文章目录

  • 平等博弈
  • nim堆
  • SG定理
  • nim和
  • 常见的公平博弈模型
    • bash博弈
    • nim博弈
    • nim-k博弈
    • wythoff博弈
    • 扩展wythoff博弈
    • fibonacci博弈
    • 阶梯博弈
    • green hackenbush
    • Misère Nim博弈
    • Every-SG
  • nim积
  • 翻棋子游戏
  • 游戏的积,tartan定理

平等博弈

G={L∣R},L=RG=\{L|R\},L=RG={LR},L=R,所以一般简写成 G={L}G=\{L\}G={L}

即在平等博弈中左右手玩家的可操作方法是相同的。

显然 G+G=0G+G=0G+G=0,因为把当前的游戏复制一份,后手就可以模仿先手的动作,从而后手必胜。

所以 G=0or G∣∣0G=0\ \text{or}\ G||0G=0 or G0

即,公平博弈要么先手必胜要么后手必胜,不区分左右手。

一些数学化的表达与之前的非平等博弈含义一样:

  • GGG 是一个游戏局面。
  • LLL 是左手玩家操作后的可能后继局面。
  • RRR 是右手玩家操作后的可能后继局面。
  • G∣∣0G||0G0 表示先手必胜。
  • G=0G=0G=0 表示后手必胜。

nim堆

∗n*nn 游戏,即石子数为 nnn 的一个 nim\text{nim}nim 堆。

显然有 ∗n={0,∗,∗2,...,∗(n−1)}(n≥1)∣∣0*n=\{0,*,*2,...,*(n-1)\}\ (n\ge 1)||0n={0,,2,...,(n1)} (n1)0

因为只有一堆,先手直接拿完即可。

SG定理

GGG 是有限状态的公平博弈,G={∗a,∗b,...}G=\{*a,*b,...\}G={a,b,...} ,则该博弈等价为 G=∗nG=*nG=n,其中 n=mex(a,b,...)n=\text{mex}(a,b,...)n=mex(a,b,...)

证明:

G+G=0⇔G=−G⇒G+G=0\Leftrightarrow G=-G\RightarrowG+G=0G=G 只需要证明 G=∗n⇔∗n−G=0⇒G+∗n=0G=*n\Leftrightarrow *n-G=0\Rightarrow G+*n=0G=nnG=0G+n=0【看作两个公平博弈游戏的当前局面,一个为 GGG ,一个为 nnn 个石子数的 nim\text{nim}nim 堆】

即证明这种新博弈游戏是后手必胜的。

考虑先手的操作:

  • 如果先手操作 ∗n*nn,将其变为 ∗m(m<n)*m\ (m<n)m (m<n),那么后手可以操作 GGG,将 GGG 变成 ∗m*mm
  • 如果先手操作 GGG
    • 将其变为 ∗m(m<n)*m\ (m<n)m (m<n),那么后手也可以将 ∗n*nn 变成 ∗m*mm
    • 将其变为 ∗m(m>n)*m\ (m>n)m (m>n),那么后手也可以把 ∗m*mm 变成 ∗n*nn
  • 但先手不能将 GGG 变为 ∗n*nn,因为 GGG 的后继局面中没有 ∗n*nn

石子数一直在减小所以不会有环的情况,后手一定是有对应先手的操作方法,所以后手必胜。

GGG 是有限状态的公平博弈,G={A,B,C,...}G=\{A,B,C,...\}G={A,B,C,...},那么存在一个 nnn,使得 G=∗nG=*nG=n

GGG 这个有限状态的博弈构成了一个 DAG

那么 DAG 没有出度的点就是 0⇒n=00\Rightarrow n=00n=0

归纳法,假设存在 a,b,c,...a, b, c,...a,b,c,... 使得 A=∗a,B=∗b,C=∗c,...A=*a, B=*b, C=*c,...A=a,B=b,C=c,...

那么 G={∗a,∗b,∗c,...}=∗nG=\{*a, *b, *c, ...\}=*nG={a,b,c,...}=n,其中 n=mex(a,b,c,...)n=\text{mex}(a, b, c, ...)n=mex(a,b,c,...)

说明任意有限状态的公平博弈和 nnn 个石子的 nim\text{nim}nim 堆等价。

nim和

存在一个 nnn ,使得 ∗a+∗b=∗n*a+*b=*na+b=n。其中 n=axor bn=a\ \text{xor}\ bn=a xor b

证明:

n=a⊕bn=a\oplus bn=ab【此等号的意思是“记作”,⊕\oplus 就是 nim和 的意思】

G=∗a+∗b={∗a′+∗b,∗b′+∗a}(a′<a,b′<b)G=*a+*b=\{*a'+*b,*b'+*a\}\ (a'<a,b'<b)G=a+b={a+b,b+a} (a<a,b<b)

SG定理n=mex(a′⊕b,b′⊕a)n=\text{mex}(a'\oplus b,b'\oplus a)n=mex(ab,ba)

所以只需要证明 mex(a′⊕b,b′⊕a)=axor b\text{mex}(a'\oplus b,b'\oplus a)=a\ \text{xor}\ bmex(ab,ba)=a xor b

a=b=0a=b=0a=b=0 时,0⊕0=mex(∅)=0=0xor 00\oplus 0=\text{mex}(\empty)=0=0\ \text{xor}\ 000=mex()=0=0 xor 0【可以理解为初始局面没有一个石子,先手无法操作,所以后手必胜】

归纳法,证明 mex(a′xor b,axor b′)=axor b\text{mex}(a'\ \text{xor}\ b,a\ \text{xor}\ b')=a\ \text{xor}\ bmex(a xor b,a xor b)=a xor b 即可。

继续转化为证明 axor ba\ \text{xor}\ ba xor b 不在集合 {a′xor b,axor b′}\{a'\ \text{xor}\ b,a\ \text{xor}\ b'\}{a xor b,a xor b} 中,且比 axor ba\ \text{xor}\ ba xor b 小的所有自然数都在集合 {a′xor b,axor b′}\{a'\ \text{xor}\ b,a\ \text{xor}\ b'\}{a xor b,a xor b} 中。

  • axor ba\ \text{xor}\ ba xor b 不在集合中

    ·反证法,假设 ∃x<axxor b=axor b\exist_{x<a}\ x\ \text{xor}\ b=a\ \text{xor}\ bx<a x xor b=a xor b

    则有,xxor bxor b=axor bxor b⇒x=ax\ \text{xor}\ b\ \text{xor}\ b=a\ \text{xor}\ b\ \text{xor}\ b\Rightarrow x=ax xor b xor b=a xor b xor bx=a,矛盾。

    假设 ∃x<bxxor a=axor b\exist_{x<b}\ x\ \text{xor}\ a=a\ \text{xor}\ bx<b x xor a=a xor b ,同理。

  • axor ba\ \text{xor}\ ba xor b 小的所有自然数都在集合 {a′xor b,axor b′}\{a'\ \text{xor}\ b,a\ \text{xor}\ b'\}{a xor b,a xor b} 中。

    ∀x<axor bx∈{a′xor b,axor b′}\forall_{x<a\ \text{xor}\ b}\ x\in\{a'\ \text{xor}\ b,a\ \text{xor}\ b'\}x<a xor b x{a xor b,a xor b}y=axor bxor xy=a\ \text{xor}\ b\ \text{xor}\ xy=a xor b xor x

    考虑将 a,b,xa,b,xa,b,x 分别异或上yyy

    yyy 最高位的 111 必然来自于 a/b/xa/b/xa/b/x 其中一个,也可能是三个都有。

    所以 a/b/xa/b/xa/b/x 三个数分别异或 yyy 后,至少有一个数要变小。

    但是这个数肯定不可能是 xxx,因为 xxor y=axor b>xx\ \text{xor}\ y=a\ \text{xor}\ b>xx xor y=a xor b>x,矛盾。

    不妨设 axor y=bxor x<aa\ \text{xor}\ y=b\ \text{xor}\ x<aa xor y=b xor x<a,那么 x=bxor xxor b∈x=b\ \text{xor}\ x\ \text{xor}\ b\inx=b xor x xor b 集合 {a′xor b}\{a'\ \text{xor}\ b\}{a xor b}

    由于 xxx 的任意性,证毕。

常见的公平博弈模型

bash博弈

nnn 个物品,每次至少取一个,最多取m个,先取光的胜。

因为一轮总可以两个玩家一起取 m+1m+1m+1 个。

所以如果 nnnm+1m+1m+1 的倍数,那么后手必能先取光。

否则,先手可以第一次取 n%(m+1)n\%(m+1)n%(m+1) 个,然后设后手取 xxx 个,先手第二轮以后就取 m+1−xm+1-xm+1x 个。

当然也可以直接用 SG定理 算。

nim博弈

nnn 堆石子,每次可以选一堆石子任意拿,最少拿一颗,先取光的胜。

每一堆石子就是 ∗ai*a_iainnn 堆石子等价于 111 堆石子,个数为这 nnn 堆石子的异或和。

当且仅当异或和为 000 时后手必胜。

nim-k博弈

nnn 堆石子,每次可以选最少 111 堆,不超过 kkk 堆石子,在这些堆石子里面任意拿,每堆最少拿一颗,先取光的胜。

把这 nnn 堆石子的数量转成二进制,然后在每一位上加起来,如果每一位都是 k+1k+1k+1 的倍数,那么后手胜,否则先手胜。

具体证明因为以前写过,就不再赘述!

可以把 nim-k博弈 认为是一个高维的 nim和

nim-k博弈 是一个有限状态的公平游戏,所以当然可以由 SG定理 ,化简成 ∗n*nn 的形式。

但是只有是否等于 000 的时候有规律,其他时候 nnn 的取值没有明显的规律。

所以一般只能定性研究 nim-k博弈,很难研究含有 nim-k博弈 的组合游戏。

由于可以看作是高维的 nim和。所以 ∗n*nn 的游戏都可以在同时操作 kkk 个游戏的意义下组合起来。

bash-k博弈nnn 堆石子,每次可以选最少 111 堆,不超过 kkk 堆石子,在这些堆石子里面任意拿,每堆最少拿一颗,最多拿 rrr 颗,先取光的胜。

单独来看,每堆石子是一个 bash博弈,游戏的值是 ∗(ai(modr+1))*(a_i\pmod{r+1})(ai(modr+1))

再把这 nnn 堆石子用 nim-k 的方式组合起来,所以就是把 ai(modr+1)a_i\pmod {r+1}ai(modr+1) 变成二进制,然后每一位加起来,如果每一位都是 k+1k+1k+1 的倍数,则后手赢,否则先手赢。

wythoff博弈

222 堆石子,每人每次可以拿走任意一堆中任意数量的石子 或 在两堆石子中拿走相同数量的石子,不能拿的人输。

同样地,wythoff博弈 的值没有明显的规律,只有为 000 的位置 (x,y)(x,y)(x,y) 有规律:

xi=mex{xj,yj∣j<i},yi=xi+ix_i=\text{mex}\Big\{x_j,y_j\Big|j<i\Big\},y_i=x_i+ixi=mex{xj,yjj<i},yi=xi+i

前几个为 000 的位置:(0,0),(1,2),(3,5),(4,7),(6,10)(0,0),(1,2),(3,5),(4,7),(6,10)(0,0),(1,2),(3,5),(4,7),(6,10)。【两个位置分别代表一堆的剩余石子数】

(4,7)(4,7)(4,7) 举例说明,(0,0)(1,2)(3,5)(0,0)(1,2)(3,5)(0,0)(1,2)(3,5) 生成的集合 {0,1,2,3,5}\{0,1,2,3,5\}{0,1,2,3,5}mex=4\text{mex}=4mex=4,这是第三个【从零开始编号】,所以 +3+3+3

当不算 (0,0)(0,0)(0,0) 时,可以发现 xi,yix_i,y_ixi,yi 就是正整数集的一个分割。

betty定理

α,β\alpha,\betaα,β 为正无理数,且 1α+1β=1\frac{1}{\alpha}+\frac{1}{\beta}=1α1+β1=1

A={⌊αn⌋∣n∈N+},B={⌊βn⌋∣n∈N+}A=\{\lfloor\alpha n\rfloor\Big|n\in N^+\},B=\{\lfloor\beta n\rfloor\Big|n\in N^+\}A={αnnN+},B={βnnN+},则 A⋂B=∅∧A⋃B=N+A\bigcap B=\empty\wedge A\bigcup B=N^+AB=AB=N+

套用 betty定理xi=⌊αi⌋,yi=⌊βi⌋=⌊αi⌋+i=⌊(α+1)i⌋x_i=\lfloor\alpha i\rfloor,y_i=\lfloor\beta i\rfloor=\lfloor\alpha i\rfloor+i=\lfloor(\alpha+1) i\rfloorxi=αi,yi=βi=αi+i=(α+1)i

解出 β=α+1⇒α=1+52\beta=\alpha+1\Rightarrow \alpha=\frac{1+\sqrt{5}}{2}β=α+1α=21+5

这样就得到了为 000 的位置的通项了,(⌊1+52i⌋,⌊3+52i⌋)(\lfloor\frac{1+\sqrt{5}}{2}i\rfloor,\lfloor\frac{3+\sqrt{5}}{2}i\rfloor)(21+5i,23+5i)

扩展wythoff博弈

222 堆石子,每人每次可以拿走任意一堆中任意数量的石子 或 在两堆石子中数量差 ≤k\le kk 的石子,不能拿的人输。

xi=mex{xj,yj∣j<i},yi=xi+(k+1)ix_i=\text{mex}\Big\{x_j,y_j\Big|j<i\Big\},y_i=x_i+(k+1)ixi=mex{xj,yjj<i},yi=xi+(k+1)i

仍然是套用 betty定理

fibonacci博弈

111 堆石子有 nnn 个,两人轮流取。先取者第 111 次可以取任意多个,但不能全部取完。

以后每次取的石子数不能超过上次取子数的 222 倍,取完者胜。

nnn 是斐波那契数,那么先手必败,否则必胜。

证明:

实际上先手一次取的石子数目一定 <13n<\frac{1}{3}n<31n,否则后手可在下一步一次性取完。这将是以下证明的基石。

斐波那契数的情形,首先 f(1)=2,f(2)=3f(1)=2,f(2)=3f(1)=2,f(2)=3 的情形先手必败。

归纳法。【根据斐波那契以及不等式的转化可得出以下关系式】
{f(n)=f(n−1)+f(n−2)f(n−1)<2f(n−2)<f(n)(1)3f(n−2)>f(n)(2)4f(n−2)<3f(n+1)(3)\begin{cases}f(n)=f(n-1)+f(n-2)\\ f(n-1)<2f(n-2)<f(n)\ \quad (1)\\ 3f(n-2)>f(n)\quad\quad\ \quad\quad\quad\quad (2)\\ 4f(n-2)<3f(n+1)\quad\quad\quad\quad(3)\end{cases} f(n)=f(n1)+f(n2)f(n1)<2f(n2)<f(n) (1)3f(n2)>f(n) (2)4f(n2)<3f(n+1)(3)
(2)(2)(2) 得先手不能一次取超过 f(n−2)f(n-2)f(n2) 的石子。

那么基于更小情况的归纳假设可知 f(n−2)f(n-2)f(n2) 是必败局面。

所以后手可以控制其自己石子与之抗衡,使得后手拿走 f(n−2)f(n-2)f(n2) 的最后一个石子。

接下来只剩 f(n−1)f(n-1)f(n1) 个石子了。

基于 (2)(3)(2)(3)(2)(3) 可以知道先手仍然无法一次性拿完 f(n−1)f(n-1)f(n1)

由归纳假设可得也是后手取到 f(n−1)f(n-1)f(n1) 这堆石子的最后一颗。

所以先手是必败的。

非斐波那契数的情形,由 Zeckendorf定理,任何正整数可以表示为若干个不连续的斐波那契数之和。

nnn 不是斐波那契数时,n=f(a1)+f(a2)+...f(ap)(p≥1∧a1>a2>…>ap)n=f(a_1)+f(a_2)+...f(a_p)\quad (p\ge 1\wedge a_1>a_2>…>a_p)n=f(a1)+f(a2)+...f(ap)(p1a1>a2>>ap)

根据 (1)(1)(1) 先手总能直接拿掉最小的数 f(ap)f(a_p)f(ap)。后手就会陷入先手必败的情形中。所以先手必胜。

阶梯博弈

相当于奇数阶梯的 nim\text{nim}nim 堆的和。

在这里插入图片描述

将阶梯倒着排列成一行。发现两个棋子之间的空格数就是阶梯上的石子数。

最高阶只能将石子往下移,所以只能变少,对应地在一行的最左边,当最左边黄棋左移时对应石子下放的操作。

看奇数阶梯是因为,偶数段操作时,虽然短暂性地让后面一段变长,但是另一个人可以相应的操作后一段。而这个可操作距离也是有限的。

也就是说,如果 G=∗nG=*nG=n,虽然 GGG 也能到 ∗x(x>n)*x\ (x>n)x (x>n),但大于 nnn 的这种 xxx 的数量是有限的,后手总可以变回去。

green hackenbush

  • 链的情形:一条长度为 nnn 的链相当于一个大小为 nnnnim\text{nim}nim 堆。

  • 树的情形

    对连接点而言,就是将连接点的各个子游戏进行 nim\text{nim}nim 求和。

    由于子游戏都是 ∗a*aa 形式,所以求和出来的结果就是 nim\text{nim}nim 和。

    ∗:∗n=∗(n+1)*:*n=*(n+1):n=(n+1)

    在这里插入图片描述

  • 环的情况

    一个自环相当于一个叶子,任何环内的点都可以融合成一个点,且不会改变游戏的结果。

    所以奇环可以简化为一条边,偶环可以简化为一个点。

    在这里插入图片描述

    在这里插入图片描述

Misère Nim博弈

取走最后一个石子的人算输,其余规则与普通 nim博弈 完全一样。

先手必胜的条件:

  • 每堆石子数异或和为 000 且每堆石子只有 111 个。
  • 每堆石子数异或和不为 000 且至少有一堆石子的个数 >1>1>1

定性分析:

先手必胜的条件

  • 游戏和为 000 且单个游戏的 SGSGSG 函数 ≤1\le 11
  • 游戏和不为 000 且至少有一个单一游戏的 SGSGSG 函数 >1>1>1

定量分析:

GGG 是有限状态的 Misère 的公平博弈,G={∗a,∗b,∗c,...}G=\{*a, *b, *c, ...\}G={a,b,c,...}∗a,∗b,∗c*a, *b, *ca,b,c 这些游戏的规则也都是Misère 的),且存在一个 ∗x∈G(x<2)*x∈G(x<2)xG(x<2),那么 GGG 可以化简成 ∗n*nn,其中 n=mex(a,b,c,...)n=\text{mex}(a, b, c, ...)n=mex(a,b,c,...)

推论:若 GGG 可以写成 ∗n*nn 的形式,那么 G+∗G+*G+ 可以写成 ∗(n⊕1)*(n\oplus 1)(n1) 的形式。

普通的公平博弈:G=∗nG=*nG=n 表示的是 G+∗nG+*nG+n 的组合游戏中,后手必胜。

Misère 的公平博弈:定义函数 n=sg−(G)n=sg^-(G)n=sg(G),也表示 G+∗nG+*nG+n 的组合游戏中,后手必胜。

sg−(0)=1sg-(0)=1sg(0)=1

G={A,B,C,...},sg−(G)=mex(sg−(A),sg−(B),sg−(C),...)G=\{A, B, C, ...\},sg^-(G)=\text{mex}(sg^-(A), sg^-(B), sg^-(C), ...)G={A,B,C,...},sg(G)=mex(sg(A),sg(B),sg(C),...)

注意:由于博弈是公平的,所以有 G=−GG=-GG=G,但 Misère GameG=−GG=-GG=G 却推不出 G+G=0G+G=0G+G=0

{∗2}+{∗2}\{*2\}+\{*2\}{2}+{2} 是后手必胜。

要注意化简和组合游戏后手必胜的区别。

在普通公平游戏中,两者无区别,在 Misère Game 中,是有区别的。

后手必胜+后手必胜 或 先手必胜+先手必胜 可能是先手必胜也可能是后手必胜。

Every-SG

是一些游戏的组合。玩家对于每个可以操作的游戏都必须要操作,不能操作的人输。

由于每个可以操作的游戏都必须要操作,所以对于每个单个可以赢的游戏都尽可能赢。

但问题的关键是让能赢的游戏尽可能长的玩下去,并且不能赢的游戏尽快输掉。

因为整个游戏是看最后一个谁不能操作,而不是看谁的单一游戏胜利次数更多。

站在先手的角度考虑:先计算每个状态的输赢情况(或者 SGSGSG 值是否为 000 )然后计算步数。

  • G=0G=0G=0 的游戏 G={A,B,C,...}G=\{A, B, C, ...\}G={A,B,C,...},先手必败,所以想最快输掉,就计算 step(G)=min⁡{step(A),step(B),step(C),...}+1step(G)=\min\{step(A), step(B), step(C), ...\}+1step(G)=min{step(A),step(B),step(C),...}+1
  • G>0G>0G>0 的游戏 G={A,B,C,...}G=\{A, B, C, ...\}G={A,B,C,...},先手必胜,所以想拖时间,就计算 step(G)=max⁡{step(A),step(B),step(C),...}+1(A=B=C=...=0)step(G)=\max\{step(A), step(B), step(C), ...\}+1\quad(A=B=C=...=0)step(G)=max{step(A),step(B),step(C),...}+1(A=B=C=...=0)
  • 终止状态的 step=0step=0step=0

Every-SG游戏 中先手必胜当且仅当单个游戏中最大的 step\text{step}step 值为奇数。

nim积

超现实数的乘法定义:xy={xLy+xyL−xLyL,xRy+xyR−xRyR∣xLy+xyR−xLyR,xRy+xyL−xRyL}xy=\{x_Ly+xy_L-x_Ly_L,x_Ry+xy_R-x_Ry_R\ |\ x_Ly+xy_R-x_Ly_R,x_Ry+xy_L-x_Ry_L\}xy={xLy+xyLxLyL,xRy+xyRxRyR  xLy+xyRxLyR,xRy+xyLxRyL}

例如 x−xL>0,y−yL>0⇒(x−xL)(y−yL)=xy−xLy−xyL+xLyL>0⇒xy>xLy+xyL−xLyLx-x_L>0,y-y_L>0\Rightarrow (x-x_L)(y-y_L)=xy-x_Ly-xy_L+x_Ly_L>0\Rightarrow xy>x_Ly+xy_L-x_Ly_LxxL>0,yyL>0(xxL)(yyL)=xyxLyxyL+xLyL>0xy>xLy+xyLxLyL

同理可得其余式子。

仿照超现实数乘法的定义,可以形式化地写出 nimber 的乘法定义:

∗a×∗b={∗a’×∗b+∗a×∗b’+∗a’×∗b’}(a’<a,b’<b)*a×*b=\{*a’×*b+*a×*b’+*a’×*b’\}\ (a’<a, b’<b)a×b={a×b+a×b+a×b} (a<a,b<b)

【因为平等游戏没有 L,RL,RL,R 区分,所以超现实数的四个式子是一样的,且平等游戏中 +/−+/-+/ 是没有区别的。】

SG定理 得,∃n=a⊗b∗n=∗a×∗b\exist_{n=a\otimes b}\ *n=*a\times *bn=ab n=a×b。【⊗\otimes 含义是“nim积”】

关于 nnn 具体的计算,先打个小范围的表:

a\b0123456789101112131415
00000000000000000
10123456789101112131415
20231810119121415134675
30312121513144756811910
40481262141011153713951
50510152781336912141114
60611131485371121091524
70791410133415861521211
80812411371513519614102
90914715618512112103413
100101553912611114428137
110111367121019241514538
120124813195610214117153
13013619415214385710112
140147951121210413315186
150155101144112137831269

根据表,可以找到几个性质:

  • 0⊗x=00\otimes x=00x=0
  • 1⊗x=x1\otimes x=x1x=x
  • a⊗b=b⊗aa\otimes b=b\otimes aab=ba
  • (a⊗b)⊗c=a⊗(b⊗c)(a\otimes b)\otimes c=a\otimes (b\otimes c)(ab)c=a(bc)
  • nim积nim和 具有乘法分配律:a⊗(b⊕c)=a⊗b⊕a⊗ca\otimes (b\oplus c)=a\otimes b\oplus a\otimes ca(bc)=abac

另外还有一些常见性质:

n=22n(n≥0)n=2^{2^n}(n\ge 0)n=22n(n0),即 nnn 是一个 fermat powers of 2。【n=2,4,16...n=2,4,16...n=2,4,16...】 则有

  • x<nx<nx<n 时,有 n⊗x=n×xn\otimes x=n\times xnx=n×x
  • n⊗n=32nn\otimes n=\frac{3}{2}nnn=23n
  • a,b<na,b<na,b<n 时,有 a⊗b<na\otimes b<nab<n

因此,对于 a⊗ba\otimes bab 的计算,我们可以将 aaabbb 拆成一些 222 的次幂的 nim和,利用分配律转为计算 a′⊗b′a′\otimes b′ab,其中 a′a′ab′b′b 都是 222 的次幂。

然后再把 a′a′ab′b′b 拆成一些 fermat powers of 2nim\text{nim}nim 乘积利用结合律计算即可。

例如:8⊗4=2⊗4⊗4=2⊗6=2⊗(2⊕4)=2⊗2⊕2⊗4=3⊕8=118\otimes 4=2\otimes 4\otimes 4=2\otimes 6=2\otimes(2\oplus 4)=2\otimes 2\oplus 2\otimes 4=3\oplus 8=1184=244=26=2(24)=2224=38=11

定理:对于某个非负整数 nnn,以及 S={x∣x∈N,x<22n}S=\{x|x\in N,x<2^{2^n}\}S={xxN,x<22n}(S,⊗,⊕)(S,\otimes,\oplus)(S,,) 构成一个特征为 222 的域。

nnn 个单位元相加 =0=0=0,符合这样条件的域称为特征为 nnn 的域。

而我们比较熟悉的数域单位元是 111,无论多少个单位元 111 相加都不可能为 000,所以数域是特征为 000 的域。

一般强调特征为 222 的域就是说两个一样的数相加等于 000 的时候,不能直接认为这两个数等于 000

因为在特征为 222 的域上两个单位元相加也是 000

所以可以用类似 karatsuba 的方法来推导 nim积

a=a1⊗P⊕a2,b=b1⊗P⊕b2a=a_1\otimes P\oplus a_2,b=b_1\otimes P\oplus b_2a=a1Pa2,b=b1Pb2,其中 PPP 是一个 fermat powers of 2

a⊗b=a1⊗b1⊗P⊗P⊕a2⊗b2⊕(a1⊗b2⊕a2⊗b1)⊗Pa\otimes b=a_1\otimes b_1\otimes P\otimes P\oplus a_2\otimes b_2\oplus(a_1\otimes b_2\oplus a_2\otimes b_1)\otimes Pab=a1b1PPa2b2(a1b2a2b1)P

因为 a1,a2,b1,b2<Pa_1,a_2,b_1,b_2<Pa1,a2,b1,b2<P,所以 a1⊗b2⊕a2⊗b1<Pa_1\otimes b_2\oplus a_2\otimes b_1<Pa1b2a2b1<P

P⊗P=32PP\otimes P=\frac{3}{2}PPP=23P,拆成 12+1\frac{1}{2}+121+1

变为 a⊗b=a1⊗b1⊗(P2)⊕a2⊗b2⊕(a1⊗b1⊕a1⊗b2⊕a2⊗b1)×Pa\otimes b=a_1\otimes b_1\otimes (\frac{P}{2})\oplus a_2\otimes b_2\oplus(a_1\otimes b_1\oplus a_1\otimes b_2\oplus a_2\otimes b_1)\times Pab=a1b1(2P)a2b2(a1b1a1b2a2b1)×P

因为 a1⊗b2⊕a2⊗b1=(a1⊗a2)⊗(b1⊗b2)⊕a1⊗b1⊕a2⊗b2a_1\otimes b_2\oplus a_2\otimes b_1=(a_1\otimes a_2)\otimes(b_1\otimes b_2)\oplus a_1\otimes b_1\oplus a_2\otimes b_2a1b2a2b1=(a1a2)(b1b2)a1b1a2b2

所以 a⊗b=a1⊗b1⊗(P2)⊕a2⊗b2⊕((a1⊗a2)⊗(b1⊗b2)⊕a2⊗b2)×Pa\otimes b=a_1\otimes b_1\otimes (\frac{P}{2})\oplus a_2\otimes b_2\oplus\Big((a_1\otimes a_2)\otimes(b_1\otimes b_2)\oplus a_2\otimes b_2\Big)\times Pab=a1b1(2P)a2b2((a1a2)(b1b2)a2b2)×P

P2\frac{P}{2}2P 虽然不是一个 fermat powers of 2,但仍然是 222 的幂。

所以递归下去每次只需做 333 次折半乘法,只考虑这部分复杂度是 karatsuba 的复杂度,即 O((n2)log23)=O(nlog233)O((\frac n2)^{log_2^3})=O(\frac{n^{log_2^3}}{3})O((2n)log23)=O(3nlog23) 的。

所以 T(n)=3T(n2)+O(nlog233)=O(m∗3m)T(n)=3T(\frac{n}2)+O(\frac{n^{log_2^3}}{3})=O(m*3^m)T(n)=3T(2n)+O(3nlog23)=O(m3m),其中 m=log nm=\text{log}\ nm=log n

最简单的就是记忆化搜索,小范围存一个表。

稍微复杂一点的是,这个域存在原根,[0,65536)[0,65536)[0,65536) 的最小的原根是 258(224=65536)258(2^{2^4}=65536)258(224=65536)

所以可以打 [0,65536)[0,65536)[0,65536) 范围内的指数、对数表。

这样只用递归一次即可算出 nim积,约等于 O(1)O(1)O(1) 的复杂度。

∗a×∗b={∗a’×∗b+∗a×∗b’+∗a’×∗b’}(a’<a,b’<b)*a×*b=\{*a’×*b+*a×*b’+*a’×*b’\} (a’<a, b’<b)a×b={a×b+a×b+a×b}(a<a,b<b) 组合博弈的意义:

考虑一个二维的棋盘,有黑色棋子和白色棋子摆满了棋盘。

每次可以选一个黑色棋子,假设坐标是 (a,b)(a,b)(a,b),那么可以任选一个 (a’,b’)(a’,b’)(a,b),翻转 (a,b),(a’,b’),(a,b’),(a’,b)(a,b),(a’,b’),(a,b’),(a’,b)(a,b),(a,b),(a,b),(a,b) 这四枚棋子的颜色。

不能操作的人输。

如果只有一枚黑色棋子 (a,b)(a,b)(a,b),那么这个游戏的值就是 ∗a×∗b*a×*ba×b

如果有很多枚黑色棋子,就是每个棋子分别算 ∗ai×∗bi*a_i×*b_iai×bi 然后再 nim\text{nim}nim 加起来。

翻棋子游戏

nnn 枚棋子排成一排,有些棋子是黑色的,有些是白色的。

两个人轮流操作,每次操作将一些 限定的集合 中的棋子颜色反转。

但必须保证反转的棋子的集合中最右边的一枚一开始一定是黑色的。

显然翻棋子游戏是公平的无环的博弈,所以可以用 SG定理 定量算。

对于这一类游戏,有一个定理(不一定是一维的):

某一个局面的 SGSGSG 值,等于局面中每个黑色棋子单一存在时的局面的 SGSGSG 值的 nim\text{nim}nim 和。

我们可以考虑把翻转的操作当作加一个相同的 copycopycopy

因为在 nim\text{nim}nim 和的定义下两个相同数的 nim\text{nim}nim 和是0,可以发现这两种方式是等价的。

也就是说每个位置的 SGSGSG 值是独立的。

游戏的积,tartan定理

如果我们把两个一维的翻棋子游戏 AAABBB 结合到一起,表示所选的行应该遵从翻棋子游戏 AAA 中的规定,所选的列应该遵从翻棋子游戏 BBB 中的规定。

那么我们把这个游戏叫做一个 tartan game,用 A×BA×BA×B 表示。

形式化地讲,如果 A={A1,A2,A3,...},B={B1,B2,B3,...}A=\{A_1, A_2, A_3, ...\},B=\{B_1, B_2, B_3, ...\}A={A1,A2,A3,...},B={B1,B2,B3,...}

那么 A×B=(A,B’)+(A’,B)+(A’,B’)(A’∈A,B’∈B)A×B={(A,B’)+(A’,B)+(A’,B’)} (A’∈A, B’∈B)A×B=(A,B)+(A,B)+(A,B)(AA,BB)

对于 tartan game,有 tartan定理

A=∗a,B=∗bA=*a,B=*bA=a,B=b,那么存在一个 nnn,使得 A×B=∗nA×B=*nA×B=n,其中 n=a⊗bn=a\otimes bn=ab

tartan定理 对更高维的情况也适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel催化剂开源第31波-pdf相关功能实现及类库介绍

在Excel催化剂刚推出的pdf相关功能中&#xff0c;反馈很热烈&#xff0c;不止是用户层面好多人喜欢&#xff0c;也听到在.NET开发群里有询问pdf在winform上展现的功能诉求&#xff0c;一段时间没写开源篇&#xff0c;生怕大家以为Excel催化剂太小气了&#xff0c;不再开发了&am…

[小技巧]ASP.NET Core中如何预压缩静态文件

原文地址&#xff1a;Pre-compressed static files with ASP.NET Core作者&#xff1a;Gunnar Peipman译者&#xff1a;Lamond Lu译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10552131.html示例代码&#xff1a;https://github.com/lamondlu/CompressedStaticFileSample…

【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)

文章目录哈希链表插头DP概念括号表示法 / 最小表示法例题洛谷插头dp板题CITYParkIITonys TourEfficient Tree[CQOI2015]标识设计哈希链表 众所周知&#xff0c;哈希是有冲突的可能性的&#xff0c;而且在状态数越多&#xff0c;冲突的概率就越高。目前掌握的处理方案有多哈希&…

[NewLife.XCode]实体类详解

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

Counting Triangles

Counting Triangles 题意&#xff1a; 给你一个完全图&#xff0c;每个边被赋值为0或1&#xff0c;问这个完全图中有多少个完美三角形&#xff1f; 完美三角形定义&#xff1a;三角形的三边都为0或1 题解&#xff1a; 正着求不好求&#xff0c;我们可以倒着想 不考虑完美&a…

程序员过关斩将--论商品促销代码的优雅性

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;YY说你帮她解决了几个问题&#xff0c;也帮我解决一个呗原来是D妹子&#xff0c;来坐我身边&#xff0c;说下情况我的项目是个电商项目&#xff0c;现在产品狗要给商品做活动正常呀我一个新手初来咋到顶不住压力了&…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

在实际项目中使用LiteDB NoSQL数据库

LiteDB 是一个 NoSQL 数据库&#xff0c;特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL&#xff0c;官方有一下适用场景&#xff1a;移动App&#xff0c;桌面小应用程序&#xff0c;特有的文件格式&#xff0c;小型的 Web 应用&#xff0c;需…

初探奥尔良(Orleans)

由于工作上关系目前经常被各种并发数据问题搞得焦头烂额&#xff0c;要么要性能舍弃数据上得一致性&#xff0c;要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗&#xff1f;然后找到了类似奥尔良这种基于Actor模型的kuangjia首先本人因为是C#系的所以暂不…

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…

[NewLife.XCode]数据模型文件

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

[NewLife.XCode]高级增删改

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[NewLife.XCode]数据初始化

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[NewLife.XCode]反向工程(自动建表建库大杀器)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

树上启发式合并

文章内容选自OI Wiki 参考博客 内容&#xff1a; 树上启发式合并&#xff08;dsu on tree&#xff09;对于某些树上离线问题可以速度大于等于大部分算法且更易于理解和实现的算法。 他是用来解决一类树上询问问题&#xff0c;一般这种问题有两个特征&#xff1a; 只有对子树…

Wexflow:C#中的开源工作流引擎

Wexflow是一个高性能、可扩展、模块化和跨平台的工作流引擎。Wexflow在GitHub&#xff1a;https://github.com/aelassas/Wexflow。Wexflow的目标是在没有用户干预的情况下自动执行重复任务。在Wexflow的帮助下&#xff0c;构建自动化和工作流过程变得简单。Wexflow还有助于使长…

ASP.NET Core 沉思录 - Logging 的两种介入方法

ASP.NET Core 中依赖注入是一个很重要的环节。因为几乎所有的对象都是由它创建的&#xff08;相关文章请参见《ASP.NET Core 沉思录 - ServiceProvider 的二度出生》&#xff09;。因此整个日志记录的相关类型也被直接添加到了 IServiceCollection 中。今天我们将介绍各个接口/…

C# 中的Async 和 Await 的用法详解

众所周知C#提供Async和Await关键字来实现异步编程。在本文中&#xff0c;我们将共同探讨并介绍什么是Async 和 Await&#xff0c;以及如何在C#中使用Async 和 Await。同样本文的内容也大多是翻译的&#xff0c;只不过加上了自己的理解进行了相关知识点的补充&#xff0c;如果你…

Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务

本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构&#xff0c;部署的微服务主要包括统一网关&#xff08;使用Ocelot开发&#xff09;、统一认证&#xff08;IdentityServer4&#xff09;、应用服务&#xff08;asp.net core web api&#xff09;&#xff1b;本文不…