1 / 34

具体数学 Concrete Mathematics

北京航空航天大学计算机学院. 具体数学 Concrete Mathematics. 赵启阳 2014年10月6日星期一. 1.3 约瑟夫环问题 Josephus Circle. 1.3 Josephus 问题. 最后的例子是一个古老问题的变型,它是以公元一世纪著名历史学家 Flavius Josephs 命名的。传说是 Josephus 的数学才干让他逃过一劫。 在犹太人和罗马人战争期间, Josephs 等 41 个犹太反抗者陷入包围。他们宁死不做俘虏,决定围成一个圆圈,每次由剩下的人中的第三个自杀,直到所有人都死去为止。

teleri
Download Presentation

具体数学 Concrete Mathematics

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 北京航空航天大学计算机学院 具体数学Concrete Mathematics 赵启阳 2014年10月6日星期一

  2. 1.3 约瑟夫环问题Josephus Circle

  3. 1.3 Josephus问题 • 最后的例子是一个古老问题的变型,它是以公元一世纪著名历史学家Flavius Josephs命名的。传说是Josephus的数学才干让他逃过一劫。 • 在犹太人和罗马人战争期间,Josephs等41个犹太反抗者陷入包围。他们宁死不做俘虏,决定围成一个圆圈,每次由剩下的人中的第三个自杀,直到所有人都死去为止。 • Josephus和他的1个朋友认为,自杀是愚蠢的。因此他很快地算出死亡之圈中他俩应该站的位置(当然,是两个应该最后自杀的位置,没有人监督他们是否自杀,所以……)

  4. Josephus问题 • 我们的问题是,从编号为1到n的围成一圈的人开始,依次排除剩下的人中的第2个(注意:是从当前“指针”开始),直到仅剩1个幸存者。下面是n = 10的情况: • 排除次序是2,4,6,8,10,3,7,1,9。因此5幸存。 • 问题目标是:如何确定幸存者的号码J (n)?

  5. Josephus问题 • 首先提出猜想:根据刚才的J(10) = 5,猜想当n是偶数时J(n) = n / 2。n = 2时猜想成立:J(2) = 1。但是对n = 4和n = 6的情况,猜想失败。 • 从上面的表看来,J(n)都是奇数,因此将其作为新的猜想:事实上第1轮筛选就排除了所有的偶数,因此猜想成立。

  6. Josephus问题 • 另外还观察到,若n是偶数,那么在做完第1轮筛选之后,剩下的情形和最初的开始情况是非常类似的,但是人数要少一半,而且编号也有所不同。 • 假设原先有2n个人,在第1轮筛选之后,剩下的情况是 • 此时圆圈剩下了n个人:1、3、5、7、……、2n – 3、2n – 1。而且“指针”又回到了1的位置。这与最初有n个人的情形是相同的,区别仅在于编号有变化。

  7. 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

  8. 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

  9. Josephus问题 • 到目前为止,我们得到了两个“递归”色彩的式子: J(2n) = 2J(n) - 1 J(2n + 1) = 2J(n) + 1 • 上面涵盖了所有“偶数”和“奇数” ,即所有正整数,但还缺少boundary value,作为“递归系统”的第一推动力。 • 很简单,J(1) = 1(最后剩下1个人,不必再筛选)。这样就得到了完整的J的递归方程。

  10. 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 但是无论从数学的完美意义,还是实际的计算效率上来考虑,最好找到闭形式解。

  11. Josephus问题 • 我们仍然使用“猜想证明”思路来求解封闭形式解。首先根据递归方程,对较小的n建立J(n)表: • 可以发现什么规律? 1、每隔若干个位置就从1开始 2、每次从1开始的子序列都是级差为2的等差数列 3、每个子序列的长度是递增的 Question:怎样用数量表达上面的观察结果?

  12. Josephus问题 • 继续观察,可以看到: 1、第1子序列长度为1,此后长度为2、4、8、…… (谨慎怀疑子序列长度构成比值为2的等比数列!!) 2、如果上述怀疑成立,那么我们只要知道当前n处于第几个子序列的第几个位置,就能够从1逐渐累加得到J(n)了!!!

  13. 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)

  14. 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

  15. Josephus问题 • 猜想已经完成,结论尚待证明……(纪念辛亥100周年) • 证明仍然采用归纳法:猜想是用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 符合等差数列!!!

  16. Josephus问题 对一般的人来说…… 前面的计算和分析已经够好了…… 但是, CM三人行还带来了真正让我们惊讶的部分…… 一个talented part…… 让我们看看,他们talent在何处……

  17. 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

  18. 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 = 999的情形。

  19. 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。

  20. 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为奇数) • 较小的解为

  21. 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) + γ

  22. Josephus问题的推广 • 从f(1) = α开始,并根据上面的方程逐步地推导,可以构造出较小n值上的函数值表:

  23. 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

  24. 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

  25. 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。

  26. 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 • 这与我们的猜想是一致的。

  27. Josephus问题的推广 • 前面这种方法叫做repertoiremethod(庄心谷老师翻译成:包含各种组成部分的方法。我称为“清单法”,不知道对不对) • 清单法很犀利。下面理一理它的思路: • 首先观察有限个项的形式,并猜测封闭解,将其写成系数函数与常量的组合形式; • 在若干简单的常量组合上,直接求解封闭形式解(注意所选取的常量组合要使得计算尽量简单) • 由1、2得到关于系数函数的方程组,解出系数函数,并且与常量组合得到最终结果。

  28. Josephus问题的推广 • 我们知道,原始的J函数有一个妙解,可用二进制表示为: J(bmbm-1bm-2…b1b0)2 = (bm-1bm-2…b0bm)2 • 那么,广义Josephus递归方程是否也有这种奇妙的解呢? • 当然是有的。如果我们令β0 = β而β1 =γ,那么可以将递归方程写成: f(1) = α f(2n+ j) = 2f(n) + βj

  29. 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

  30. Josephus问题的推广 • 看起来结果很完美。但是如果换一种方式来重写小数值n上的f(n)函数表的话,可能更容易发现这种规律: f((bmbm-1…b1b0)2) = (αβbm-1βbm-2 …… βb1βb0)2

  31. Josephus问题的推广 • 例如,当n = 100 = (1100100)2,在我们原来的Josephus参数α= 1,β = -1和γ = 1之下,可以得到 • 因为在n的表示中,每组二进制数字位 (10……00)2被转换为 (1 -1 …… -1 -1)2 = (00……01)2 这样就显示出了循环移位性质,当然,不是非常的generalized。

  32. Josephus问题的推广 • 下面我们进一步地进行一般化。来看递归方程 f(j) = αj f(dn + j) = cf(n) + βj (j = 1……d) • 这个递归方程的形式与前面基本相同,但是是以d进制的数开始,而且产生的值采用c进制来表示。 • 也就是说,它的自变量和函数值采用不同的基数来表示: f((bmbm-1…b1b0)d) = (αbmβbm-1βbm-2 …… βb1βb0)c

  33. 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

  34. 2nd Homework • 练习题(不必上交) 1.15、1.16 • 作业(可见课程网站,请用英文解答) Only small modifications to the Josephus problem in our textbook: Now we’d like to select the mth (m is not necessarily less than n) guy as the “lucky” one each time, instead of the 2nd. You might finish it in 2 ways also: (1) Guess the closed-form of J(n) for m = 3, 4, 5 and prove it; (2) Solve the J(n) by computer programs in C/C++ for m = 7, 11, 17 and 37, whereas n is 20110926 all the time. High performance of computational efficiency would be appreciated much. Remember, I’d like invite n guys to show their solutions to us next time.

More Related