我正在尝试在JavaScript中实现一个简单的算法。无论我在哪里,它都要求代码解决1 (mod N)
。据我所知,1个模数(或1%N
)是1。
我错过了什么?它总是1,如果是这样,为什么不使用1?
答案 0 :(得分:10)
算法可能会说:
x ≡ 1 (mod N) # x is congruent to 1 (modulo N)
(mod N)
和三等号表示您正在使用模运算,而不是常规算术。把它想象成一个时钟的手。在模块化算术中,x ≡ 1
表示x
和1
属于同一residue class。如果您的时钟时间为N
小时,则转动手1
时间或x
次会将指针移至相同的结束位置。
对于您的具体情况,x ≡ 1 (mod N)
可以在JavaScript 中表示为x % N === 1
,如果x
永远不会消极。否则,即使它应该等于你的平等也不会成立:例如,-1 ≡ 1 (mod 2)
但是(-1) % 2 === -1
,即使它们在模运算中“相等”,它也不等于1
感。
如果您希望x
为负数,则可以重新排列同余关系:
x ≡ 1 (mod N)
⇒ x - 1 ≡ 0 (mod N)
x - 1
与0
一致意味着它可以被N
本身整除,因此您可以安全地使用模运算符:
if ((x - 1) % N === 0) {
...
}
答案 1 :(得分:1)
模{(3)运算符如何工作在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
}