Blogs

十个小算法,第1部分:

杰森萨赫斯2015年3月21日6评论

这个博客需要一些短篇小说来平衡长期的帖子,所以我以为我’d覆盖一些算法我’多年来使用过。如 欧几里德算法扩展欧几里德算法牛顿’s method —除了你应该知道的那些,如果没有,你应该锁在一个房间,直到你这样做。总有一天,其中一个可以挽救你的生活。好吧,你永远不知道。


本系列的其他文章:


俄罗斯农民乘法 是其中一个不准确和愚蠢的名字之一—无论如何,谁真的想成为俄罗斯农民?它’S一种用于乘法的技术— well, that part’s accurate —在埃及近四千年前,这显然是已知的,并且显然是前两个录制的算法之一,发现 莎草纸莎草。 (不知何故,它已经归功于俄罗斯农民,虽然当我试图寻找这个名字的方式时,但没有任何重要的东西出现:每个人似乎都断言俄罗斯农民使用这种方法,而无需引用任何声誉良好的来源。您’D认为,在19世纪曾经访问过俄罗斯的人,并指出这一事实将为后期写下来。)

本文以PDF格式提供,便于打印

无论如何,这里’它是如何工作的。假设您想要乘以13和27.您在两列头部的纸上写下这些数字。在它下面的每一行上,在一列中,您将在一列中花费一半,舍入,以及在另一列中,您可以在前面的数字加倍。这里’s an example:

2713
546
1083
2161

现在,您在Doublebly列中添加了对应于Allging列中的奇数的所有数字。在这里,我们’d添加27,108和216获得351,这是正确的答案。在Python中,您可以这样实现:

def rpmul(a,b):
    result = 0
    while b != 0:
        if b & 1:
            result += a
        b >>= 1
        a <<= 1
    return result

rpmul(13,27)

很棒,它有效。所以呢?

(提示迈尔斯迈尔斯再次!)

算术的算法起初可能似乎不是很重要。我的意思是,你什么时候用过学校以外的长分?那’什么计算器。但我们忘记了在大约1970年之前,电子计算器基本上不适应。这 第一个电子计算器成本低于1970年和1971年的\ $ 1000 从日本制造商开始,从 佳能Pocketronic.。佳能击败了一些竞争对手的市场,包括 Busicom.,其中,为了进入手持式计算器业务,签约英特尔设计第一微处理器,四位 英特尔4004。 (Busicom放弃了使用该芯片的独家权利以获得更好的定价。否则我们可能正在使用标有贴纸的计算机 里面的Busicom™ 和 that just doesn’t对此有同样的戒指。)

因此,如果您在引入手持式计算器之前是工程师或会计师或商人,并且没有’T有奢侈品访问昂贵的计算机或桌面计算器,您将使用其他方法,如a 机械计算器,或者 幻灯片规则或者 算盘或铅笔和纸张。如此五十年前,算术算法 重要的。现在我们很少必须写入软件来乘以数量;今天’S的处理器在他们的alu中有硬件逻辑,以乘以浮点数和“small”(64位和下方)数字。乘法 任意精度 (aka “bignums”)本身是整个艺术,并根据数量大小使用各种奥术技术,但是在库中可用。现在,像Python这样的软件很容易获得,我不可用’不得不知道如何乘法,我可以做到这一点:

123456789001002003004 * 987654321002003004

了解俄罗斯农民方法的重要观点’t真的要执行乘法本身。它’因为相同的方法可以用于其他类型的计算以乘法是同性的。数学家喜欢 同构,并且在抽象的代数中有很多有奇怪的名字 领域戒指团体mon。我永远无法直接将这些东西保持在一起,每当我需要知道哪个时,我都要看看它们。在任何情况下,普通算术都只是一种计算,并且在离散数学中存在其他人,其与乘法,划分,添加,减法和指数相同的行为。这些包括:

  • 多项式算术
  • 模块化算术
  • Galois Field算术

如果我想乘以两个元素 商戒指 \(gf(2)/ p(x)\),我也可以使用俄语农民方法。这是多项式算术的形式,其中所有系数是0或1,并且在模2上操作系数,并且多项式本身在Modulo一些特征多项式\(P(x)\)上操作。这听起来很疯狂,但比你更常见’d思考,是一个基本的一部分 CRCS.线性反馈移位寄存器,我可以在未来的文章中详细介绍一下。俄语农民乘法中的减半和加倍操作是分割和乘法的同构和乘法,添加是同构加成模2,并且奇数/甚至变为检查系数是否为1或0。

整数指数也是,在某种程度上是同构乘法,因为我们可以使用重复的平方和乘法而不是重复加倍并添加:

def rpexp(a,b):
    result = 1
    while b != 0:
        if b & 1:
            result *= a
        b >>= 1
        a *= a
    return result

print rpexp(3,13)
print 3 ** 13
1594323
1594323

乘法\(gf(2)\)这样的工作原理:

def rpmul_gf2(a,b):
    result = 0
    while b != 0:
        if b & 1:
            result ^= a
        b >>= 1
        a <<= 1
    return result

让’通过并排查看这些算法:

def rpmul(a,b):
    result = 0
    while b != 0:
        if b & 1:
            result += a
        b >>= 1
        a <<= 1
    return result
def rpmul_gf2(a,b):
    result = 0
    while b != 0:
        if b & 1:
            result ^= a
        b >>= 1
        a <<= 1
    return result
def rpexp(a,b):
    result = 1
    while b != 0:
        if b & 1:
            result *= a
        b >>= 1
        a *= a
    return result

他们’重新获得相同的方法,只需略有不同的操作。

所以下次你需要乘以(或指数!)整数,你可以取出你的电脑或计算器并打击数字…或者你可以像它一样派对’S 1899,像俄罗斯农民(和古埃及人)一样做到了。


©2015年杰森M. Sachs,保留所有权利。


[]
评论 迈克斯。2015年3月23日
这真的很酷,谢谢。我从来没有听过这个术语“”之前,我不熟悉这种算法。整洁的。
[]
评论 paddy31182015年7月24日
Rosetta Code有一个任务,算法在100左右100个编程语言中实现,并正确标题为埃塞俄比亚乘法:

http://rosettacode.org/wiki/Ethiopian_Multiplication
[]
评论 Severin6.2015年3月24日
>不知何故,它已归功于俄罗斯农民
它被称为俄罗斯农民乘法,没有任何裁判在非常受欢迎的俄罗斯科学雅科夫·佩尔曼非常受欢迎的俄罗斯科学埃及。书被称为“乐趣的数学”,一些链接到亚马逊 http://www.amazon.com/s/ref= dp_byline_sr_book_1?IE = UTF8&现场作者= Yakov + Perelman&search-alias=books&text=Yakov+Perelman&sort=relevancerank
[]
评论 DGRAPOV.2015年7月24日
谢谢你的帖子。激励我编写乘法的R版本。

http://rosettacode.org/wiki/Ethiopian_multiplication#r:_without_tutor.
[]
评论 Wheels24.2015年7月26日
我在运行时使用此算法以实现Microchip PIC的语言,实现16-和32位整数的乘法,以及32位浮点数。
[]
评论 ksashtekar.2019年2月18日

谢谢!

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录