我正在尝试用JavaScript实现一个简单的算法。无论我查找哪里,它都要求计算
1 (mod N)
的代码。据我所知,对任何数字取模1(或1%N
)都是1。
我错过了什么?它总是1吗?如果是,为什么不直接使用1?
1 (mod N)
的代码。据我所知,对任何数字取模1(或1%N
)都是1。
我错过了什么?它总是1吗?如果是,为什么不直接使用1?
这个算法可能会说类似于:
x ≡ 1 (mod N) # x is congruent to 1 (modulo N)
(mod N)
和三重等号符号表示您正在处理模算术,而不是普通算术。可以将其视为时钟的指针。在模算术中,x ≡ 1
表示x
和1
属于同一个剩余类。如果您有一个有N
小时间隔的时钟,则将指针旋转1
次或x
次将使指针到达相同的终点位置。x
永远不是负数,则x ≡ 1 (mod N)
可以表示为x % N === 1
。否则,即使它应该,您的等式也不会成立:例如,-1 ≡ 1 (mod 2)
但(-1) % 2 === -1
,尽管在模算术意义下它们是“相等的”,但并不等于1
。x
为负数,则可以重新排列同余关系: x ≡ 1 (mod N)
⇒ x - 1 ≡ 0 (mod N)
x - 1
% N
等于 0
意味着它可以被 N
整除,因此您可以放心使用模运算符:
if ((x - 1) % N === 0) {
...
}
x ≡ 1 (mod N)
的意思其实是 x % N == 1 % N
,因为假设 N
不等于1,则 1 % N == 1
。这个式子可以简化成 x % N == 1
。 - sevko1 % -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
}
(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