Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 两个数的除模_Algorithm_Math - Fatal编程技术网

Algorithm 两个数的除模

Algorithm 两个数的除模,algorithm,math,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时溢出

我们知道

(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时溢出,无论您的算法是什么,如果输入是A和B,并且如果它们溢出,则您无法启动算法。重要的是告诉我们这些数字来自哪里。它们是你拥有的其他数字的总和还是乘积

对于大数字,必须使用特殊的大数字数学库。
有了这样的库,您可以只做(A/B)%P.

是的,但它不同:

(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
的函数。对于
p=prime
b^(-1)mod p=b^(p-2)mod p

编辑:

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


你不需要任何模逆。简化分数:
N或N^2+5
将被
2
3
整除。所以把它们分开,然后你就有了
(a*b)mod P

弗拉德的答案是正确的:

(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
这些操作和其他一些操作在“等效性”部分中

只是想让您知道,这不仅适用于素数
p
。第一个将适用于任何
p
。第二个将适用于定义了
b^(-1)
或的任何
p


模逆可以用

来计算,我不认为有这样的想法,但在任何情况下,你都需要对a和B进行更严格的假设:a/B必须是整数,否则你所做的没有任何意义。另一句话:a和B是整数,我看不出A/B在没有A或B溢出的情况下是如何溢出的。在模运算中不是这样。3/4==6 mod 7,因为6*4==3 model 7。他是说它们各自很大,但不是商。@Sean:只有当
3/4
表示
3*4^(-1)
时。不确定OP是否真的是这个意思。假设我正在计算(n*(n^2+5)/6)%pn可以大到10^15 thwn怎么办???只需使用bignum数学库。其他人已经为您完成了这项工作。关于编辑,问题是
N^2+5
可能会溢出,而
N
可能大到10^15(假设64位整数,128位没有问题)。但是如果
N^2+5
可以被2或3整除,那么余数
(N^2+5)%P
就不需要被整除。因此,您只能直接划分出划分
N
的部分。(N+1+1)+6然后再打开
N%6
N%6
0->((N/6)*(N/6)*(N^2+2+5)(N^2+5+5+5)(N/6)(N[2+5+5+5+5)(N/N/5)5)(P
N/code>N>N>N.2+5+5+5+5+5+5+5(N+5+5)(N,,,,<编码>,<编码>1->,(1->,,<编码>1->,(N*(N*(N*(N*(((((((N)(N)(N)(N-1)(N)(N-1)(N-1)(N-1)(N-1)(N-1)(N-1((N+1)+2))%P,
5->(N*((N-1)*)((N+1)/6)+1) %P
。但是模逆更容易。作为替代方法,您可以计算
(N*(N^2+5))%(6*P)
并将结果除以6。当然,除非
6*P
溢出,但如果
P
太大,模乘还是很麻烦的。@IVlad感谢您提供的信息。我使用的方法与您在gmp中实现Clifford cocks算法时所述的方法完全相同,但问题是mod reverse并不存在于所有pai中(a,b)的rs。例如,(402018)。你能建议一种替代方法吗。@user3250183-不太可能,那么你不能这么做。也许可以研究一下中国的余数定理,看看这是否有帮助。@IVIad不应该(a-b)mod p=(a mod p-b mod p)mod p。我在khanacademy上引用了这篇文章-