负数的模运算

4
考虑以下表达式:

(a - b) mod N

以下哪个与上面的表达式等价?
1) ((a mod N) + (-b mod N)) mod N

2) ((a mod N) - (b mod N)) mod N

此外,(-b mod N)如何计算?也就是说,如何计算负数的模数?
谢谢。

我投票关闭此问题,因为它涉及数学而非编程。 - Pang
3个回答

5
我不想让您为一些复杂的数学概念烦恼,所以我会尽量简单地解释。 当我们说a=b(mod c)时,我们只是在说a-b是c的倍数。 这意味着当我们想知道a模c的值时,说它等于a或a-c或a+c或a+1000*c都是正确的。 因此,您的两个公式是有效的。
但是,您想知道计算机给出的答案,对吗? 好的,这取决于您使用的语言。 例如,在Java中,a mod b具有a的符号,并且其绝对值严格小于b。这意味着对于a=7,b=3和N=5,(a-b)%N=4,但您的两个表达式将返回-1。
如果您想使用模运算进行算术运算,我建议您创建自己的mod函数,以便它始终给出正整数。这样,您的两个表达式将始终等于原始表达式。
以下是伪代码示例:
function mod (int a, int N)
  return (a%N+N)%N


0
while(N < 0)
{
    N= N+MOD;
}

或者,
这个也可以用,

int mod(num ,modValue)
{
    return ( modValue- ( (-num) % modValue) );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接