340 likes | 570 Views
北京航空航天大学计算机学院. 具体数学 Concrete Mathematics. 赵启阳 2014年10月7日星期二. 1.3 约瑟夫环问题 Josephus Circle. 1.3 Josephus 问题. 最后的例子是一个古老问题的变型,它是以公元一世纪著名历史学家 Flavius Josephs 命名的。传说是 Josephus 的数学才干让他逃过一劫。 在犹太人和罗马人战争期间, Josephs 等 41 个犹太反抗者陷入包围。他们宁死不做俘虏,决定围成一个圆圈,每次由剩下的人中的第三个自杀,直到所有人都死去为止。
E N D
北京航空航天大学计算机学院 具体数学Concrete Mathematics 赵启阳 2014年10月7日星期二
1.3 Josephus问题 • 最后的例子是一个古老问题的变型,它是以公元一世纪著名历史学家Flavius Josephs命名的。传说是Josephus的数学才干让他逃过一劫。 • 在犹太人和罗马人战争期间,Josephs等41个犹太反抗者陷入包围。他们宁死不做俘虏,决定围成一个圆圈,每次由剩下的人中的第三个自杀,直到所有人都死去为止。 • Josephus和他的1个朋友认为,自杀是愚蠢的。因此他很快地算出死亡之圈中他俩应该站的位置(当然,是两个应该最后自杀的位置,没有人监督他们是否自杀,所以……)
Josephus问题 • 我们的问题是,从编号为1到n的围成一圈的人开始,依次排除剩下的人中的第2个(注意:是从当前“指针”开始),直到仅剩1个幸存者。下面是n = 10的情况: • 排除次序是2,4,6,8,10,3,7,1,9。因此5幸存。 • 问题目标是:如何确定幸存者的号码J (n)?
Josephus问题 • 首先提出猜想:根据刚才的J(10) = 5,猜想当n是偶数时J(n) = n / 2。n = 2时猜想成立:J(2) = 1。但是对n = 4和n = 6的情况,猜想失败。 • 从上面的表看来,J(n)都是奇数,因此将其作为新的猜想:事实上第1轮筛选就排除了所有的偶数,因此猜想成立。
Josephus问题 • 另外还观察到,若n是偶数,那么在做完第1轮筛选之后,剩下的情形和最初的开始情况是非常类似的,但是人数要少一半,而且编号也有所不同。 • 假设原先有2n个人,在第1轮筛选之后,剩下的情况是 • 此时圆圈剩下了n个人:1、3、5、7、……、2n – 3、2n – 1。而且“指针”又回到了1的位置。这与最初有n个人的情形是相同的,区别仅在于编号有变化。
Josephus问题 • 编号的变化会带来什么影响? • 从编号1开始,下1个被排除的人是3,其后的筛选过程与n个人的情形一致: 当前的情形:2、4、6、8、……(差为2的等差数列) n个人的情形: 3、7、11、15(差为4的等差数列) 相同点:人数相同 不同点:编号变为2倍减1 • 注意到,幸存者J(2n)必然从当前剩下的人中出现,因此: J(2n) = 2J(n) – 1
Josephus问题 • 最初人数为奇数的情况如何? • 对于2n + 1个人,我们同样先做第1轮筛选:2、4、6、8、……、2n – 2、2n(注意此时“指针”指在2n + 1上)。接下来被排除的人是1,此后剩下的情况是 • 目前还剩n个人,但是编号变成2倍加1(前面是2倍减1)。同样地,我们得到 J(2n + 1) = 2J(n) + 1
Josephus问题 • 到目前为止,我们得到了两个“递归”色彩的式子: J(2n) = 2J(n) - 1 J(2n + 1) = 2J(n) + 1 • 上面涵盖了所有“偶数”和“奇数” ,即所有正整数,但还缺少boundary value,作为“递归系统”的第一推动力。 • 很简单,J(1) = 1(最后剩下1个人,不必再筛选)。这样就得到了完整的J的递归方程。
Josephus问题 这个递归方程的效率非常高,因为每次将n缩小至少1/2。例如,我们用19次就能计算出J(1000000): • 1000000 -> 500000 ------->250000 ------> 125000 -------> 62500 • 31250 ----> 15625 ---------> 7812 ----------> 3906 • 1953 ------> 976 ------------> 488 ------------> 244 • 122 --------> 61 -------------> 30 --------------> 15 • 7 -----------> 3 ---------------> 1 最终结果:951425 但是无论从数学的完美意义,还是实际的计算效率上来考虑,最好找到闭形式解。
Josephus问题 • 我们仍然使用“猜想证明”思路来求解封闭形式解。首先根据递归方程,对较小的n建立J(n)表: • 可以发现什么规律? 1、每隔若干个位置就从1开始 2、每次从1开始的子序列都是级差为2的等差数列 3、每个子序列的长度是递增的 Question:怎样用数量表达上面的观察结果?
Josephus问题 • 继续观察,可以看到: 1、第1子序列长度为1,此后长度为2、4、8、…… (谨慎怀疑子序列长度构成比值为2的等比数列!!) 2、如果上述怀疑成立,那么我们只要知道当前n处于第几个子序列的第几个位置,就能够从1逐渐累加得到J(n)了!!!
Josephus问题 • 继续找n和J(n)的数量关系: • 假设n之前已经有m个子序列,而n是第(m+1)个子序列的第l个位置,那么显然有 J(n) = 1 + 2(l - 1) • n与m、l之间有什么关系呢? • n之前的整数数量为(1 + 2 + 4 + …… + 2m-1) + (l - 1),因此有 n = (2m – 1) + l = 2m + (l – 1)
Josephus问题 • 从m和l出发,我们向两头(n和J(n))寻找数量关系,得到 J(n) = 1 + 2(l – 1) 和 n = (2m – 1) + l = 2m + (l - 1) • 为了得到封闭形式解,我们需要先从n求出m和l,然后才能得到J(n): • 显然,2m是不超过n的、2的最大幂,而l = n – 2m。所以我们得到了J(n)的封闭形式解的猜测结果: J(2m+l) = 2l + 1
Josephus问题 • 猜想已经完成,结论尚待证明……(纪念辛亥革命) • 证明仍然采用归纳法:猜想是用m表达的,因此对m归纳。 • 归纳基础:当m = 0时,我们有l = 0,显然J (1) = 1成立。 • 归纳演绎:根据递归关系式的奇偶之别,归纳演绎也分成奇偶两种情形。如果m > 0而且2m+ l = 2n,那么l为偶数,因此有: J(2m + l) = 2J(2m-1 + l/2) – 1 = 2(2l/2 + l) – 1 = 2l + 1 猜想成立!!! 类似可以证明奇数情形。因此猜想成立。 • 还可以注意到,这个式子能够导出 J(2n + 1) – J(2n) = 2 符合等差数列!!!
Josephus问题 对一般的人来说…… 前面的计算和分析已经够好了…… 但是, CM三人行还带来了真正让我们惊讶的部分…… 一个talented part…… 让我们看看,他们talent在何处……
Josephus问题 • 在求解过程中,2的幂起到了重要作用(我们也能看到)。所以接下来看看n和J (n)的二进制表示(不管你能不能想到,反正我是没想到)。 • 假设n的二进制展开为 n = (bmbm-1…b1b0)2 其中每个bi等于0或1,而其中的第1位bm肯定是1(为什么?)。 • 联想到前面推导中出现的n = 2m + l,我们可以得到: n = (1bm-1…b1b0)2 ,l = (0bm-1…b1b0)2 ,然后 2l = (bm-1bm-2…b00)2 ,2l + 1 = (bm-1bm-2…b01)2 ,所以 J(n) = 2l + 1 = (bm-1bm-2…b1b01)2 = (bm-1bm-2…b0bm)2
Josephus问题 • 也就是说 J(bmbm-1bm-2…b1b0)2 = (bm-1bm-2…b0bm)2 • 能看出来什么?对n循环左移1位就得到了J (n),talented part!二进制下的封闭形式解只需要循环左移1个操作! • 例如,对n = 100 = (1100100)2,J(n)=J((1100100)2)= (1001001)2 = 73。 • 我们请一位同学来计算一下n = 2012的情形。
Josephus问题 • 如果对n连续求解m + 1次J函数,那么就是做了m + 1次的循环左移操作。因为n是(m+1)位的数,那么能不能再“循环地”重新得到n呢? • 看看n = 13的情形: • 首先J((1101)2)=(1011)2,然后J((1011)2)=(111)2,显然,此后(111)2一直保持不变…… • 总结一下,当n的最右端的0左移消失之后,将有J(n) = n。此时n的二进制表达全部为1。 • 事实上,由于J(n)总是小于等于n的,因此不能通过连续重复而重新得到n。
Josephus问题 • 好,让我们再看看添加什么条件能使最初的猜测成立: 当n为偶数时,满足J(n)=n/2 • 假设n = 2m + l,那么我们由J(n) = n / 2,可以得到2l + 1 = (2m + l) / 2,因此有:l = (2m - 2) / 3。如果l = (2m - 2) / 3是整数,那么n = 2m + l就是解,因为l小于2m。 • 可以验证,当m是奇数时,2m - 2是3的倍数,而当m为偶数时则不是。因此方程J(n)=n/2有无限多个解: n = 2m + (2m - 2) / 3 = (2m+2 – 2) / 3 (m为奇数) • 较小的解为
Josephus问题的推广 • 前面在二进制的帮助下解决了J函数,为什么级差为2?而不是3、4呢?OK,推广一下,看能否消除“2”的特殊性。 • 直接从递归关系式开始,换成不同的常数系数,会怎样呢? • 由 J(1) = 1 J(2n) = 2J(n) - 1 J(2n + 1) = 2J(n) + 1 • 换成 f(1) = α f(2n) = 2f(n) + β f(2n + 1) = 2f(n) + γ
Josephus问题的推广 • 从f(1) = α开始,并根据上面的方程逐步地推导,可以构造出较小n值上的函数值表:
Josephus问题的推广 • 我们可以看到什么结果?在n = 2m + l的情形下: 1、α的系数是不大于n的最大的2的幂2m; 2、β和γ的系数都不大于2m ; 3、β的系数每次由2m -1递减直到0; 4、γ的系数每次递增直到2m - 1。 • 因此,f(n)可以表示成 f(n) = A(n) α + B(n) β + C(n) γ • 这里有 A(n) = 2m B(n) = 2m – l – 1 C(n) = l
Josephus问题的推广 • 通过归纳法可以证明上面的式子,但是计算过程比较繁杂。我们尝试一种非常轻巧的方法,从某些特例入手: • 首先,考虑α = 1,β = γ = 0的特殊情况,此时f(n)的值与A(n)相等,递归方程变成: A(1) = 1 A(2n) = 2A(n) A(2n + 1) = 2A(n) = A(2n) • 对上面的递归方程,我们很容易地得到: A(2m + l) = 2m
Josephus问题的推广 • 反过来考虑。如果知道函数f(n)的封闭形式解,对应的常数组合(α, β, γ)是什么? • 例如对于常数函数f (n) = 1有: 1 = α,1 = 2l + β,1 = 2l + γ 。 • 因此(α, β, γ) = (1, –1, –1)。此时f (n) = A(n)- B(n)- C(n) = 1。 • 再看函数f (n) = n: 1 = α,2n = 2n + β,2n + 1 = 2n + γ • 因此(α, β, γ) = (1, 0, 1) 。特别是,我们不需要用归纳法证明即可知道f(n)的唯一解是f(n) = n。
Josephus问题的推广 • 回到我们在前面的问题:证明 A(n) = 2m B(n) = 2m – l – 1 C(n) = l • 现在我们已经知道函数A (n),B (n)和C(n)满足: 1、从(α, β, γ) = (1, 0, 0) 得到:A(n) = 2m【f (n) = 2m】 2、从(α, β, γ) = (1, -1, -1)得到:A(n) – B(n) – C(n) = 1【f(n) = 1】 3、从(α, β, γ) = (1, 0, 1)得到:A(n) + C(n) = n【f(n) = n】 • 解上述方程,可以得到 C(n) = n - A(n) = l,而B(n) = A(n) - 1 - C(n)= 2m - l - 1 • 这与我们的猜想是一致的。
Josephus问题的推广 • 前面这种方法叫做repertoiremethod(庄心谷老师翻译成:“包含各种组成部分的方法”,或许称为“清单法” 更简洁一些) • 清单法很犀利。回顾它的主要思想: • 首先观察有限个项的形式,并猜测封闭解,将其写成系数函数与常量的组合形式; • 在若干简单的常量组合上,直接求解封闭形式解(注意所选取的常量组合要使得计算尽量简单)。或者选择特别简单的函数,反向求解出对应的常量组合; • 由1、2得到关于系数函数的方程组,解出系数函数,并且与常量组合得到最终结果。
Josephus问题的推广 • 我们知道,原始的J函数有一个巧妙的解释,可用二进制表示为: J(bmbm-1bm-2…b1b0)2 = (bm-1bm-2…b0bm)2 • 广义Josephus递归方程是否也有巧妙的解释呢? • 当然是有的。如果我们令β0 = β而β1 =γ,那么可以将递归方程写成: f(1) = α f(2n+ j) = 2f(n) + βj
Josephus问题的推广 • 按二进制方式展开,此递归方程变成: f((bmbm-1…b1b0)2) = 2f((bmbm-1…b1)2) + βb0 = 4f((bmbm-1…b2)2) + 2βb1+ βb0 …… = 2m f((bm)2) + 2m-1βbm-1+ … +2βb1+ βb0 = 2m α + 2m-1βbm-1+ … +2βb1+ βb0 • 接下来,放松二进制表示的限制,在每个位上允许使用任意数字,那么上面的结果可以表示成: f((bmbm-1…b1b0)2) = (αβbm-1βbm-2 …… βb1βb0)2
Josephus问题的推广 • 结果非常巧妙。此外,如果换一种方式来重写小数值上的f(n),有可能更容易发现这种规律: f((bmbm-1…b1b0)2) = (αβbm-1βbm-2 …… βb1βb0)2 蓝色 变量固定不变 红色 变量交替变化
Josephus问题的推广 • 例如,当n = 100 = (1100100)2,在我们原来的Josephus参数α= 1,β = -1和γ = 1之下,可以得到 • 特别地,对于部分特殊的n值(10……00)2,结果为 (1 -1 …… -1 -1)2 = (00……01)2 在这些n上,能够看出有循环移位(勉强能和前面相比,不是非常generalized)
Josephus问题的推广 • 下面进一步地推广。来看递归方程 f(j) = αj (j = 1……d-1) f(dn + j) = cf(n) + βj (j = 0……d-1) • 这个递归方程的形式与前面基本相同,但是是以d进制的数开始,而且产生的值采用c进制来表示。 • 也就是说,它的自变量和函数值采用不同的基数来表示。直接列出计算公式如下: f((bmbm-1…b1b0)d) = (αbmβbm-1βbm-2 …… βb1βb0)c
Josephus问题的推广 • 例如,对于下面的递归方程,我们计算f(19) f(1) = 34 f(2) = 5 f(3n) = 10f(n) + 76 f(3n + 1) = 10f(n) - 2 f(3n + 2) = 10f(n) + 8 • 也就是说d = 3,c = 10。因为19 = (201)3,为了使用变化基数的方法,我们逐位进行从基数3到基数10的转换: • 第1位的2变成5,而0和1分别变成了76和 –2,因此结果为 f(19) = f((201)3) = (5.76.-2)10 = 1258 α2β0β1
Exercises • 练习题(不必上交) 1.15、1.16