模数运算(a * b / e)%m?

时间:2014-11-11 18:48:46

标签: algorithm math modular-arithmetic mathematical-expressions

是否可以使用模块化表达式:

((a*b)/e)%m

例如:

(a*b*c)%m = ((a%m)*(b%m)*(c%m))%m

2 个答案:

答案 0 :(得分:2)

在使用模运算时,不必进行除法,而必须乘以模数逆。例如,要除以 e ,您将乘以模幂逆 c ,其中 c × e ≡1 (mod m )。您可以通过以下算法计算 x (mod m )的模逆:

function inverse(x, m)
    a, b, u = 0, m, 1
    while x > 0
        q = b // x # integer division
        x, a, b, u = b % x, u, x, a - q * u
    if b == 1 return a % m
    error "must be coprime"

因此,对于您的表达式((a*b)/e)%m,您将计算(a * b * inverse(e,m)) % m

答案 1 :(得分:1)

这取决于你对分工的意义;例如

a = 1
b = 1
e = 3
m = 7

您期望的结果是什么?通过常规算术,1/3是0,如果它是你在这种情况下所寻找的那么一般没有捷径(但是如果已知a*b,你可以交换除法乘以和移位小得多。)

除法x/y的另一个选项是在模数运算中查找乘以y给出x的数字(而1/3的含义为5因为在考虑模7时,5*3是1。如果这是您要查找的内容而不是除以e,您可以乘以e的模数倒数,即乘以e的数字得到1(mod {{1} }})。