algorithm - 计算 3 个数字模 m 的乘积

标签 algorithm math

给定整数a、b、c和m,我需要计算(a*b*c)%m,其中a、b、c和m可以大到10^18 。我知道如何计算 (a*b)%m 如下:

unsigned long long mulmod(unsigned long long a,unsigned long long b,unsigned long long c){
unsigned long long x = 0,y=a%c;
while(b > 0){
    if(b%2 == 1) {
        x = (x+y)%c;
    }
    y = (y*2)%c;
    b /= 2;
}
return x%c;

}

可以对(a*b*c)%m做这样的事情吗?

最佳答案

假设您的函数 mulmod(a, b, m) 在返回 (a * b)/m 提醒的位置工作。您可以通过 mulmod(mulmod(a, b, m), c, m)

计算 (a * b * c) % m

你可能会问为什么它会起作用?为什么(a * b * c) % m等于((a * b) % m) * c % m。可以证明如下:

Let          a * b = dm + r
             c     = em + q
Therefore,   a * b * c = (dm + r) * (em + q)
                       = (dem + dq + er)m + rq

So           (a * b * c) % m = [(de + r + q)m + rq] % m 
                             = rq % m

How about    [(a * b) % m] * c % m
We know that (a * b) % m = r
Therefore    [(a * b) % m] * c % m = [r * (em + q)] % m
                                   = (rem + rq) % m
                                   = rq % m

Hence, [(a * b) % m] * c % m and (a * b * c) % m are the same

关于algorithm - 计算 3 个数字模 m 的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20930741/

相关文章:

algorithm - 在无向连通图中,如何找到一组顶点,删除哪个图变得断开连接?

c++ - 给定一个未知长度的列表,通过仅扫描 1 次返回其中的随机项目

algorithm - 在深度优先搜索 (DFS) 和广度优先搜索 (BFS) 之间进行选择时要考虑哪些实际因素?

php - 在 PHP 中精确舍入和舍入分数的函数,有更好的方法吗?

string - 如何反转字符串的后缀树(找到它代表的字符串)

arrays - 当有无限 CAMPU 时,比较两个数组的最佳方法是什么?

algorithm - 如何计算 map 上定义区域的平均点密度?

Java:使用 `Math.sin()` 时可能会丢失精度

java - 什么是 Java 类斐波那契数列的非递归解决方案?

python - 如何在 matplotlib 中找到函数下方的区域?