随记:普遍性验证、数学思维、代数基本定理及其它

    大学生活的乐趣不光体现在吃喝玩乐上,更重要的是它所提供的自由学习的场所。你可以在网上搜索课表,看看什么时候什么教室有什么牛B课,记在手机中的待办事项中,到时候到那个教室去旁听。旁听的乐趣就在于,你可以去学任何你想学的东西,不用交作业,不用怕点你名,不用记笔记,不用考试,只需要挂个耳朵在那儿听牛B东西就行了。前天一大早就被兔子叫起来,跟着一起去旁听了一节数理逻辑。
    课程内容很简单,毕竟也才只讲了两周,一切都是很基础的。老师讲得很好,对联结词、命题公式、真值表等概念都说得很细致,即使完全没接触过这方面东西的人也能弄明白。作为信科的专业课,老师也简单提到了SAT问题:给定一串由AND, OR, NOT, 逻辑变量和括号组成的表达式,是否能给变量取值使得整个表达式为真?如果存在这样的“成真赋值”,我们就称表达式是一个“可满足式”。最简单的例子,p∧q就是可满足的,把p、q都取真即可;p∧(¬p)就不可满足,该式无论如何都为假。判断一个逻辑表达式是否可满足是一个经典的NPC问题,目前除了枚举之外还没有更好的算法。
    还有一种逻辑表达式,不管初始值是什么,整个式子恒为真。例如,p∨(¬p)就是永真式。看起来,判定一个式子永真比判定一个式子可满足似乎要困难得多,因为前者比后者要强得多。而事实却是,这两个问题可以(在多项式的时间内)相互转化,它们在复杂程度上并无区别。如果你找到了一种可满足式判定算法,你便立即拥有了永真式判定算法。换句话说,你的算法若能找出一个成真赋值,你就能利用该算法立即得出该式所有赋值结果是否都为真。这个问题的问法很有艺术性,它有意屏蔽掉了永假式判定这一桥梁。事实上,一个表达式要么可满足要么永假,而从永假到永真只有一步之遥——只需要在最前面加一个“非”即可。也就是说,如果有一个程序,它能告诉我逻辑表达式A是否可满足,那么我就把¬A输进去:如果它说¬A不可满足,意即¬A的任何赋值结果均为假,反过来A就是永真的;如果它说¬A可以满足,意即程序找到了¬A的一个成真赋值,反过来便成为了A永真的一个反例。


    这个例子极具启发性。这不是一个题目,而是一种思想。我一年半的大学学习中遇到的最好的老师是大一上的高数老师雷功炎教授。他的作业有一个特点:你可以不断使用你已经得到的结论去解决新的问题,新问题的解决又给后面的题目打通了捷径。在完成作业的过程中保持这样的思想,所有的题目都可以顺水推舟,一气呵成。他在课堂上反复强调,这种事半功倍的偷懒办法正是数学最吸引人的地方。
    这种思想是所有数学家和数学爱好者引以为傲的思想!以至于任何一个喜欢数学的人看完下面这段文字都会哈哈大笑:

    一天,数学家觉得自己已受够了数学,于是他跑到消防队去宣布他想当消防员。消防队长说:“您看上去不错,可是我得先给您一个测试。” 消防队长带数学家到消防队后院小巷,巷子里有一个货栈,一只消防栓和一卷软管。消防队长问:“假设货栈起火,您怎么办?”数学家回答:“我把消防栓接到软管上,打开水龙,把火浇灭。” 消防队长说:“完全正确!最后一个问题:假设您走进小巷,而货栈没有起火,您怎么办?”数学家疑惑地思索了半天,终于答道:“我就把货栈点着。” 消防队长大叫起来:“什么?太可怕了!您为什么要把货栈点着?” 数学家回答:“这样我就把问题化简为一个我已经解决过的问题了。”

 
    “利用已有结果”的意义是广泛的。将已证结论作为引理来搭建数学大厦是其中一方面,这里我们还看到了另外一方面:结论适用范围的扩展。在面对一些具体的新问题时,把问题的形式稍作变换,我们便可以直接套用老问题的解法,从而扩大了已有解法的适用范围。特别地,对于一个判定性问题来说,如果有一个很强大操作因子能够让每一种可能的结果取反,那么存在性验证就可以直接转化为普遍性验证。类似的例子还有很多。下课之后我便开始思考,马上就想到一个:图中从点A到点B的路径长的奇偶性。如果我有算法能判断从A到B是否存在长度为奇数的路径,那么我就能直接套用该算法验证该图中从A到B的所有路径是否都是奇数步。方法和上面的一样:在点A前面加一个超级源点A’,让A’和A相连。于是,每一条从A到B的路径都对应了一条从A’到B的路径,其中后者恰好比前者多一步。询问程序A’和B之间是否存在奇数步的路径,如果存在,表明从A到B有长为偶数的路径,否则便可说明从A到B的所有路径长度都为奇数。另一个有趣的例子是,假如我能判断一个含变量的代数式等于0是否有解,我就能判断该式子是否恒等于0。这又是怎么做的呢?不妨把原来的式子记作E,构造一个新的式子E/E – 1。那么,新的式子等于0当且仅当原式E不等于0。接下来的事情就又和刚才一样了。

    记得有一年我搞了一次NOIp普及组的模拟赛,里面有一道题是这样的:给你一个带实数边权的无向图,所有权值都大于1,然后叫你求一条从A到B的权值乘积最小的路径。只要了解Dijkstra算法原理的人都能想明白,该算法同样适用于权值乘积最小问题。但不出我所料,还是有很多人问我,为什么Dijkstra算法在这里仍然可以用?我的回答很简单。你根本不需要明白Dijkstra算法的原理你也能想到,这道题目依然可以用Dijkstra算法。只需要把所有权值全部取对数,权值乘积的问题立即转变为了权值和的问题;求出了最短路之后,再把所得结果当作指数还原回去即可。

 
 
    这学期我还选了一门叫做“古今数学思想”的通选课,那天下午是整个学期的第二节课。超越“数学问题”,站在“数学思想”的高度上,你会有一种全新的体验。在随后的两个小时中,这一点得到了完美的印证。印象最深的是课件上的一句话,短短几个字一针见血地点破了Taylor展开的真谛,让我顿时领悟到Taylor展开的真正价值,我一瞬间觉得当时学高数简直是白学了。课件上说,Taylor公式把函数展开为级数,其伟大意义就是“把不可数个数据简化为了可数个数据”。原本是一个连续统上的函数,上面记录了不可数个点的位置信息;用Taylor公式一变,只需要可数个系数就把所有东西都描述了出来,并且可以在一个宏观的角度上取得近似。牛!学了那么久的高数都没体会到这句话,做了那么多Taylor展开的题目真是全白做了!

 
    前天最牛B的收获是这门课上,老师讲到的代数基本定理的拓扑学证明。代数基本定理告诉我们,每个(次数不少于1的)复系数多项式在复数域中至少有一根。按照老师的原话,用拓扑学证明代数基本定理简单得令人难以置信。老师讲得飞快,课堂上我的确没怎么听明白,但恍惚记得《什么是数学》后面的章节里有这个东西。回去一翻,果然是一个精采绝伦的证明,命题本身的重要意义和证明过程之简洁造成了一种出人意料的华丽的不对称效果。随便写一个函数,比如

f(z) = (2+11i)z^4 + (7+3i)z^3 + (12-7i)z^2 + (-8+3i)z + (-2-i)

    想想看,对于某个r,如果我们取遍所有满足|z|=r的点,对应的f(z)将画出一个什么样的轨迹?z点的轨迹说穿了就是从某个离原点距离为r的位置上出发,绕原点一周后又回到原来的位置;由于函数f显然是一个连续函数,因此f(z)描绘的轨迹显然也应该是从某一点开始连续地运动,最后返回原位,形成一个封闭的曲线。r的大小决定了封闭曲线f(z)的大小。当|z|=0时,f(z)也就是一个点,若函数有常数项的话这个点应该异于原点;当|z|充分大时,最高次项将远远超过其它项,因此封闭曲线可以近似认为是z^n,它是一个绕原点走了n圈的圆(因为此时z^n = r^n * (cos(nθ)+i*sin(nθ)) )。

    对于一些不大不小的r,情况将介于两种极端情形之间。例如,当|z|=1时,f(z)形成了一个绕原点两圈的封闭曲线(如图蓝色曲线所示,紫色圆圈则是所有的z点)。可见,随着r的扩大,f(z)从一条内部不含原点的封闭曲线变成了一条绕原点整整n圈的曲线。但是,f(z)是一个连续函数,当r值增大时曲线也应该是连续变化,绕原点的圈数怎么会变呢?这只有一种可能:曲线在连续运动的过程中经过了原点。嘿!这就是我们要证明的结论啦!

    似乎是对数学证明有一种通感。一想到f(z)一脸无奈地耸耸肩说“没法子了,只能过原点了”时,我就会大笑起来。“滑稽的证明”、、“让人会心一笑的证明”、“简单得富有喜剧效果的证明”可能是我对证明的最高评价了。能获得这个评价的证明不多,我目前一下子能想到的如此精彩的证明只有下面这两个:

http://www.matrix67.com/blog/archives/33
http://www.matrix67.com/blog/archives/1006

24 条评论

  • gnaggnoyil

    沙发.不错.

  • gnaggnoyil

    代数基本定理我证的特别猥琐

  • NULL

    “判断一个逻辑表达式是否可满足是一个经典的NPC问题,目前除了枚举之外还没有更好的算法。”

    学习了

  • gnaggnoyil

    to LS:《clrs》里有

  • pchu

    没想懂那个 E/E – 1 有什么简便的地方?难道是那个“含变量的代数式等于0是否有解”的算法已经考虑了分母为零的情况,而不是用极限来理解问题?

    关于Taylor,我自己也悟出了这一点~是用函数在局域的可数个特征得到全局的不可数个特征~

    最后必须赞一个代数基本定理的拓扑证明~

  • NULL

    @地下室

    本菜鸟刚刚开始啃CLRS英文版还没有看到这句话

  • NULL

    从我的名字也能看出来我没看完CLRS。。
    否则我会改名叫Nil的

  • sdyy1990

    这个……半个月前我刚刚写了一下《代数基本定理的一个证明》,
    在本人blog的首页上。置顶半月了。。。
    那篇文章的开头是:

    最近受到Matrix67的影响,看《什么是数学》。
    …..
    我们熟知的代数基本定理说的是这样的:

    我记得如果含有连接的话就直接判断成spam了所以就不给连接了。

    可怜我的流量和我的adsense。。。。

    啊啊啊啊啊啊 啊啊啊啊啊

  • 严酷的魔王

    我想知道那个gif是怎么做的

  • Nex

    将图像弄成一个Graphics的List然后再Export[blah.gif,%]就行

  • 阿企

    我也选了古今数学思想,文科生,呵呵。

  • LOLO

    那個圖圖感覺像是生物細胞分裂的= =、、、、過程。。。。
    看著好難受啊

  • Ai.Freedom

    拜ls的那个pingback..

  • ak422

    就是关于二次剩余 的一个问题.在mod P 的一个循环群中(P是一个素数),其中有一半是二次剩余,一半非二次剩余.我的问题是,任意给一个数A,利用下述方法确定A为哪个数我们知道x1到xn的值,而且能确定A+x1,A+x2.,..,A+xn是否二次剩余.我的问题是,在至多多少个xi之后就能确定.A的值.其中P是一个很大的素数!

  • 新浪网友

    为什么p∧(¬p)无论如何都是假呢。。。p取真q取假不行么?

  • menie

    我是看《什么是数学》看到这个证明,恍惚觉得Matrix67写过一个类似的东西,回来读了读恍然大悟~

  • roger

    different mathworld same love

  • mengnan218

    2010年1月27日…北京大学数学科学学院雷功炎副教授,因病医治无效,不幸于2010年1月26日在北京逝世,享年69岁。

  • Ernest

    文中代数基本定理的证明选的是|z|=r,r从0到+infinity。
    其实也可以使用arg(z)=theta,theta从0到2pi。证明方法类似。

  • cervelo

    由于是通选课,所以这门课还是很照顾文科生的,即不会考具体的数学题,最难的数学也只到微积分为止

发表评论