美文网首页
俄罗斯农民乘法

俄罗斯农民乘法

作者: 东方胖 | 来源:发表于2022-11-12 12:11 被阅读0次

也称为快速乘法

将被乘数除以2,乘数乘以2,如果被乘数除以2 有余数,则将乘数累加到结果中。

我们使用一个例子来逐步展开来看看这个过程。
计算 78 × 57

第一步,将 78 确定为被乘数,57 确定为乘数,这个顺序可以随意;
累计结果是 sum, a = 78, b = 57, 列表表示计算过程:

a b 余数 sum
78 57 0 0
39 114 1 114
19 228 1 342
9 456 1 798
4 912 0 798
2 1824 0 798
1 3648 1 4446

实际上,上面的乘法原理可以表示成
78 = 64 + 8 + 4 + 2 = 2^6 + 2^3 + 2^2 + 2^1
78 × 57 = (2^6 + 2^3 + 2^2 + 2^1) * 57 = 57 << 6 + 57 << 3 + 57 << 2 + 57 << 1

任何正整数可以分解成这样:
a = 2^{i_1} + 2^{i_2} + ... + 2^{i_k}
于是 a × b 可以表示这样:
b( 2^{i_1} + 2^{i_2} + ... + 2^{i_k})
对每个 2^{i_k}b 项,相当于将 b 左移 i_k 位。
因此俄罗斯农民算法的本质是二进制拆分,然后将有 1 的 位进行累计
上面的表的除2取余的过程,实际上就是二进制拆分的过程。

写成 C++ 程序

int multiply(int a, int b) {
    int s = 0;
    while (a >= 1) {
         if (a % 2) {
            s += b;
            // s %= M 如果要取模在这里增加模运算
        } 
        a >>= 1;
        b <<= 1;
    }
    return s;
}

这个算法由于使用了移位运算,速度非常快。应用场景用于移位取模,两数相乘非常大,超过数据类型的表示范围,但是取模之后还在范围内,那么可以用这个算法对累计和每次取模,可以快速计算出一个大数对某个数的模运算的结果。

不要用这个算法代替乘法运算符 例如用C++ 重载的特性取代,没有什么性能优化,也容易产生数据溢出和截断的 bug

相关文章

  • 俄罗斯农民乘法

    也称为快速乘法 将被乘数除以2,乘数乘以2,如果被乘数除以2 有余数,则将乘数累加到结果中。 我们使用一个例子来逐...

  • 面试题64 1+2+....+n.md

    递归 先写使用if的 然后使用&&的特性进行替换 快速乘 俄罗斯农民乘法

  • 快速乘(俄罗斯农民乘法)

    算法原理 先看看我们笔算乘法是怎么计算的: 这个过程可以用公式表达为: 根据这个原理,我们把第二个乘数换成二进制:...

  • Alyssa的阅读笔记|在一个黑白颠倒的时代,人们怎样度过漫漫长

    奥兰多.费吉斯教授,任教于英国伦敦大学伯贝克学院。 主要研究俄罗斯历史及文化。代表作:按时间顺序,《农民俄罗斯内战...

  • 乘法

    埃及乘法 铺地锦 画线乘法 格子乘法‘

  • 2020-10-30,乘法分配律的课前思考

    乘法分配律的课前思考 乘法分配律无论从形式还是内涵理解上,较之于乘法交换律,乘法结合律都难。因为乘法交换律、乘法结...

  • 神奇的乘法(二)

    乘法的种类已经多到计数困难了。 第六种乘法 难产的乘法:复数的乘法 因为复数出生的时候,难产,所以,这种乘法难产。...

  • 二年级上册北师大数学知识点复习 (二)

    认识和乘法口诀 (1)认识乘法算式并理解乘法的意义: 认识:乘数╳乘数=积 意义:表示几个相同加数相加的和。 乘法...

  • 定点数的原码补码乘法

    定点乘法运算之原码一位乘法 定点乘法运算之补码一位乘法 完整参考:http://blog.csdn.net/kai...

  • 孩子错题汇集

    孩子错题汇集 近期在教“表内乘法”,很多孩子“乘法口诀表”能背诵下来,能做对乘法计算...

网友评论

      本文标题:俄罗斯农民乘法

      本文链接:https://www.haomeiwen.com/subject/yfaxxdtx.html