1 (mod N) 是什么意思?

7
我正在尝试用JavaScript实现一个简单的算法。无论我查找哪里,它都要求计算1 (mod N)的代码。据我所知,对任何数字取模1(或1%N)都是1。

我错过了什么?它总是1吗?如果是,为什么不直接使用1?


2
1 取模任何数(或 1%N)都是 1,除非 N 是 1,此时结果为零。 - 500 - Internal Server Error
2
理解的关键是,在数学符号中,(mod n)适用于*表达式的两侧,即使通常只写在右侧(参见Confused about modular notations)。因此,根据@Blender的答案,表达式a ≡ 1 (mod N)应该被理解为“当系统取模N时,a ≡ 1”,或者a % N == 1 % N(或者只是a % N == 1,因为1 % N始终等于1)。 - sevko
“(mod n)适用于表达式的两侧,即使它通常只写在右侧。” - 谢谢,我终于明白我盯着的公式了。 - Matthew James Briggs
2个回答

14

这个算法可能会说类似于:

x ≡ 1 (mod N)  # x is congruent to 1 (modulo N)
(mod N)和三重等号符号表示您正在处理模算术,而不是普通算术。可以将其视为时钟的指针。在模算术中,x ≡ 1表示x1属于同一个剩余类。如果您有一个有N小时间隔的时钟,则将指针旋转1次或x次将使指针到达相同的终点位置。
对于您的特定情况,在JavaScript中,如果x永远不是负数,则x ≡ 1 (mod N)可以表示为x % N === 1 。否则,即使它应该,您的等式也不会成立:例如,-1 ≡ 1 (mod 2)(-1) % 2 === -1,尽管在模算术意义下它们是“相等的”,但并不等于1
如果您期望x为负数,则可以重新排列同余关系:
       x ≡ 1 (mod N)
⇒  x - 10 (mod N)

x - 1 % N 等于 0 意味着它可以被 N 整除,因此您可以放心使用模运算符:

if ((x - 1) % N === 0) {
    ...
}

3
澄清一下: x ≡ 1 (mod N) 的意思其实是 x % N == 1 % N,因为假设 N 不等于1,则 1 % N == 1。这个式子可以简化成 x % N == 1 - sevko

1
取模(%)运算符的工作原理在ECMA-262 §11.5.3中有定义。有一些怪癖,ECMAScript取模运算符接受浮点数和整数:
对于整数:
1 % -Infinity returns 1
...
1 % -2 returns 1
1 % -1 returns 0
1 %  0 returns NaN
1 %  1 returns 0
1 %  2 returns 1
...
1 % Infinity returns 1

对于浮点数,

1 % -1.1 returns 1
1 %  0.1 returns 0.09999999999999995
1 %  0.6 returns 0.4
1 %  0.5 returns 0
1 %  0.4 returns 0.19999999999999996
1 %  0.9 returns 0.09999999999999998
1 %  1.1 returns 1

因此,如果没有上下文来解释模运算符的应用方式,那么很难确定为什么要使用它。最好的方法是查看代码文档,但我想这可能不可行。

其中一种用途是,在期望整数的情况下,将0和1评估为false,将其他所有值评估为true,例如:

if (1 % n) {
  // do this if n is something other than 0 or 1
}

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