大力出奇迹:当古代数学难题遇到现代计算机

近年来,人工智能的春风不知吹动了多少资本的浪潮,从决胜棋坛的阿尔法狗,到遍地开花的无人车,AI成为经济寒冬里熊熊燃烧的火种,不知多少投资客捧着钞票前赴后继。科幻电影中,像人类一样思考、决策、学习的强人工智能何时能问世,目前还是个未解之谜。当前市面上一切AI产品的基础,仍然是传统的电子计算机。


我们知道,计算机科学中有一个“摩尔定律”: 单位面积集成电路上可容纳的元器件的数目,大约每18个月便会增加一倍,其性能也将提升一倍。计算机指数式增长的运算能力,支撑了越来越复杂的应用场景。以棋类运动而言,上世纪末的计算机已经能战胜最优秀的人类国际象棋棋手;而随着计算机硬件的发展、运算能力的提升,比国际象棋计算量更大、场景更复杂的围棋也最终失守。

也就是说,大多数情况下,用计算机解决人类问题的标准思路,都是用计算机强大的运算能力,来强行攻克人类思维范畴里很难通过计算解决的问题。换言之,计算机擅长大力出奇迹。

当这一思路遭遇古代数学难题,又能碰撞出怎样的火花?


1、百鸡问题

今有鸡翁一,值钱伍;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只,问鸡翁、母、雏各几何?

这个问题其实是一个不定方程求整数解的问题,相当于列方程+枚举讨论。具体而言,可以设公鸡数量为x,母鸡数量为y,小鸡数量为z。有:

x + y + z = 100

5x + 3y + z/3 = 100

枚举讨论的技巧也很简单,可以先消去一个未知数,然后根据正整数性质,利用整除特性进行枚举。

显而易见计算机最擅于求解这种枚举类的问题,甚至用暴力枚举(除基本条件外,不加分析和简化)也花不了多少时间。比如从0开始枚举上述的公鸡数,最多不会超过20只,否则总价格会超出百钱;在此基础上开始枚举母鸡,母鸡最多不会超过33只,否则总价会超出百钱;然后再在已数公鸡、母鸡的基础上开始枚举小鸡,挑出精确满足百鸡、百钱的组合。

贴一下python代码与计算答案。如果你对编程或python感兴趣的话,完全可以搜索一些在线的教程来学习,这是一门十分简单、适合初学者入门的编程语言,如果有一些英语和数学基础,更能十分轻易地学会。可以看出,在0.2s时间内,该程序利用暴力枚举的手段,给出了百鸡问题的全部四组解。



2、求圆周率

中国古代对圆周率的计算有很长的历史。

早在汉初的《周髀算经》里就提到过“径一周三”的说法,给出了圆周率的近似值3。汉代张衡给出近似值3.16,而刘徽创立割圆术,“割之弥细,所失弥少,割之又割,以至于不可割,则与圆周合体而无所失矣”,我个人认为可以被当做数学领域极限及微积分的起源,最终他得到3.1416的近似值。南朝祖冲之发扬光大,不割不快,得到了3.1415926~3.1415927的近似范围,比西方国家不知早到哪里去了。

当然我们今天不用割圆术。不是不能用,而是割圆术不太容易展现计算机的运算优势,以及大力出奇迹的计算思想。我们采用一种朴素的概率方法。设想有一个正方形,边长为1。我们可以用该正方形两条相邻的边作为半径,画一个四分之一圆弧。现在想象我们往这个正方形里随机地撒豆子(天知道我们怎样保证随机,大概就是闭着眼睛抓着豆子胡乱撒吧)。假如豆子足够小,足够多,最终这个正方形里密密麻麻到处是豆子。接下来我们开始数豆子,数出所有正方形里的豆子数目,N;同时也数出,落在圆弧圈出的扇形区域里的豆子数目,n。有了这两个值,就可以用来估计π。


直观而言,n与N的比值,应当近似等于扇形(也就是四分之一圆)面积与正方形面积的比值。而在计算扇形面积的时候,显然是需要用到π值的,这里的四分之一圆面积为π/4。也就是说存在近似关系:

n : N ≈ π/4 : 1

从而可以得到,π≈4n/N。

同样编写一个python程序。可以看出,随机撒下的豆子越多,最终的模拟结果越精确。提到“模拟”,这一方法也就是大名鼎鼎的蒙特卡洛模拟,可以用来近似解决众多难以计算的数学问题。

考虑到时间问题,此处不再做更高精度的计算。



3、根号2。

毕达哥拉斯学派的理论根基是万物皆数。这里的数指的是整数,和可以用整数相除表达的分数。他们认为自然界中的一切,都可以用整数和分数来表达。

然而恰恰是学派中的一名晚辈,希帕索斯,对这个观点提出了质疑。希帕索斯正是利用到老师归纳的毕达哥拉斯定理(也就是西方人的勾股定理),提出:如果说万物皆数,那么等腰直角三角形的斜边,如何用整数或分数来表达呢?

毕达哥拉斯学派从此陷入了恐慌。一大群学者开始试图计算、测量这个斜边值,想要找到它的整数或分数表达形式,可是却怎么也求不出这个值。最终,这群人恼羞成怒,竟然把希帕索斯推入了大海。

我们现在知道,这个三角形的斜边值是一个无理数,无法用分数形式表达。假如直角边长为1的话,斜边长则称为根号二,其数值大约为1.414。那么如何计算这一数值呢?

计算机解决的方案有很多。这里采用最朴素的二分法。考虑函数f(x),要求其任一零点(也就是f(x)=0的点)附近,函数的值分别处于正负两侧。所谓二分法,简单来说,是在求解此零点时,先找到零点左、右两个端点,从这两点出发,取区间的中点,并根据零点的位置,用新得到的中点取代某一个端点,然后不断地逼近零点。


比如y = x^2 – 2在正轴的零点,显然处在1和2之间。以这两点为端点,取区间中点,为1.5,1.5的函数值为正,则接下来取1和1.5为端点……重复这个过程,直到某一步恰好求出了精确解(比如零点是个整数或分数),或者达到了精度要求(比如零点是个无理数),则停止迭代。这里就以0.00001为精度标准,用二分法求解根号2。可以看出,在0.2s,15轮二分迭代后,得到了4位精度的结果。

事实上这道题我在一次算法工程师求职的面试中遇到过。不过我当时写了一个运算效率更高的牛顿迭代法。当然,这就是另一个故事了。



今天展示了一些最基础的计算方法,旨在理解用计算机求解复杂问题的思路(当然这些问题实际上也并不复杂)。那些困扰前人数十年数百年的问题,在计算机强大的运算能力面前,会显得容易得多。这,就是计算机的核心能力。

在我个人的理解里,计算机相比于人类的最大优势,就是上述的计算能力,也就是计算速度,也就是大力出奇迹。以当前席卷互联网行业的深度学习方法为例,事实上深度学习所依赖的神经网络结构,在20世纪70年代美国的“人工智能热潮”中就已经有许许多多的雏形,只不过因为当时计算机算力的限制而没能早早登上历史舞台。而现在的各类深度学习AI算法,其实本质上也还是站在前人的肩膀上摘果子,这些年在图像、语音领域取得的一些成果,本质是仍然蹭了计算机硬件能力爆炸式提升的红利。对于算法本身,更多的仍是试探性结构设计。

在我看来,未来的人工智能之路,其实面临着重大的分歧。一条路是走现在的老路,继续堆硬件,加运算能力,期待量变到质变,也许当计算能力强大到某一个阈值的时候,弱AI与理论上的强AI就不会有太清晰的界限了。另一条就是另辟蹊径,从仿生学的角度重新寻找AI的实现方法。究竟是扬长避短,算力为王,还是革故鼎新,开天辟地呢?

我们拭目以待。

你可能感兴趣的:(大力出奇迹:当古代数学难题遇到现代计算机)