具体数学笔记-约瑟夫问题
据说著名犹太历史学家 $Josephus$有过以下的故事:
在罗马人占领乔塔帕特后,$39$ 个犹太人与$Josephus$及他的朋友躲到一个洞中,$39$个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,$41$个人排成一个圆圈,由第$1$个人开始报数,每报数到第$3$人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而$Josephus$ 和他的朋友并不想遵从。首先从一个人开始,越过$k-2$个人(因为第一个人已经被越过),并杀掉第$k$个人。
接着,再越过$k-1$个人,并杀掉第$k$个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?
$Josephus$要他的朋友先假装遵从,他将朋友与自己安排在第$16$个与第$31$个位置,于是逃过了这场死亡游戏。
现在考虑$k=2$时的问题,我们设$J(n)$表示当有$n$个人时幸存者的编号。
假设一开始有$2n$个人,那么一轮后会剩下$1,3,5,7...2n-1$,并且又是从1开始跳。
所以 $J(2n)=2J(n)-1$
奇数的情况差不多,会剩下$3,5,7,9....2n+1$
所以 $J(2n+1)=2J(n)+1$
用这个方法可以在$log_2n$的时间内求出$J(n)$
接下来我们可以打一个表
容易发现$J(2^m+l)=2l+1 \quad 0\leq l<2^m$
用数学归纳法很容易证。
至此这个问题已经解决,但我们还可以发现一些东西。
设$n$的二进制展开为
$$n=(b_mb_{m-1}...b_{1}b_{0})_2 \quad b_m=1$$
把$2l+1表示出来$
$$2l+1=(b_{m-1}...b_{1}b_{0}1)_2 $$
这就是$n$在二进制下向左循环移动了一位。
难道是碰巧吗?
考虑这个递推式的一般形式
$f(1)=a$
$f(2n)=2f(n)+b$
$f(2n+1)=2f(n)+c$
$a,b,c$显然是互不影响的,$f(n)$一定可以这样表示出来
$$f(n)=A(n)a+B(n)b+C(n)c$$
可以看出对于所有的$a,b,c$,$A,B,C$都是相同的
我们取$a=1,b=c=0$
$f(n)=A(n)$
$A(1)=1$
$A(2n)=2A(n)$
$A(2n+1)=2A(n)$
则 $A(2^m+l)=2^m$
接下来我们反过来使用递推式,确定$f(n)$,研究是否有$a,b,c$能表示它,取$f(n)=1$
解得$a,b,c=(1,-1,-1)----->A(n)-B(n)-C(n)=f(n)=1$
再取$f(n)=n$就可以解出$A,B,C$了。
我们把递推式改写一下
$f(1)=a$
$f(2n+j)=2f(n)+t_j \quad j=0,1$
则$f((b_mb_{m-1}...b_{1}b_{0})_2)=(at_{b_{m-1}}t_{b_{m-2}}...t_{b_1}t_{b_0})_2$(不进位)
在原问题中$a=1,t_0=-1,t_1=1$
$f((1100100)_2)=(1 \quad1 \quad-1\quad -1 \quad1 \quad-1 \quad-1)_2$
因为$(1 \quad -1 \quad... -1 \quad -1)_2=(00...01)_2$,就推出了循环移位的性质。
再延伸一步
$f(i)=a \quad 1\leq i<d$
$f(dn+j)=cf(n)+t_j \quad 0\leq j<d$
则$f((b_mb_{m-1}...b_{1}b_{0})_d)=(at_{b_{m-1}}t_{b_{m-2}}...t_{b_1}t_{b_0})_c$(不进位)
事实上这个递推式还可以再加参数,也都是可以用成套方法解的。