【发布时间】:2013-07-09 21:46:16
【问题描述】:
我在查找除法模数时卡在程序中。
比如说我有:
((a*b*c)/(d*e)) % n
现在,我不能简单地计算表达式,然后将它取模到 n,因为乘法和除法是在一个循环中进行的,并且值足够大,即使是 long long 也不能适应。
正如在 cmets 中阐明的,n 可以被认为是素数。
我发现,对于乘法,我可以很容易地计算为:
((a%n*b%n)%n*c%n)%n
但当时不明白如何计算除法部分。
我面临的问题是一个简单的例子:
((7*3*5)/(5*3)) % 11
上述表达式的值为 7
但如果我计算乘法,取模,它会是这样的:
((7%11)*(3%11))%11 = 10
((10%11)*(5%11))%11 = 6
现在我只剩下 6/15,我无法生成正确答案。
谁能帮帮我。请通过上面的例子让我明白其中的逻辑。
【问题讨论】:
-
a%n = a - (n * int(a/n))
-
使用大整数库。
-
(a/b)mod n = ((a mod n )( 1/b mod n) mod n )
-
@Randy 不能保证
b有一个逆模n。例如。b=2, n=8。那么没有整数x使得2*x % 8 == 1。 -
@iamnotmaynard 正确 - 在这种情况下,我认为 mod 是未定义的