📜  恶毒的数学家 |自然语言编程

📅  最后修改于: 2021-10-19 07:58:04             🧑  作者: Mango

很久很久以前,在我七年级的时候,一位演讲嘉宾来到我们的数学课。听到他讲话我们都很兴奋,但我有点难过,因为我的朋友芝诺在演讲开始前被拘留了。没有人知道为什么。无论如何,演讲嘉宾的名字是格奥尔格先生。他首先问全班是否认为有 (a) 更多奇数,或 (b) 更多偶数,或 (c) 两者加在一起更多。我们都说,“两者加在一起。”

就在这时,格奥尔格先生的脸变得非常红,喊道:“不。不!不!”然后他转身开始在黑板上乱涂乱画,一直自言自语地念叨着希伯来字母。我记得最清楚的是,这是他写的(在我们内置的 WYSIWYG 页面编辑器中重新绘制):

似乎所有的文字让他平静了一些,他转身回到班级,轻声而严厉地说:“我希望你们这些小白痴现在能看出你错了。偶数的个数,奇数的个数,加在一起的个数都是一样的!”

就在那时,我的同桌利奥波德(我们班最聪明的孩子)悄悄对我说:“我不买。我觉得这家伙疯了。”我让他闭嘴,因为乔治先生又在黑板上喃喃自语,我想听听他在说什么。但是利奥波德说:“小心点,朋友。我怀疑这个人不仅仅是一个数学家,还是一个恶毒的数学家,一个年轻人的腐化者。”

这次乔治先生写了这样的东西:

格奥尔格先生写完之后,利奥波德看了看黑板,然后低声对我说:“我不知道这个骗子说的是哲学还是神学,但我很确定那里没有数学。”但现在乔治先生找到了一个标准,并用它在黑板上画了非常漂亮和精确的图片。像这样的事情,如果我没记错的话,我认为这很有意义:

我刚抄完,利奥波德小声说:“让他画一个三角形,两个短边都只有一个单位长。”为了让利奥波德停止窃窃私语,我举起手提出了问题。但是,乔治先生没有画我要的图画,而是擦掉了黑板,画了一个三角形,边标记为 a、b 和 c。然后他开始在黑板上写数学公式,一边咕哝着对我来说听起来像希腊语的名字。

然后他拿起一根棍子在黑板上敲击,向我们展示了直角三角形长边的长度如何等于另外两条边的平方和的平方根,并“证明”他是通过让 a=3 和 b=4 并使用他的公式计算 c=5 是正确的。然后他哼了一声,说道:“现在我来回答那个小混蛋的问题。”所以他让 a=1 和 b=1 并将数字代入他的公式。然后他跪下来开始写c的值。这是一个很长的数字,他脑子里花了好长时间才算出来。前排的莎莉问他从哪里得到这些数字,他停下来回答说:“这显然是你无法理解的技术,小女孩。也许你应该上美术课。”

然后利奥波德再次俯身对我耳语,但我说,“如果你有问题,利奥,问,而不是我。”所以他做到了。不等被叫到,他就喊道:“你真的要我们相信一个 3-4-5 直角三角形的边长都是整数,精确的(以某种度量单位),并且很容易计算? ;但一个直角三角形,其另一侧是一个单元长,长边只能由不同种类的数量的总共表示?一个既不精确又很难计算的数字?这就是你这里卖的?”格奥尔格先生犹豫了一下,我们的老师填补了沉默,说道:“利奥波德,你现在将和芝诺一起被拘留。”但是在出去的路上,利奥转身对着班级喊道:“善良的上帝创造了整数;其他都是menshenwerk!”

那天我脑子里发生了两件事。首先,我开始怀疑在整个数学式的shebang中有一些阴暗的诡计,无论它看起来多么流行和有用。其次,我开始梦想有一天可能会发现对此类问题的不同理解方式。所以我获得了数学学位(主要是闭嘴)……

……让重要的事情在我的脑子里炖了几十年。我最近发现还有我的同类,比如诺曼大师,他写了这本关于这个主题的书:

你可以在这里购买那本书。

但是当谈到在我们的纯整数纯英语编程语言中处理三角函数时,我仍然在寻找更简单的东西。我现在将描述我们采取了哪些步骤,我承认,这只是朝着更自然、更合理的数学迈出的一小步。

我们首先从非数学家那里借用了一些想法,比如旧时的屋顶工和古代探险家。我们从屋顶工那里得到了一个想法,角度可以用“上升超过运行”的术语(而不是度数)来表达;我们从探险家那里得到了比数学世界臭名昭著的“单位圆”更自然的想法:指南针。这是我们的 Osmosian 指南针的图片:

请注意,零在顶部,而不是右侧,航向沿顺时针方向增加,并且整个过程是 384,而不是 360 度。如果您好奇,这是绘制该图像的纯整数纯英语例程:

To draw the compass: \ note circle illusion in the center
Start fresh.
Center a box 6-1/2 inches by 6-1/2 inches in the work area.
Wipe the box with the tan color (left to right).
Write "X" with the black pen in the middle of the box.
Put 0 into a count.
Loop.
If the user clicks on the choices, break.
Start in the middle of the work area. Move 1/4 inch.
If the count is even, draw a long fancy arrow 1-3/4 inches long with the brown pen.
If the count is odd, draw a short fancy arrow 1 inch long with the black pen.
Turn right 1/16 of the way.
Refresh the screen.
Wait for 10 grains of sand to fall.
Add 1 to the count. If the count is less than 16, repeat.
Start in the center of the box facing north minus 48 points.
Write "000...024...048...072...096...120...144...168...192...216...240...264...288...312...336...360..." with the black pen 2-1/4 inches from the box's center.
Write "0/0.........1/8.........1/4.........3/8.........1/2.........5/8.........3/4.........7/8........." with the brown pen 2-1/2 inches from the box's center.
Write ".N....NNE...N.E...ENE....E....ESE...S.E...SSE....S....SSW...S.W...WSW....W....WNW...N.W...NNW..." with the black pen 2-3/4 inches from the box's center.
Refresh the screen.

现在让我们画一些三角形。这是一个简单的 3-4-5 三角形,屏幕中心用红点标记……

……这是绘制它的例程:

To run:
Start up.
Clear the screen to the lightest gray color.
Use the fat black pen.
Start in the center of the screen facing west.
Stroke a line 3 inches long.
Turn right. Stroke another line 4 inches long.
Get a rise/run given the pen's current spot and the screen's center.
Stroke a third line given the rise/run.
Draw a dot 1/16 inch wide at the screen's center with the red color.
Refresh the screen.
Wait for the escape key.
Shut down.

此例程中的关键节点发生在我们绘制了 3 英寸水平线和 4 英寸垂直线之后。那时我们正坐在三角形的最上面,面朝北。为了回到屏幕的中心,我们需要做两件事。数学家们会说:“你当然知道。您需要知道要转多远(一个角度)以及下一次划水应该是多长时间。但是,我们不想说,有两个原因:第一,因为它伤害了我们的头脑要弄清楚我们到底需要什么样的角度,其次是因为它可能很难(甚至不可能)找出确切的行程长度使用数学技巧。 “如果很难,那就错了,”是我们 Osmosians 的座右铭。

所以回到我们三角形的第三笔画。我们究竟在哪里?我们在中心以北 4 英寸(即上升)和中心以西 3 英寸(即跑道)。这就是我们的确切位置。我们想往哪个方向发展?显然,我们希望以最短的路线向南走 4 英寸,向东走 3 英寸。我们到底想走多远?相同的答案:南 4 英寸,东 3 英寸。线条的角度和线条的长度都可以用相同的、仅限整数的术语来描述,这难道不奇怪吗?请注意,这不仅适用于“数学家友好”的 3-4-5 三角形,而且适用于所有三角形。所以我们需要做的就是计算上升和运行,这只是屏幕上两个点之间的差异……

To get a rise/run given a spot and another spot:
Put the spot minus the other spot into the rise/run.

……然后我们根据那个上升/运行抚摸第三行:

Stroke a third line given the rise/run.

在最底层,我们有 Bresenham 的仅整数线绘制算法,所以我们在绘制线时不会作弊。到现在为止还挺好。

现在让我们看看它是否真的适用于那个麻烦的“单位三角形”——一个短边只有一个单位长的直角三角形。绘制它的例程与上面相同,只是前两个笔画只有一英寸长:

To run:
Start up.
Clear the screen to the lightest gray color.
Use the fat black pen.
Start in the center of the screen facing west.
Stroke a line 1 inches long.
Turn right. Stroke another line 1 inches long.
Get a rise/run given the pen's current spot and the screen's center.
Stroke a third line given the rise/run.
Draw a dot 1/16 inch wide at the screen's center with the red color.
Refresh the screen.
Wait for the escape key.
Shut down.

这是输出:

呜呼!有用!这些边的确切长度是多少?让我看看……第一边的上升正好是0,而运行正好是-1;第二边的上升恰好为1,游程恰好为 0。第三边的上升恰好为-1,游程恰好为1。所有整数,所有精确,都易于计算。

但是,如果三角形不是直角三角形,或者向任意方向旋转,它会起作用吗?让我们来看看。这是一个在八个不同旋转处绘制八个不等边三角形的例程:

To run:
Start up.
Clear the screen to the lightest gray color.
Start in the center of the screen facing west.
Use the fat black pen.
Loop.
Stroke a line 3 inches long.
Turn right 1/8 of the way around.
Stroke another line 2 inches long.
Get a rise/run given the pen's current spot and the screen's center.
Stroke a third line given the rise/run.
Turn right 1/4 of the way around.
Add 1 to a count. If the count is 8, break.
Repeat.
Draw a dot 1/16 inch wide on the screen's center with the red pen.
Refresh the screen.
Wait for the escape key.
Shut down.

这是输出:

Baby 迈向更自然、更理性的数学。大婴儿的步骤。用简单的英语。