编程之美1.13 威佐夫(NIM)博奕(Wythoff Game)涉及的数学定理论证

12 篇文章 0 订阅

        威佐夫博奕的问题描述如下:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。问给定两堆物品的数量,谁会赢得这个游戏。

        这一问题是一个很有趣的问题,而且解法也是十分的巧妙。该题目的解法就是找出奇异局势(即先手必输)。其奇异局势形如:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)……

        这一系列的奇异局势满足如下规律:

        我们把第k个奇异局势表示为,其中

        这是一个很神奇的结论,它居然用到了黄金分割数完美解决问题,并能够在的时间内立刻判断出是否是奇异局势,进而判断出谁会赢得游戏。

        然而问题在于”Why“。为什么只要满足了上述表达式就可以判断奇异局势?

        这是一个很经典的博弈题,网上也有很多关于这一问题的讨论。然而,几乎所有关于该问题的讨论均止步于上述的讨论结果,并没有进一步去讨论这一结果的由来。很显然,这一结果是不可能被直观地看出来的,这一问题的背后应该包含一些深奥的数学原理。

        数年前,我在刷ACM题的时候,碰到这一道题,题目是http://poj.org/problem?id=1067。这一题当时没想出来,直到看了题解之后才知道有这么一个解法,但并不清楚为什么这样做是可以的。

       所幸的是,昨天在看《编程之美》的时候再一次看到了这一问题,同时文中还包含了该问题的解法证明。书中证明挺详细的,看完之后可以对这一问题有比较深刻的理解。然而,在证明过程中,该书用到了一个数学定理,该定理是得出这一解法的关键,但书中并没有详细说明。

       因此,我就尝试着对这一问题加以论证。


       定理一:如果正无理数a,b满足,则集合是集合的一个分划。其中表示对x进行下取整。

       证:令,P和Q是的一个分划即

              上述命题等价于。这是两个同时需要满足的命题。接下来,我将分别对这两个命题分别展开讨论。

              ①讨论

              用反证法证明。设存在x满足。那么存在某一个,满足,即

              根据式子。我们可以做如下推理:

             

              同理,也可以得出存在某一个,满足。  有成立。

            显然,从上述两个角度得出来的的取值范围有交集是存在合法的b的前提。那么他们有交集等价于下列两式成立:

            联立可得。因此,得出 

           然而显然是一个有理数,这与题目中a,b是正无理数的假设矛盾。


          ②讨论

          同样用反证法证明。设存在x满足。那么有,即存在

           解上述方程有,同上推理得

           由

           用和①中相类似的方法可以求得,进而得出

           同样是一个有理数,这与题目中a,b是正无理数的假设矛盾。

           根据①和②的讨论,可以很容易地发现上述两个命题均是正确的。从而证明了题设是正确的。



       在此基础上,进一步讨论下列问题,为什么a和b一定是要无理数呢,如果是有理数会怎么样?

       设a为有理数,那么根据。显然b也是有理数。

       既然它们都是有理数,就一定可以写成,其中分子分母均为正整数。

       那么可以构建,使得

       这与问题中的结论相矛盾。因此,显然a和b一定不是有理数。


后记

       最近在找工作,因此想说看一下面试心得《编程之美》来找一些面试的感觉。书里提到了不少问题都是蛮有趣的,而且有部分题目是以前搞ACM的时候曾经遇到过的。在看书的时候对于大多数问题,我都会进一步去思考它背后的原理和论证过程。对于其中一部分书上没有的同时我又觉得比较有趣又有价值的论证过程,我就想说用日志(博客)的形式保存下来。一来,作为原书的补充;二来,做个保存,以免以后忘了。同时,也可以让更多的人了解这些知识。

       其实,我感觉我还真不那么适合于现在IT公司招聘的要求。很多IT公司其实对于应聘者所掌握的技术还是有要求的。如果应聘者能够掌握或了解一些最新的具体技术的话,总是会让那些HR们眼前一亮。但我其实一直觉得那些所谓的技术无论再怎么新再怎么强大或者被吹得如何神乎其神,技术终归只是技术。技术背后的思维方式才是最重要的。

       而在很多码农看来,是否掌握某些”高大上“的技术似乎已经成为了批判其他程序员好坏的重要标准。于是,网上有了所谓的程序员鄙视链这一神奇的标准。这些码农们永远都只关心你是否会用这些高大上的技术做些什么东西,而从没关注过你是否掌握了这门技术背后的思想。就拿面向对象思想(OO)来说吧,Java和C#之类的语言都是这一思想的具体实现。而问题在于,在关心你是否会使用Java和C#时,有多少人关心过如何用面向对象思想来思考解决问题,而不是你会不会用某些API来解决问题呢?事实上,VB语言也是可以实现面向对象编程的。技术只是工具,某种特定的技术只是让某些特定的思想更加容易实现,然而真正去实现它的还是技术背后的“人”,而不是技术本身。然而,程序员鄙视链”俨然把技术置于人之上,只要你会某种高大上的技术,那你就是比那些只拥有“低端”技术的人牛逼。在这种逻辑下,会用C语言开发的人显然就比会VB开发的人牛逼。

       也许,我应该去了解一些最新最前沿的技术。这样应该总能提高一些面试通过的几率吧。

       


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值