是否可以使用模块化表达式:
((a*b)/e)%m
例如:
(a*b*c)%m = ((a%m)*(b%m)*(c%m))%m
答案 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} }})。