03 THE JOSEPHUS PROBLEM

约瑟夫之所以能够活下来是因为他靠着智慧解决了生死有关的问题,故这个问题也用他的名字命名。
故事是说约瑟夫和他的朋友被俘虏,和其他俘虏一起围成一个圈,每隔两个人杀死一个人,最后剩下两个人为止。约瑟夫迅速算出了最后的活下来的两个位置,逃过一劫。

这里要研究的问题稍有变化。从围成标号1到个人开始,每隔一个删除一个,直到剩下来一个为止。例如的其实状况如下:

消去的顺序是2,4,6,8,10,3,7,1,9,于是5幸存下来。问题是如何确定幸存者的号码
我们可能会猜测如果是偶数,那么是支持这个猜测的,但是稍微多看几个情况,就不是这样了。比如的情况
| | 1 | 2 | 3 | 4 | 5 | 6 | |--|--|--|--|--|--|--| | | 1 | 1 | 3 | 1 | 3 | 5 |

看起来,至少是奇数。这个是明显的,第一圈就会把所有的偶数都排除出去。如果是偶数,那么第一圈结束之后,除了人数减半编号发生了变化之外,我们得到一个和一开始类似的情况。
所以我们假设一开始有个人,那么一轮之后留下的情况如下图:

3号是下一个要离开的人。现在和个人的初始情况相比,每个人的号码是时进行了加倍减一的操作,所以 利用这个我们可以快速增加的值。比如知道,那么 类似的有,以此类推可以得到

对于奇数情况,结果如何呢?假设有个人,标号为1的人会在删除之后被删除,所以删除个之后剩余的个标号如下:

这个和的情况类似,每个人的标号是加倍且加一,那么 这些结果和初始情况组合起来,得到 这个递归式不是由得到,而是每次加倍或者更多(多一个罢了),非常有效。比如只需要19次就能计算得到。我们还是要求一个封闭形式,一是更高效,二是有更多信息。

有了递归式,我们可以写出前一些项,找规律,猜测答案。
| | 1 | 2 3 | 4 5 6 7 | 8 9 10 11 12 13 14 15 | 16 | |--|--|--|--|--|--| | | 1 | 1 3 | 1 3 5 7 | 1 3 5 7 9 11 13 15 | 1 |

规律很明显。按照2的幂次分组,然后每组都是从1开始的奇数。将表示为的形式,其中是不超过的2的最大次幂,是剩余的数。那么递归的解看起来是 下面用归纳法来证明这个式子。这里对进行递归。时,那么,那么基础就是,成立。归纳分成两个部分即是奇数还是偶数。如果,那么是偶数,根据和归纳假设有 是奇数,即,那么 证明完成。从蕴涵着关系 举个例子说明如何使用公式,比如要求,所以

问题解决了。现在我们来推广结论或者是中间的关键结果,使得可以应用于更广泛的问题。这是非常有启发意义的事情。下面会讨论解和递归式的推广。这些探讨会揭示这类问题背后的结构。

求解过程中,2的幂次发挥了重要的作用,那么现在研究下的二进制表示。假设的二进制写法是 其中是0或者1,第一个数字必须是1。因为,那么 所以 计算中,向左循环一位就从得到了。比如,,那么
如果我们从开始,进行运算,二进制循环了次,由于的二进制数是位,那么会回到吗?不会。比如,那么,再进行一次那么。当0是首位的时候,会消失一位二进制。本质上,由于必有,如果那么迭代下去也无法回到了。
重复运算会得到一系列递减值,直到,这是不动点。通过循环移位可以看出来,不动点的时的是全1组成的,值是,其中的二进制表示中1的个数。由于,那么 其中需要2个或者更多的
类似的有 这里需要8个或者更多的

回到最初的猜测,这个在一般情况下明显是不成立的,但是在什么情况下成立呢? 如果是整数,那么对应的就是一个解。是奇数的时候,是3的倍数。书中说了句不难验证,代入几个奇数很容易验证都是3的倍数。下面给出一个证明。令,那么 是偶数则不然(第四章会讨论)。那么方程的解有无限多,下面表格是其中的一些: | | | | | | |--:|--:|--:|--:|--:| | 1 | 0 | 2 | 1 | 10 | | 3 | 2 | 10 | 5 | 1010 | | 5 | 10 | 42 | 21 | 101010 | | 7 | 42 | 170 | 85 | 10101010 |

最右边的二进制数,左循环一位的结果和计算机中的右移一位是一样的。

现在我们推广递归式,引入常量得到下面更加一般的递归式 我们现在来求解封闭形式。一开始的问题其实就是。还是从非常小的问题开始研究: 通过观察,的系数是不超过的2的最大幂,在2的幂次之间,依次递减,从0开始依次递增。把的依赖关系写出来如下: 从前面的观察可以猜测 用归纳法可以证明上面的解,但是繁琐又没有提供其他有用信息。下面是一个很赞的方法,通过选取特殊的值,把它们组合起来。首先考虑这一特殊情况来对这个方法进行说明。此时,那么递归式就变成了 很容易用数学归纳法证明
其实如果将代入其他特殊值,比如,这样可以容易的证明猜测是正确的,但是不是一个通用的求解递归式的方法。书中描述的是求解方法。
下面,从简单的函数出发,看有没有任何常数能定义对应函数。从最简单的常值函数代入递归式得到 那么,进而
类似的,代入 那么,进而
现在我们有了以下信息: 很容易求解出 进而 至此,证明了前面的猜测是对的。

上述的做法是一整套求解递归式是的方法。首先寻求一组已知解的通用参数,这是求解的特殊形式,然后将特殊形式组合起来得到一般形式。一般地,有多少个独立参数()需要多少独立的特解。

前面给出了一个神奇的解: 推广的约瑟夫递归是否也有这样神奇的解呢?
如果零,那么可以改写成 那么递归式的二进制展开是 我们现在放开二进制的限制,允许任意数字,而不仅仅是0和1。那么上面展开过程告诉我们 重写 这样就是符合新找到的规律的。
比如当时,原约瑟夫问题有,那么

关于这个表格,提醒下:,而二进制表示的各个数字就是下标。
由于的二进制每一个数字都有 这就推出了循环移位这个性质。
改变了表示方式,我们从推得。如果真的不加以限制,进一步推广得到递推式 和之前的递归式类似,这里的要研究的数是基数为,产生的值基数是。所以解是 举个例子 根据之前的定义,
比如我们要求,由于,分别替换为,所以