理解 Trachtenberg 速算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解 Trachtenberg 速算法相关的知识,希望对你有一定的参考价值。

参考技术A 看了一宿的 Trachtenberg 速算法,终于弄明白了。不得不承认,脑力不够😪

简单地说,这是一种低空间复杂度的线性算法。也就是说,占用的心理内存很少。看破了其实很简单。我们以一个三位数×两位数为例:

对于 m 位 × n 位:

验证一下:

这里的 a 也好,b 也好,都不超过 9 。所以,其乘积也不会过百。于是,我们定义两个函数:

这样,我们只需要从低位往高位依次计算,并把进位传递到高位就可以得到一个线性算法了。

以百位 (10^2) 为例,我们需要做的就是把所有下标加起来等于 2 的「个」位,以及所有下标加起来等于 2 - 1 的「十」位,还有上一位上传来的进位,加起来。

现在,我们的任务只剩下找到一种好记的记法,记住哪些取个位、哪些取十位,就大功告成了。

而 Trachtenberg 的天才就在于,他把算式横过来写了!还可以有这种骚操作😱 竖线表示取个位,斜线表示取十位,像一个滑动窗口一样滑过被乘数:

现在,当我们回过头去看那个通用公式,会发现:其实它已经揭示了所有的秘密。我们要做的是两件事:

好吧,这其实就一件事:

也就是说,不存在什么「竖线规则」「斜线规则」,我们只需要在头脑中想象好一组配对,先计算「个位和」,再计算「十位和」(作为下一组的进位)。

Trachtenberg 实在太聪明了,并不仅仅是因为他竟然能够找到这种图形化表示方法,而在于把这套速算系统分解开来,每个部分都很简单(包括「调整计算顺序以简化计算」其实也是一种很常见的思路),但是你就是想不到。也许就像竖式乘法之于横式乘法,他的心理寄存器远大于我们吧,所以才能把这些部件组合出如此精妙的算法来。

大家要想知道更多细节,去看 wiki 吧。

经验分享Trachtenberg system(特拉亨伯格速算系统)

二战期间,俄国的数学家Jakow Trachtenberg(1888-1953)被关进纳粹集中营,在狱中,他开发出了一套心算算法,这套算法后来被命名为Trachtenberg(特拉亨伯格)速算系统。

有比较才能有差别。在对比之前先来看一下我们传统教育中是怎么计算的,以乘法为例,学校里教的是酱紫的算式:

舍得直接引用Wiki上相关介绍页面的实例, 以乘法为例,计算123456 x 789的值。

俗话说,有比较才能有差别。我们学校里教的是酱紫的算式:

技术分享

再来看看Trachtenberg是怎么来算的,计算出的值从右至左分别为:

第1位(右起,下同):先算6 x 9,取个位,得到4; 来个示意图:

技术分享

第2位:依次取9 x 5的个位,9 x 6的十位,

            8 x 6的个位,加起来:

            5 + 5 + 8 = 18

            所以第2位就是8,把十位上的1带到第3位计算;示意图如下,垂直的箭头表示取这两数乘积的个位,斜的箭头则表示取乘积的十位(下同):

技术分享

第3位:依次取9 x 4的个位,9 x 5的十位,

            8 x 5的个位,8 x 6的十位,

            7 x 6的个位,

            以及上一步的进位(1),加起来

            6 + 4 + 0 + 4 + 2 + 1 = 17

            所以第3位是7,照例将十位上的1带到下一步计算; 示意图如下:

技术分享

第4位:依次取9 x 3的个位,9 x 4的十位,

            8 x 4的个位,8 x 5的十位,

            7 x 5的个位,7 x 6的个位,

            以及上一步的进位(1),加起来:

            7 + 3 + 2 + 4 + 5 + 4 + 1 = 26

            所以第3位是6,照例将十位上的2带到下一步计算;示意图如下:

技术分享

            看出点什么来了没?我们只要每次将舍得用红线圈出的三组箭头往前移动一位,就可以知道要加哪些数。这三组箭头“可以”在计算第1位时就存在,想象一下!

            所以后面几位的计算就很简单,照这个规律来就是。

第5位:

技术分享

第6位:

技术分享

第7位:下图中,要注意的是9 x 1的十位还是要取的,只不过该位无数值,以0代替而已;

技术分享

第8位:同样,8 x 1的十位为0;

技术分享

第9位:继续把箭头组往左推一位,可发现,只要计算7 x 1的十位,由于值为0,所以第9位为0,忽略。

好了,整个运算过程介绍完了。在这个计算过程中,计算者主要做了:

  • 在纸横向列出算式;
  • 按规则从右至左算出并写下每一位数,书写位置参考上面的示意图;
  • 计算的过程很简单:会九九乘法表和简单数的相加即可;
  • 心算的负担很轻,只要存住每次的进位就行,据称,这样的储存用一只手就能搞定;

这套算法不但算起来很快,而且很简单。有兴趣的童鞋可以自行通过英文版的《The Trachtenberg Speed System of Basic Mathematics》学习,这本书是Ann Cutler和Rudolph McShane编译的,详细地介绍了Trachtenberg速算系统的使用。家有适龄孩子的童鞋,学会后可以当孩子们的老师哦!

书的原版购买链接在这里:特拉亨伯格速算法

附《The Trachtenberg Speed System of Basic Mathematics》下载地址:

链接:http://pan.baidu.com/s/1mhTSMwS 密码:z6od

以上是关于理解 Trachtenberg 速算法的主要内容,如果未能解决你的问题,请参考以下文章

特拉亨伯格(Trachtenberg)速算(转载)

经验分享Trachtenberg system(特拉亨伯格速算系统)

特拉亨伯格方法

请问,在电影《天才少女》一开始的时候,那个小女孩的父亲所提到的速算方式是啥?真的很好奇!请告诉我

深入理解遗传算法系列文章

理解RSA算法