前言
「经过数学家的不懈努力」是 Nim 积相关题解不可避免的一环……吗?
本文旨在勾勒部分 Nim 积性质的证明,有了这些性质后数据结构优化是不难的,可以参考其它题解。
更具体的介绍可以参考
这篇文章(仍在更新中!)。
本文参考了《On Numbers And Games》的第六章。
对于不理解何为「序数」的读者,可以自行将文中所有「序数」换为「非负整数」。
如果你学过一定的抽象代数,你可以把文中的「对加法封闭」「对加法、乘法封闭」「对四则运算封闭」「所有多项式方程均有解」替换成「是群」「是环」「是域」「代数闭」。(因为异或意义下
α+α=0,一个数自然有相反数,因此可以不考虑减法)
在集合论中,冯诺依曼表示法的序数
α 就是集合
{β∣β<α},其中
β 是序数。本文不区分这两者。例如,当我们说到「
2 对四则运算封闭」的时候,也就是说「
{0,1}(在异或和 Nim 积意义下)对四则运算封闭。」
本文中,方括号
[] 中的运算为通常的序数运算,而其外部的运算为 Nim 运算。
引子
假如我们想在所有序数上定义一个加法和一个乘法,使得它们对四则运算封闭,并且它“字典序最小”(这个概念并不严格),应该怎么做?
先考虑加法吧。
0+0=0 显然不会有问题,因此
0 就是这个域上的零元。故而
0+α=α+0=α。
1+1=0 不会有问题,不就是特征【最小的
n 满足所有数加
n 遍等于
0】为
2 嘛。
1+2 是几?它不能等于
1+1=0,
1+0=1,
0+2=2,否则就和域有加法逆元(因此有消去律)矛盾了。因此
1+2=3。
这启发我们递归地定义
α+β=mex({α+δ∣δ<β}∪{γ+β∣γ<β})
据此列出表格
+012345678910111213141500123456789101112131415110325476981110131215142230167451011891415121333210765411109815141312445670123121314158910115547610321312151498111066745230114151213101189776543210151413121110988891011121314150123456799811101312151410325476101011891415121323016745111110981514131232107654121213141589101145670123131312151498111054761032141415121310118967452301151514131211109876543210
稍微验证一下发现它确实符合交换律、结合律……等等这不就是异或吗?怎么证明呢?
还是先来考虑一下乘法吧。首先
0α=α0=0,那
1×1 就不能是
0 了,那就
1 吧。好,
1 就是幺元了!那么
1α=α1=α。
2×2 等于多少?可以是
1 吗?这样的话
(2+1)×(2+1)=2×2+1×2+2×1+1×1=0,似乎不太对。可以是
2 吗?
1×2 已经是
2 了啊。那就
3?暂时看起来没什么问题。
等等我们发现了什么……
(x+y)2=x2+y2,因此两个数的平方不能相同!这个性质很优美诶。
因为
3=1+2,由分配律
3 相关的都做完了。
2×4 是多少?显然不能为
2×0=0,2×1=2,2×2=3,2×3=1。如果是
4+x(0≤x<4) 的话,那
2×4=4+x 得
(2+1)×4=x,
3×4<4 的话也不行(因为
3×0=0,3×1=3,3×2=1,3×3=2)。那么就最小是
2×4=8 了。
3×4=2×4+1×4=8+4=12。
那
4×4 是多少?根据之前的结果,它不能等于
02=0,12=1,22=3,32=3,1×4=4。能等于
5 吗?这意味着
4 是
x2+x+1=0 的根。可是这是
(x+2)(x+3)=0!而
(4+2)×(4+3) 不能为
0。因此
5 也不行。那就
6 吧。先看着……
好像导致
a×b=x 矛盾的点都是
(a+a′)(b+b′)=0?那就让这些全都不为
0 即可。这启发我们定义
αβ=mex{αδ+γβ+γδ∣γ<α,δ<β}
据此列出表格
×012345678910111213141500000000000000000101234567891011121314152023181011912141513467530312121513144756811910404812621410111537139515051015278133691214111460611131485371121091524707914101334158615212118081241137151351961410290914715618512112103413100101553912611114428137110111367121019241514538120124813195610214117153130136119415214385710112140147951121210413315186150155101144112137831269
稍微验证一下发现它确实符合交换律、分配律……而且似乎每
[22N] 以内对乘法封闭?而因为消去律一定有一个
β 满足
αβ=1,所以就对四则运算封闭了……?怎么证明呢。
加减乘除
定义 . 对于任意序数
α,β,我们递归定义它们的
异或(Nim 和)为
α+β=mex({α+δ∣δ<β}∪{γ+β∣γ<β})
定义 . 对于任意序数
α,β,我们递归定义它们的 Nim 积为
αβ=mex{αδ+γβ+γδ∣γ<α,δ<β}
我们记
α∗ 为一变量,它能取值所有
<α 的序数和部分
>α 的序数。(即,其取值范围的
mex 为
α)如果
α 的定义式/计算式为
mex(S),称
S 的所有元素为
α 的排除项。
定理 . 对于任意序数
α,β,γ,
α+β=α+γ 当且仅当
β=γ。
证明 . 充分性显然。必要性考虑反证。若
β=γ,不妨设
β<γ,则
α+β 为
α+γ 的一排除项,矛盾。
定理 .(加法的冗余定理)对于任意序数
α,β,
α+β=mex({α+β∗∣β∗}∪{α∗+β∣α∗})
证明 . 显然
α+β 的所有排除项都被排除了,而其它的元素排除项含有
α+β,故右侧取值为
(α+β)∗,即
mex 为
α+β。
定理 . 对于任意序数
α,β,γ,有
- α+0=α
- α+β=β+α
- (α+β)+γ=α+(β+γ)
- α+α=0
证明 . 直接归纳即可。注意第三条要用到冗余定理。
推论 . (多个数的加法计算式)在证明第三条的归纳过程中,我们可以用归纳类似地证明:对于任何
n 个序数
α1,α2,⋯,αn,有:
i=1∑nαi=mexi=1⋃n{j=1∑n{ααjj=ij=i∣α<αj}
定理 . 对于任意序数
α,有
α0=0α=0。
证明. α0 和
0α 均无排除项,即证。
定理 . 对于任意序数
α,β,γ,
αβ=αγ 当且仅当
β=γ 或
α=0。
证明. 充分性显然。必要性考虑反证。若
β=γ,不妨设
β<γ,而
0<α,故
αγ 的排除项有
αβ+0γ+0β=αβ,矛盾。
定理 .(乘法的冗余定理)对于任意序数
α,β,有
αβ=mex{αβ∗+α∗β+α∗β∗∣α∗,β∗}
证明 . 显然
αβ 的排除项都被排除了。因此我们只需证
αβ=αβ∗+α∗β+α∗β∗ 即可。根据异或的自逆,这等价于
αβ+αβ∗+α∗β+α∗β∗=0。显然,其它三者之和为最大的一者的排除项,即证。
定理 . 对于任意序数
α,β,γ,有
- α1=α
- αβ=βα
- (αβ)γ=α(βγ)
- α(β+γ)=αβ+αγ
证明 . 直接归纳即可。注意第三条和第四条要用到冗余定理。
推论 .(多个数的乘法计算式)在证明第三条的归纳过程中,我们可以用归纳类似地证明:对于任何
n 个序数
α1,α2,⋯,αn,有:
i=1∏nαi=mex{I⊊{1,2,⋯,n}∑j=1∏n{αjβjj∈Ij∈I∣βj<αj}
定义 . 对于任意序数
α>0,定义
S={0}∪{γ−1(1+(α+γ)δ)∣0<γ<α,δ∈S}
则定义
α−1=mex(S)。对于任意序数
α,β,定义
α/β=βα=αβ−1。
(注:这个
S 是一个递归的定义,即
S 包含了上述操作在有限步以内能生成的所有数。)
定理 .
- 对于任何序数 α>0,设 β 为 α−1 的一排除项,则 αβ=1。
- 对于任何序数 α>0,设 β 为 αα−1 的一(冗余)排除项,β=1。
- 对于任何序数 α>0,αα−1=1。
证明 . 考虑归纳。
- 若 β=0 显然,否则设 β=γ−1(1+(α+γ)δ)。则 1+αβ=γγ−1+αβ=γ−1(α+γ+α(α+γ)δ)=γ−1(α+γ)(1+αδ)。显然 γ−1=0,又因 γ<α 有 α+γ 不为 0,根据归纳假设又有,1+αδ 不为 0,故乘积不为 0,即证。
- 设 β=γα−1+α(α−1)∗+γ(α−1)∗,其中 (α−1)∗ 为 α−1 的一排除项。若 γ 等于 0,这就是前一条所证的。否则因为 λ=γ−1(1+(α+γ)(α−1)∗) 也为 α−1 的一排除项,又因为 γγ−1=1,故 β=1+γ(α−1+λ)=1。
- 显然 αα−1=0,因为 α−1=0。而由 2 得 αα−1 的排除项不含 1,即证。
扩张,扩张,扩张
定理 . 设
Δ 不对加法封闭,则
Δ=α+β,其中
(α,β) 为字典序最小的一对
Δ 的元素满足
α+β 不在
Δ 中。
证明 . 显然
α+β≥Δ,但是
α+β 的排除项都在
Δ 中。(这是因为字典序更小了)即证。
定理 . 设
Δ 对加法封闭,则对于任意
α 和
β∈Δ 有
[Δα]+β=[Δα+β]。
(例.
4={0,1,2,3} 对加法封闭,故
8+3=[4×2]+3=[4×2+3]=11。)
证明 . 考虑归纳。左侧的排除项为:
- [Δα′+γ]+β,其中 α′<α,γ<Δ。这是因为带余除法。
- [Δα]+δ,其中 δ<β。
根据归纳假设,左侧即为
[Δα′]+(β+γ)。而由于
Δ 形成一个群,
β+γ 恰好能取遍所有的
γ′<Δ!故根据归纳假设,所有的排除项为
[Δα′+γ′] 和
[Δα+δ],这恰为所有小于
[Δα+β] 的数,即证。
定理 . 设
Δ 对加法封闭但不对乘法封闭,则
Δ=αβ,其中
(α,β) 为字典序最小的一对
Δ 的元素满足
αβ 不在
Δ 中。
(例.
8 对加法封闭但不对乘法封闭,字典序最小的
(α,β)=(2,4),故
8=2×4。)
证明 . 显然
αβ≥Δ,但是
αβ 的排除项都在
Δ 中。(这是因为字典序更小了,且加法封闭)即证。
定理 . 设
Δ 对加法和乘法封闭,对加法封闭的
Γ≤Δ 满足
Γ 中的非零元都在
Δ 中有乘法逆元(即与其乘积为
1 的元素),则对于任意
γ∈Γ,有
Δγ=[Δγ]。
(例.
4={0,1,2,3} 对加法和乘法封闭,且
4≤4 中的所有非零元都在
4 中有逆,故
3×4=[3×4]=12。)
证明 . 考虑归纳。
Δγ 的排除项为
Δα+βα+βγ,β<Δ,α<γ。只需证对于任何
α<γ,有
Δα+β(α+γ) 能取遍所有
[Δα+δ]=[Δα]+δ=Δα+δ。取
β=δ(α+γ)−1 即可。
定理 . 设
Δ 为对四则运算封闭但有些多项式方程无解,设
p(x) 为系数在
Δ 中,在
Δ 中没有根的字典序最小的多项式(从高次项到低次项依次比较)。则
p(Δ)=0。对于任何次数比
p 小的多项式
p′(x),有
p′(Δ)=[p′(Δ)]。
(注意序数乘法可能没有交换律,若
p(x)=∑αixi,这里
[p′(Δ)]=∑Δiαi,
i 从大到小加。)
(例。
4={0,1,2,3} 对四则运算封闭,但是有无根多项式
x2+x+2=0,故
42=4+2=6。)
(注:你问对加、乘封闭但没法做除法的情况去哪里了?事实上有,但是书中的证明有一定问题,而且我们用不到,就咕了。)
证明 . 设
p 的次数为
n。对于任何一个
N,考虑
ΔN 的排除项为:
i=1∏Nαi=mex{i=0∑N−1I⊊{1,2,⋯,N},∣I∣=i∑Δij∈I∏βj∣βj<αj}
先归纳地证明若
N<n 则
N 次多项式
p′(x) 有
p′(Δ)=[p′(Δ)]。
- 先考虑 ΔN。只需证明它的排除项能取遍所有 i=0∑N−1Δiγi=[i=0∑N−1Δiγi] 即可。考虑多项式 q(x)=xN+i=0∑N−1xiγi。因为 <n 次多项式均有根,它一定可以因式分解为一次因式。设其根为 δ1,δ2,⋯,δn,重根算多次。根据 Vieta 定理,βj=δj 即为所求。
- 再考虑 ΔNδ,其中 δ∈Δ。它的排除项为 {ΔNγ+q(Δ)(γ+δ)∣γ<δ,degq<N,[xi]q(x)∈Δ}。只需证明对于任何 γ,q(Δ)(γ+δ) 能取遍每个 q′(Δ) 即可。因为 γ+δ∈Δ,故其有逆元,而根据归纳假设,次数更小的多项式乘 Δ 的元素正常乘即可,故取 q(x)=q′(x)(γ+δ)−1 即可。
- 再考虑 p′(Δ),degp′=N。根据归纳假设,次数更小的多项式加法是正常算的,故 ΔN 为一个群。因此设 p′(x)=xNδ+q′(x),则 p′(Δ)=ΔNδ+q′(Δ)=[ΔNδ]+[q′(Δ)]=[ΔNδ+q′(Δ)]=[p′(Δ)]。
再证
p(Δ)=0。设
p(x)=xn+q(x)(显然,若最高次项系数不为
1,则系数均乘以其逆元字典序更小)。考虑
Δn。和以上过程类似,比
q(Δ) 小(等价于字典序小)的均为
Δn 的排除项。但
q(Δ) 不是,否则根据 Vieta 定理
p 就在
Δ 内有根了。因此
Δn=q(Δ),即
p(Δ)=0。
定理 . 设
Δ 对四则运算封闭,且所有多项式方程均有根。则对于任意多项式
p(x) 有
p(Δ)=[p(Δ)]。
证明 . 和上述定理类似。
推论 . 设
Δ 对四则运算封闭,
Δ 不是任何
Δ 上多项式方程的根。
加法
定理 . 若
Δ 对加法封闭,则下一个对加法封闭的序数为
[Δ2]。
证明 . 显然
{x∣x<Δ} 和
{Δ+x∣x<Δ} 两两不同,所以至少要包含它们。所以
<[Δ2] 的不对加法封闭。而因为
[Δ+x]=Δ+x,所以
[Δ2] 对加法封闭。
定理 . 每个序数
α 都可以写成
[2β0+2β1+⋯+2βn−1],其中
n 有限,
β 严格递减。且
α=[2β0]+[2β1]+⋯+[2βn−1]。
(例如,
6=[22+21]=[22]+[21]=4+2。)
(注:这也就说明了加法就是异或。)
证明 . 设
α>0,则取最大的
2β≤α,设
α=[2β+γ],显然
γ<2β,故
α=[2β]+γ。归纳即可。
扩张(试试看!)
来试着通过扩张的几个定理来扩张,得到一些对四则运算封闭的序数吧!
首先最小的非平凡的肯定是
2={0,1}。我们知道,接下来需要找到一个无解方程。显然一次方程就是除法,不可能无解。二次方程呢?对于有限的对四则运算封闭的
n,如果有一个无解的二次方程,那下一个就是对四则运算封闭的
[n2]={[an+b]∣a<n,b<n}={an+b∣a<n,b<n} 了。(记
n 为
Fn,这其实就是
Fn[x]/p(x),其中
p(x) 为字典序最小的无根多项式)
定理 . 对于有限的
n,若
n 对四则运算封闭,则对任意
a<n,存在
b<n,
b2=a。
证明 . 显然
c→c2(c<n) 为单射,故为满射。
所以不需要考虑
x2 型的了。那
x2+x 呢?
定理 . 对于有限的
n>1,若
n 对四则运算封闭,恰有半数
a<n,满足不存在
b<n,
b2+b=a。
证明 . 显然
c2+c=d2+d 当且仅当
(c+d)(c+d+1)=0,即
c=d 或
c=d+1,故恰有一半的
c2+c 能被取到。
因此有限情况的扩张都是
x2+x+a,于是我们做完了……?等等扩张完还是封闭的吗?显然加、乘是封闭呢。除呢?(其实有更一般的关于扩张的证明,但是这里不必要)
定理 . 对于有限的
n,若
n 对加法、乘法封闭,则
n 对四则运算封闭。
证明 . 设
c=0,则
x→cx(x<n) 为单射,故为满射,故存在
cx=1。
好,于是我们有:
定理 . 所有有限的对四则运算封闭的序数为:
2,4,16,⋯,[22n],⋯
其中每一个是上一个的[平方]。
证明 . 刚才所讨论的就是这个。
推论 . 若
k<[22n],则
22nk=[22nk]。
等等,知道是域有什么用,到底怎么算啊?
2→4 的过程中,最小的无解方程为
x2+x+1,故
22=2+1=3。
4→16 的过程中,最小的无解方程为
x2+x+2,故
42=4+2=6。在
16→256 的过程中呢?对于每个
x<16 计算
x2+x,发现恰好是
0∼7 各一个……?因此
162=16+8=24。
更一般地,我们考虑证明:
定理 .
- 对于任何非负整数 n,若 x<[2n],则 x2<[2n]。
- 对于任何正整数 x,x 与 x2 的最高位相同。换言之,若 x<[2n+1],则 x2+x<[2n]。
- 对于任何非负整数 n,{x2+x∣x<[22n]}=[22n−1]
- 对于任何非负整数 n,[22n]2=[23×22n]。
证明 . 以下归纳不会出现循环论证交给读者作为练习。
- 因为 (x+y)2=x2+y2,且 [2n] 是一个群,因此只需证明 x=[2k] 的情况 x2<[2k+1] 即可。设 k=∑[2ai],则 x=∏[22ai]。(因为 [22ai] 对四则运算封闭,所以乘法和直接乘没区别)因此 x2=∏[22ai]2。依归纳假设,这即为 x2=∏[22ai]+[22ai−1]。按照乘法分配律展开后,每一项的[普通]积都不超过 [2k],因此 Nim 积也不超过 [2k](因为 Nim 积的排除项个数为普通积),即小于 [2k+1],故和小于 [2k+1]。
- 根据 1.,有 y→y2 是 [2n] 到 [2n] 的双射,同时也是 [2n+1] 到 [2n+1] 的双射,因此是 [2n+1]\[2n] 到自身的双射,即证。自然推出后半句。
- 之前证明过前者的大小刚好为 [22n−1],而取值范围也在 [22n−1] 内,即证。
- 根据 3.,最小需要扩展的多项式为 p(x)=x2+x+[22n−1],即 [22n]2=[22n]+[22n−1]=[22n+22n−1]=[23×22n]。
计算
那么问题来了,我们怎么对 Nim 数进行计算呢?
定理 . 假设位运算的时间复杂度为
O(1),则存在
O(1) 的算法,给定
a,b<[22k],计算
a+b。
证明 . 之前证明了
a+b 是异或,调用即可。
定理 . 假设位运算的时间复杂度为
O(1),则存在
O(3k) 的算法,给定
k,a<[22k],计算
a[22k−1]。
证明 . k=0 时可以
O(1) 计算。若
k≥1,设
α=[22k−1],B=[22k−1],β=[22k−1−1],则
α=Bβ。设
a=[Bp+q]=Bp+q,则
aα=aBβ=βB(Bp+q)=B2βp+Bβq=βp(B+β)+βqB=(p+q)βB+pββ。递归计算
L=(p+q)β,R0=pβ,R=R0β,则答案为
LB+R=[LB+R]。时间复杂度
T(k)=3T(k−1)+O(1)=O(3k)。
定理 . 假设位运算的时间复杂度为
O(1),则存在
O(k3k) 的算法,给定
a,b<[22k],计算
ab。
证明 . k=0 时可以
O(1) 计算。若
k≥1,设
B=[22k−1],β=[22k−1−1]。设
a=pB+q,b=rB+s,则
ab=(pB+q)(rB+s)=prB2+(ps+qr)B+qs=pr(B+β)+(ps+qr)B+qs=(pr+ps+qr)B+prβ+qs。递归计算
L0=(p+q)(s+r),L1=qs,L=L0+L1,R0=pr,R1=R0β,R=R1+L1,则答案为
LB+R=[LB+R]。时间复杂度
T(k)=3T(k−1)+O(3k)=O(k3k)。
关于本题
我们还需要证明一个性质:
定理 . 对于对四则运算封闭的
n=[22k],任意
x<n 有
xn=x。
证明 . x=0 时显然。否则
y→xy 是
n 到本身的双射,且
0 映射到
0。因此
y=1∏[n−1]y=y=1∏[n−1]xy,两边消去
y=1∏[n−1]y 可得
x[n−1]=1,即
xn=x。
以上。