1 / 46

具体数学 Concrete Mathematics

北京航空航天大学计算机学院. 具体数学 Concrete Mathematics. 赵启阳 2014年9月28日星期日. 第一章 递归问题 Recurrence. 通过 3 个例子来认识递归问题: 1 - Hanoi Tower 2 - Lines in the Plane 3 - Josephus Circle 3 个例子的 3 个共同点: 一直被数学家们反复研究; 已知解法都使用递归,大问题化为小问题; 都可以用计算机程序来求解。. 1.1 汉诺塔 Hanoi Tower. 1.1 汉诺塔.

kim
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年9月28日星期日

  2. 第一章 递归问题Recurrence 通过3个例子来认识递归问题: 1 - Hanoi Tower 2 - Lines in the Plane 3 - Josephus Circle 3个例子的3个共同点: • 一直被数学家们反复研究; • 已知解法都使用递归,大问题化为小问题; • 都可以用计算机程序来求解。

  3. 1.1 汉诺塔 Hanoi Tower

  4. 1.1 汉诺塔 首先来看被称为“汉诺塔”(Hanoi Tower)的智力问题。该问题是法国数学家Edouard Lucas在1883年提出的。给定一个由八个大小不同的圆盘组成的塔,最初圆盘按尺寸递减的次序自底而上地堆放到三根杆中的一根上。类似的问题是婆罗门塔(64个盘子,一直挪到世界末日……,后面我们有相关的分析)

  5. 汉诺塔—目标和要求 • 目标:把整个塔从一根杆移到另一根杆上。 • 规则: (1)One time, one disk; (2)No larger disks on smaller ones, Anytime. • 直观上很难看出这个问题的解法,但是我们以前在C语言的递归部分已经遇到过,可以确信它有一个解。下面看一下一个C语言的Hanoi Tower程序:

  6. 汉诺塔—C程序 #include <stdio.h> inthanoiSolver(int peg1, int peg2, int peg3, intdCount) { intmCount = 0; if (dCount > 1) { mCount += hanoiSolver(peg1, peg3, peg2, dCount - 1); printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3); mCount += hanoiSolver(peg2, peg1, peg3, dCount - 1); } else { printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3); } return ++mCount; } Is your solution the best ? int main() { int mCount = 0, dCount = 64; mCount = hanoiSolver(1, 2, 3, dCount); printf(“Move count is %d\n", mCount); return 0; }

  7. 汉诺塔—新的问题 • 现在的问题:怎样做才最好?也就是说,为了完成这个任务,多少次移动是必要(necessary)而且充分(sufficient)的? • 婆罗门塔有64个圆盘,而汉诺塔有8个圆盘。单纯考虑这两个特定数字的特定例子反而难以下手,不如先从小一点的例子出发,再进而考虑一般化的例子,最后再推广到这两个特定问题。下面考虑任意 n 个圆盘的情况。

  8. 汉诺塔—小规模情况 • 很容易看出如何转移一个仅包含一个或者两个圆盘的塔,而且用少量实验就能说明如何转移包含三个圆盘的塔。 • 设Tn 为在 Lucas规则下将 n 个盘子从一根杆转移到另一根杆的最少移动次数(注意是最少!!!) • 很明显, T0 = 0,T1 = 1,T2 = 3。 • 下面我们来看n = 3的例子,请一位同学来解答。 • 通过对n = 3的总结,我们可以得到什么经验?

  9. 汉诺塔— n个盘子情形 • 回忆一下,前面的C程序中转移n个盘子的一般思路: 1、先把 n - 1个小盘子移到中间的杆上(需要Tn-1次移动) 2、然后移动最大的盘(要求1次移动) 3、最后再把n - 1个盘移到最大的盘上(需要Tn-1次移动) • 结论: 最多移动 2Tn-1+1 次就能转移 n 个盘(其中n > 0),因此 Tn ≤ 2Tn-1 + 1 (n > 0) • 讨论: 目前还不能断言“=”,因为上面的方案仅能证明2Tn-1+1次移动可以完成任务,但是无法说明 2Tn-1+1次移动是必须的。

  10. 汉诺塔— n个盘子情形(续) • 转移n个盘子的一般思路(续): • 你能想到更好的方法吗?找个同学试试看(如果移动次数相同,但是移动顺序不同也可以)。 • 好吧,我们来想想看:必须在某个时刻移动最大的盘,当移动最大盘时,n - 1 个最小的盘一定在一根杆上,而且至少用了Tn-1次移动来把这些盘子放到那根杆上。 • 移动最大盘的次数可能会大于1次。但是:在最后一次移动最大盘之后,我们必须把n- 1个小盘子(一定还在一根杆上)转移回最大盘上,这同样需要 Tn-1次移动。 • 结论: Tn ≥ 2Tn-1 + 1 (n > 0)

  11. 汉诺塔—递归方程 • 将前面两个不等式和 n = 0 的平凡情况结合在一起,可得: T0 = 0 Tn = 2Tn-1+1 • 上面的两个等式称为递归方程。 • 在递归方程中,需要给出一个边界值(boundary value),以及根据前面的值来表示一般值的方程。 • 严格来说,递归方程需要有边界值才算是完整的,有时也把单独一个方程称为一个递归方程。

  12. 汉诺塔—递归方程求解 • 有了递归方程,我们可以计算任何 n 值下的Tn。 • 麻烦的是:当n较大的时候,使用递归方程的计算时间太长 n consumed time on my Notebook (2.66GHz, Core Duo 2) 8 <= 1 second 64 ≈ 3 * 236 seconds ≈ 2000000 days ≈ 5479 years • 递归方程给出的是临近的Tn之间的数值关系(求Tn需要前面的值) • 我们需要Tn的简洁的“封闭形式”解!!!(closed form,仅仅与已知量有关,如n),则可以迅速地完成计算。

  13. 汉诺塔—递归方程求解 How to Solve it? GuessProve • 先在小的数值例子上猜测解的形式,然后在一般数值上证明其正确性。 • This method would be widely adopted in CM.

  14. 汉诺塔—递归方程求解(续) • 首先,我们在小的例子上计算: • T0 = 0 = 1 – 1 1 20 • T1 = 1 = 2 – 1 2 21 • T2 = 3 = 4 – 1 4 22 • T3 = 7 = 8 – 1 8 23 • T4 = 15 = 16 – 1 16 24 • T5 = 31 = 32 – 1 32 25 • T6 = 63 = 64 – 1 64 26 • OK,似乎我们已经知道解应该是什么样的了: 猜测:Tn = 2n - 1 • 至少这个公式对于n =0, 1, 2, 3, 4, 5, 6都是成立的。

  15. 汉诺塔—递归方程求解(续) 数学归纳法——Mathematical Induction 1、归纳基础——Basis 2、归纳推理——induction • 数学归纳法,是用来证明某个命题对于所有大于等于n0的整数n都成立的一般方法: • 首先,证明n为最小值n0时命题成立——归纳基础 • 然后,假设对于包含在n0和n–1之间的所有值均成立,在此假设上证明命题对于n成立——归纳推理 • 数学归纳法可以用有限的步骤证明无限多个值上的结论。前提是用于良序集合。(多说一句,数学归纳法在数学家之中存在争议,有些坚决不承认无限步骤的证明)

  16. 汉诺塔—递归方程求解(续) • 递归方程是数学归纳法的理想应用。 • 第一步(归纳基础):T0 = 20 – 1,所以归纳基础成立。 • 第二步(归纳演绎):在Hanoi Tower问题的情况中,我们很容易从式Tn-1得到Tn:假设n – 1的时候结论成立,那么在n的时候,我们有 Tn = 2Tn-1 + 1 = 2(2n-1 - 1) + 1 = 2n – 1 因此对于n,我们猜想的结论同样成立。 • OK!到此我们成功地证明了对所有的n > 0 Tn = 2n – 1

  17. 汉诺塔—递归方程求解(续) • 在各种递归问题中,汉诺塔递归问题具有代表性。 有数学方法,有计算机程序…… • 在寻找Tn封闭形式解的过程中,我们经历了三个阶段: 1. 观察数目小的情况。这样能让我们深入了解问题,并在第二和第三阶段帮助我们。 2.寻找并证明重要变量的数学表达式。对于Hanoi Tower问题,这个表达式是一个递归方程。我们可以递归地计算任何n的Tn值。 3.寻找并证明目标函数的封闭形式解。对于Hanoi Tower 问题,就是递归方程的解。

  18. 汉诺塔—递归方程求解(续) • 这么容易?似乎忘记了重要的一环……等等…… • First,计算了一些小例子……这个很容易 • Second,用这个出身可疑的数学归纳法证明最终结论……这个也很容易 • But,既然这么容易,我们上CM干什么? • Hold on……aha, gotcha……我们怎么这么顺利地猜到封闭形式解的形式?

  19. 汉诺塔—递归方程求解(续) • 的确,对Hanoi Tower问题的解决过程要求“归纳跳跃”,严重依赖于能否敏锐地洞悉答案,或者……侥幸地猜中答案 • 这里的逻辑断层就是CM课程的主要任务:锻炼我们对答案的敏锐洞察力,或者……提升你的幸运指数…… • 对Hanoi Tower问题,我们将会很习惯地在Tn的方程两端都加1,并且看看它能发生什么 T0 + 1 = 0 + 1 = 1 Tn + 1 = 2Tn-1 + 2 = 2(Tn-1 + 1) 令Un-1 = Tn-1 + 1,我们看到 U0 = 1 Un = 2Un-1 好了,剩下的事情似乎与洞察力无关了……

  20. 2nd Homework • 练习题(不必上交) 1.10、1.11、1.13、1.18 • 作业(可见课程网站,请用英文解答) Suppose we have M pegs (p1, p2, …, pM) and all Ndisks are on p1. We need to move them to pM under the Lucas rule. How many moves are required at least? You may finish it in 3 ways: (1) Propose some general equalities/inequalities, such as in Exercise 17 and Exercise 25, or (2) Calculate the exact number for (N, M) = (13, 5), (13, 7), (19, 5), (19, 7), (23, 5) and (23, 7) with your computers. Please submit your numbers with source codes (in C/C++) together. (3) Now we know the minimum amount of necessary moves to finish a Hanoi task of (n, 3) is Tn. But what’s the sub-minimum amount T’n? To say, T’n is smaller than any other necessary amounts but Tn. How about T’n = Tn + 1? Can you find a move scheme for it? Remember, I’d like invite n guys to show their solutions to us next time. • Deadline: before 23:59, 22th, Sep.

  21. 1.2 平面中的直线 Lines in the Plane

  22. 1.2 平面中的直线 • 问题:平面中的n条直线最多能围出多少个区域(无论开区域还是闭区域都算)? • 瑞士数学家Jacob Steiner在1826年首先予以解决(图论、算法中的Steiner树以其名字命名,该问题是NPC的) • 先来观察小的情况(我们的老套路): (1) n = 0 : Ln = 1 (2) n = 1 : Ln = 2 (3) n = 2 : Ln = 4 • 好,先观察到这里。我们猜Ln= 2n,也就是说,每添加1条直线区域数加倍(剖分原来的所有区域)。

  23. 平面中的直线-目标和求解 • 看看猜得准不准 • First,如果1条直线将至多将某区域剖分为2个,则该区域是凸的,反之也成立(严格的概念和证明请看拓扑论) • Second,凸区域被剖分之后也是凸的 • Third,我们的猜测意味着新直线将与所有原区域相交 • Hold on…添加第3条直线,以剖分原来4个区域…what?无论如何,我们最多只能同时剖分3个!!!

  24. 平面中的直线-目标和求解 • 冷静一下……仔细想想…… • 直觉上来看,直线对区域的剖分,表现为在区域中加上了1条分界线,也正是区域边界与直线相交形成的一段 • 如果将直线划分成不同的段(闭区段和开区段都算),则每个段剖分1个区域,每剖分1个区域,新增加1个区域。 • 因此,新增加的区域数应该等于新直线被划分的段数!!! • OK,我们的目标转移了: 新直线能够最多被划分成多少个段?

  25. 平面中的直线-目标和求解 • 新直线是被原直线划分成各个段的,因此, • 目标进一步转移:新直线最多能被原直线划分成多少个段? • 每条直线至多相交一次,因此新直线最多与原来的n - 1直线相交n – 1次,形成n个段(注意两端开放的段) • 倒着反推再反推,新直线最多剖分出来n个新的区域!!! • So, we get Ln ≤ Ln-1 + n

  26. 平面中的直线-目标和求解 • 事实上,只要使第n条直线不与任何1条原来的直线相平行,就可以做到和每条直线相交,而且不经过原来的交点(确保它会被切割成n段,可用数学归纳法证明) • 这样,前面的不等式变成等式。对应的递归方程为 L0 = 1 Ln = Ln-1 + n • 验证:对小例子L1 = 2 、L2 = 4和L3 = 7都符合这个递归方程。(可惜还不是封闭形式)

  27. 平面中的直线-递归方程求解 • 为了取得封闭形式解,看一下Ln的序列,能猜出什么? 1,2,4,7,11,16,… • 很难发现规律。变一下策略,索性把递归式完全“展开/摊开”,看看能发现什么: Ln = Ln-1 + n = Ln-2 + (n - 1) + n = Ln-3 + (n - 2) + (n - 1) + n …… =L0 + 1 + 2 + …… + (n - 2) + (n – 1) + n = 1 + Sn (Sn表示前n个正整数之和) • 也就是说, Ln等于前n个正整数的和 Sn加上1。

  28. 平面中的直线-递归方程求解 • 在CM课程中,Sn会经常会出现,我们把它的小值做成表。下一次再遇到它们的时候,希望能够一眼就瞧出来: • 这些值被称为三角形数(Triangular Numbers,杨辉三角比这个更复杂),因为Sn是n行三角形阵中圆孔的个数。譬如普通的四行阵就有S4= 10个圆孔。

  29. 平面中的直线-递归方程求解 • Gauss在他9岁的时候(1786年,乾隆五十一年)提出了计算Sn的方法(推荐大家去看看CM第6页上的边注,关于Gauss为何有这么多的成果): • 计算过程很简单,我们直接给出结论: Sn = n (n + 1) / 2

  30. 平面中的直线-递归方程求解 • 这样就得到了结果: Ln = n (n + 1) / 2 + 1 • 上面的结论是部分地凭借直觉得到的,我们可以用数学归纳法给出一个严格的证明。其中的归纳演绎步骤是 Ln= Ln-1 + n = [(n - 1) n / 2 + 1] + n = n (n + 1) / 2 + 1 • OK, now we’re completely sure about the above closed-form. • But, 到底什么是封闭形式解(closed form)?哪些又不是封闭形式解?

  31. 平面中的直线—封闭形式 • 对一个量f (n)的表达式而言,如果能够最多用固定次数(此次数独立于n )的“常用”标准运算来算出结果,则称其为封闭形式的。So, 1、递归方程不是封闭形式,因为求解次数依赖于n。 2、我们得到的Tn和Ln的结果是封闭形式的: Tn:1次exp,1次— Ln:2次+,1次× ,1次÷ 3、1 + 2 + … + n之类的和不是封闭的(用…省略了中间的加法计算,其次数与n有关) 4、n(n+1)/2等表达式是封闭的( 1次+,1次×,1次÷) 5、n!是不是呢?

  32. 平面中的直线—封闭形式 • 关于n!等封闭形式的例外情形: • 简单闭形式的总数是有限的,而一些常用、重要的递归方程并没有简单闭形式 • 为了更好地表达数学运算结果,我们就增加了一些“常用”的标准运算,以扩展封闭形式的范围。例如阶乘n! (尽管它的等价形式1·2·…·n并不是封闭的),也就是说计算阶乘被视为1次运算。

  33. 平面中的直线—变形 • 下面考虑Lines in Plane问题的变形:假设用弯曲线代替直线,而且每条弯曲线都含有一个“锐角的锯齿形转角(角度不必相等,可以变化)”,那么平面中n条弯曲线围成的区域最多有多少呢? • 先来观察一下n = 1和n = 2的情形:

  34. 平面中的直线—变形 • 容易看出:每加入1条弯曲线,就像加入了2条直线,只是这“两条”直线在交点处没有延伸,因此导致了区域2、3、4的合并(3变1): • 每加入1条新弯曲线,在新增加区域的数量中都要至少减去2。同时,如果把拐点地放到一个开区域,使得隐去的直线不会与原来的直线相交,我们只会减少2个区域(严格的摆放方法见Exercise 18)

  35. 平面中的直线—变形 • 也就是说,新弯曲线增加的区域数为2n – 2 (先像2条直线一样考虑区域的剖分,得到2n,再考虑区域的合并,得到-2) Zn = Zn-1 + 2n - 2 • 或者,先统一地像2n条直线一样考虑区域的剖分,得到L2n;再考虑区域的合并,得到-2n,所以 Zn = L2n – 2n = 2n(2n + 1) / 2 + 1 – 2n = 2n2 – n + 1

  36. 平面中的直线-变形 • 对Ln和Zn的封闭形式进行比较,我们发现对于大的n,有下面的关系, • 因此,弯曲线情况得到的区域数目大概是直线情况的4倍。(CM的第9章会讨论如何分析整函数的近似状态,符号‘~’的定义可见9.1节) • 扩展问题:在前面的分析中,我们一直默认为锐角的弯曲线,而且角度可以变化。那么,如果角度是固定的(可以是锐角,也可以是钝角),那么结论是怎样的呢?

  37. More on Lines in the Plane • 在前面讲到的弯曲线问题中,Zig角的大小是不定的,否则其结论不成立。 • 首先明确边的次序。按顺时针方向,称依次经过的两条边为左直边和右直边。讨论锐角情形,记角度为d。。以当前曲线的Zig角点为原点,假设左直边位置为0,右直边为– d。如何放置另一曲线,才能交出4个交点? 极限位置1 (p = d)

  38. More on Lines in the Plane 极限位置2 (p = -d) • 记弯曲线2的两条边位置分别为p和(p – d),则仅在极限位置1和极限位置2之外的弯曲线有可能(并不是充分条件)交出4个交点。也就是说p满足: p > d或者p < -d (此为必要条件)

  39. More on Lines in the Plane • 对于N条弯曲线,当且仅当任意两条弯曲线之间的角度p满足上述条件,才可能两两相交出4个交点。容易看出N至多为 。 • 可以将其转化成圆上放球问题:在圆周上放置半径无穷小的球,使得两两之间的圆上距离不小于d。其高维推广形式包括各类放球问题,如立方体内放球问题等(very hard!!!)

  40. More on Lines in the Plane • 接下来考虑,相交出4个交点的充分条件是什么?在角点位置可以随意移动的条件下,p需要满足: – 180 + d < p < – d或者d < p < 180 – d,也就是说 球p与第一个球的圆上距离大于d,小于180 – d

  41. More on Lines in the Plane • 那么,最多有多少条曲线两两相交出4个交点? • 显然,由蓝色球限制了剩余所有小球均在红色区段上。易知红色区段内的小球之间的圆上距离不超过180 - 2d,因此只需要使得其两两距离大于d即可。对于不同红色区段上的球,圆上距离不小于2d,因此需要使其两两距离小于180 – d。

  42. More on Lines in the Plane • 显然,只要保持剩余的球都在红色区段内,就可以忽略蓝色球的存在。因此,可调整上面红色区段内最右端的球的位置,使之无穷逼近右端绿色分界点。此时下端红色区段变成

  43. More on Lines in the Plane • 接下来我们不停地上侧红色区段内放第3个球、第4个球……下侧红色区段逐渐变化为: • 看起来下侧红色区段就会慢慢消失……一直到最后一个位置,哈,彻底消失了……

  44. More on Lines in the Plane • 容易看出,消失的条件是:上侧红色区段的最左端的球的位置在180 – d到180 – 2d之间。 • 在最后消失的情况中,上侧红色区段的球数为 ,下侧红色区段内没有球。这是最优情况吗?

  45. More on Lines in the Plane • 我们随着红色区段的变化趋势来看看 • 上区段内的球数图示下区段可放球数 • 1 • 2 • 3 • 0

  46. More on Lines in the Plane • 也就是说,在每个阶段,上下区段内的球数之和是固定值 。因此总球数为 。Hmm…应该是曲线条数…. • 对于d >= 90的情形,两条弯曲线之间的交点至多有3个。如果使得两条弯曲线之间的夹角任意地小,则可使得任意两条弯曲线之间的交点数为3。

More Related