前言
能主动拿起这本书,说明你是一个喜欢数学的人。当别人还在为数学考试焦头烂额的时候,你已经像我一样,在享受思考带来的乐趣了。
这本书收集了我在日常的学习以及上网时遇到的许多有趣的数学问题。别看这些问题很简单,研究起来却别有洞天。在不断发出“柳暗花明又一村”的感叹中,也许你就会不知不觉地来到数学研究的前沿。
本书从两个简单的问题讲起,带你体会数学中“形”的直观与“数”的严谨。我国数学家华罗庚曾经说过:“数缺形时少直观,形少数时难入微;数形结合百般好,隔离分家万事休。”本书第一章研究一道关于碰撞的物理问题,它的巧妙解法体现了怎样通过“形”的方式使“数”的问题变简便。第二章介绍“超级任务”与Ross-Littlewood悖论,会涉及微积分中“一致收敛”的概念,仅通过形象思考不容易看清全貌,必须进行严谨的“数”的分析。
之后的几章,则通过深入分析几个看似简单的问题,带你领略数学中若干分支深处的风景。第三章研究在平面与球面上排列点阵(像向日葵花序那样)的问题,其探索过程主要涉及连分式的知识。第四章至第六章的几个问题都涉及概率与随机过程:第四章的“小黄鸭”问题,由二维平面与三维空间中的形象思考上升到高维空间中的严谨推理;第五章探讨“赌徒”的必胜策略,用到了随机过程中“鞅”的停时定理,以及谱分析法;第六章研究“洗牌”算法的一种错误实现中出现的神秘常数,会触及“q-Pochhammer符号”这种特殊函数。
数学与程序设计,是亲密如孪生姐妹的两个学科。在数学研究中遇到问题时,可以借助编程来获得灵感和验证结果;用数学方法研究出的结论,也能指导我们写出更短、更快、更好的程序。第三章至第六章的探索过程,都以计算机编程作为辅助手段,而第七章至第十一章,则以编程本身为研究对象。如果你正在学习算法与数据结构,这几章的内容会让你的头脑得到很好的锻炼。
本书的第七章至第九章,都取材于棋牌类游戏。第七章研究“n皇后”问题,第八章研究“24点”算式,这两章的重点都在于枚举法的优化。第九章介绍Sprague-Grundy定理:它能够快速找出一种棋类游戏的必胜策略,但它的形式匪夷所思,这一章就介绍了提出该定理的思路。第十章介绍Matlab的数据可视化函数如何因为一个bug而效率异常低下,以及我想到的并不复杂的优化方案。第十一章则是对树这种数据结构进行一番操练,让你扎实掌握树形结构的序列化方法。
本书最适合理工科的本科学生阅读。在阅读过程中,可以预习或者复习微积分、线性代数、概率论等多门数学知识,并体验用它们解决实际问题的乐趣。涉及编程的部分,使用的编程语言主要是Python和Matlab,这两种语言最能体现“简洁”的特点。
我在研究书中问题的时候,得到过多位知乎网友的帮助。比如,第五章的“赌徒必胜策略”问题,是从与知乎网友黄海潮的私信交流中提炼出来的;在求解过程中,我与常雅珣、王希、七月、张雨萌、Jack Diamond、玩得就是心跳归来、Mr woe、萧洋、Eidosper、Octolet等多位知友进行过讨论。除此之外,知友Lucas HC、张健提供了编写第六章与第九章的灵感;知友刘奔、终军弱冠、hqztrue对解决第六章、第八章的问题做出了很大的贡献。我想对所有这些网友表示衷心的感谢!
书中有些问题,尚未得到完整、优雅的解决方案;我叙述的解法,也难免有错漏之处。如果你发现了错误或者更好的解法,或者对书中的内容有疑问,欢迎通过邮箱maigoakisame@gmail.com与我联系。另外,欢迎大家去图灵社区本书主页(iTuring.cn)获取更多学习资料,以便更完整地阅读本书。
王 赟
2020年12月