两个数字划分的模数

时间:2012-09-02 10:14:26

标签: algorithm math

我们知道

(A + B) % P = (A % P + B % P) % P
(A * B) % P = (A % P * B % P) % P

其中P是素数。

我需要计算(A / B) % P,其中A,B可能非常大并且可能会溢出。

模块化算术的这种公式是否适用于(A / B) % P(A - B) % P

如果没有,请解释正确答案是什么。

(A / B) % P = ((A % P) / (B % P)) % P

是真的吗?

我正在尝试计算(N *(N ^ 2 + 5)/ 6)%P,其中N可以大到10 ^ 15

这里A = n *(n ^ 2 + 5)肯定会溢出n = 10 ^ 15

3 个答案:

答案 0 :(得分:41)

是的,但情况有所不同:

(a - b) mod p = ((a mod p - b mod p) + p) mod p

(a / b) mod p = ((a mod p) * (b^(-1) mod p)) mod p

其中b^(-1) mod pb mod p的{​​{3}}。对于p = primeb^(-1) mod p = b^(p - 2) mod p

修改

  

(N *(N ^ 2 + 5)/ 6)%P

您不需要任何模块化反转。只需简化分数:N or N^2+5将被23整除。所以除以它们然后你有(a*b) mod P

答案 1 :(得分:4)

弗拉德的回答是正确的:

(a - b) mod p = ((a mod p - b mod p) + p) mod p
(a / b) mod p = ((a mod p) * (b^(-1) mod p)) mod p

Equivalencies 部分中的这些操作和其他一些操作outlined here

只是想让您知道这不仅适用于素数p。第一个适用于任何p。第二个适用于任何p,其中b^(-1)modular inverse已定义。

可以使用extended Euclidian algorithm

计算模逆

答案 2 :(得分:0)

无论你的算法是什么,如果输入是A和B,如果它们溢出,那么你就无法启动算法。告诉我们这些数字来自何处非常重要。它们是您拥有的其他数字的总和或产物吗?

对于大数字,您必须使用特殊的数学库来存储大数字。 How to handle arbitrarily large integers 有了这样的图书馆,你可以做(​​A / B)%P。