我们知道
(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
答案 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 p
是b
mod p
的{{3}}。对于p = prime
,b^(-1) mod p = b^(p - 2) mod p
。
修改强>
(N *(N ^ 2 + 5)/ 6)%P
您不需要任何模块化反转。只需简化分数:N or N^2+5
将被2
和3
整除。所以除以它们然后你有(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已定义。
答案 2 :(得分:0)
无论你的算法是什么,如果输入是A和B,如果它们溢出,那么你就无法启动算法。告诉我们这些数字来自何处非常重要。它们是您拥有的其他数字的总和或产物吗?
对于大数字,您必须使用特殊的数学库来存储大数字。 How to handle arbitrarily large integers 有了这样的图书馆,你可以做(A / B)%P。