如何计算模数除法

use*_*394 3 c algorithm

在找到除法模数时,我被困在一个程序中.

比方说我有:

((a*b*c)/(d*e)) % n
Run Code Online (Sandbox Code Playgroud)

现在,我不能简单地计算表达式然后将其模数为n,因为乘法和除法在循环中进行,并且该值足够大,即使在long long中也不适合.

正如评论中所阐明的那样,n可以被认为是素数.

我发现,对于乘法,我可以很容易地将它计算为:

((a%n*b%n)%n*c%n)%n
Run Code Online (Sandbox Code Playgroud)

但是无法理解如何计算除法部分.

我面临的问题是一个简单的例子:

((7*3*5)/(5*3)) % 11 
Run Code Online (Sandbox Code Playgroud)

上面表达式的值为7

但如果我计算乘法,模数,它将是:

((7%11)*(3%11))%11 = 10
((10%11)*(5%11))%11 = 6
Run Code Online (Sandbox Code Playgroud)

现在我剩下6/15,我无法生成正确的答案.

有人能帮助我吗 请通过上面的例子让我理解逻辑.

jxh*_*jxh 5

由于11是素数,Z 11是场.因为15 % 114,1/15等于3(从3 * 4 % 111开始).因此,6/156 * 3其为7模11.

在你的问题下面的评论中,你澄清了模数永远是一个素数.

要有效地生成乘法逆的表,您可以提高2到连续的幂以查看它生成的值.注意,在字段Z p中,其中p是奇素数,2 p-1 = 1.因此,对于Z 11:

 2^1 = 2
 2^2 = 4
 2^3 = 8
 2^4 = 5
 2^5 = 10
 2^6 = 9
 2^7 = 7
 2^8 = 3
 2^9 = 6
Run Code Online (Sandbox Code Playgroud)

因此5(2 4)的乘法逆是2 6(即9).

所以,你可以像这样生成上面的表:

power_of_2[0] = 1;
for (int i = 1; i < n; ++i) {
    power_of_2[i] = (2*power_of_2[i-1]) % n;
}
Run Code Online (Sandbox Code Playgroud)

乘法逆表可以这样计算:

mult_inverse[1] = 1;
for (int i = 1; i < n; ++i) {
    mult_inverse[power_of_2[i]] = power_of_2[n-1-i];
}
Run Code Online (Sandbox Code Playgroud)