查尔斯·巴贝奇 (1791–1871) 是一位兴趣广泛的狂热数学家。他因构想计算机的想法而闻名,并独自开发了他称之为 差分机 的机器来进行串行计算。它是一台机械机器,带有一系列轴和齿轮来进行计算,输出结果是一张打印表格。我最近开始阅读他 1864 年出版的书籍《一位哲学家的生活片段》,他在书中解释了差分机是如何诞生的。
他的引擎旨在解决的问题之一与孩子们玩弹珠并将它们排列成渐进的金字塔形状的想法有关,顶行一个弹珠,第二行两个,第三行三个,依此类推。对于小金字塔,您可以简单地数弹珠来找出有多少个。但巴贝奇想要创建一个自动列表或表格,其中一列显示行数,另一列显示弹珠总数。

opensource.com
他谈到的差异首先是行数中的所有连续差异(在本例中等于 1),其次是从一行到下一行添加的弹珠数量之间的差异(也为 1)。据我所知,差分机连续地将每新行的弹珠数量添加到之前的总数中,从而创建表格。
因此,我开始在脑海中玩弹珠,可以这么说。我发现自己凌晨 5 点在床上醒来,在精神上摆弄和数弹珠。让我印象深刻的一件事是,对于六行,总数是 21,对于七行,总数是 28——两者都可以被 7 整除。对于八行或九行,总数可以被 9 整除。随着我增加行数,这种模式再次出现。所有这些都在我的脑海中(与此同时,我希望它停止,这样我就可以继续睡觉),所以它不是很系统化。
当我醒来时,我决定尝试弄清楚这是为什么,以及我是否可以预测哪些数字会显示这种现象。答案让我惊讶:事实证明,每个奇数行的弹珠数量都可以被该数字整除。
但是,我如何证明这一点呢?这是一个例子。对于七行的金字塔,首先看看底行有六个弹珠的六行金字塔。创建一些行对:第一行和第六行,第二行和第五行,第三行和第四行。对于这三对中的每一对,总和为 7;因此,这三组对的总和为 21,如果您为下一行添加 7,它仍然可以被 7 整除。

(格雷格·皮特曼,CC BY-SA 4.0)
您可以继续使用具体示例进行此操作,但目标是普遍理解这种现象。想象一些随机的偶数行 N。创建您的对,然后将 1 加到 N,2 加到 N-1,3 加到 N-2,依此类推。在每种情况下,总和都将为 N+1。这些对的数量将为 N/2,因此弹珠的总数将为 N/2*(N+1),这是一个可以被 N+1 整除的数字。为下一行添加 N+1 个弹珠也可以被 N+1 整除。

(格雷格·皮特曼,CC BY-SA 4.0)
例如,您可以说一个有 128,948 行的金字塔将总共有 8,313,857,826 个弹珠;一个有 128,949 行的金字塔将有 8,313,986,775 个弹珠,并且这两个总数都可以被 128,949 整除。
我不知道巴贝奇是否考虑过这一点,但很可能,即使他考虑过,他也会说这只是代表了乘法和除以六位数数字的数学问题,而他想要一台机器来做这种事情。他确实设想并开始着手 分析机,这也许可以完成这种运算。
如今,这对计算机来说是微不足道的工作,因此这里有一个 Python 脚本可以在您丢失弹珠之前计算弹珠数量——只需 4 行代码。
#!/usr/bin/env python
# babbage.py
"""
Using Charles Babbage's conception of a marble-counting
operation for a regular pyramid of marbles,starting with
one at the top with each successive row having one more
marble than the row above it.
Returns total number of marbles in a pyramid of any size.
"""
MarbRows = input("Enter the number of rows of marbles: ")
MarbRows = int(MarbRows)
MarbNum = int((MarbRows)*(MarbRows+1)/2)
print ("The number of marbles is "+ str(MarbNum))
这就是巴贝奇差分机与 Python 的相遇方式。
3 条评论