我正在尝试在 JavaScript 中实现一个简单的算法。无论我在哪里看,它都需要代码来解决1 (mod N)
。据我所知,1 模任何(或1%N
)是 1。
我错过了什么?它总是 1,如果是,为什么不直接使用 1?
我正在尝试在 JavaScript 中实现一个简单的算法。无论我在哪里看,它都需要代码来解决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 ≡ 1 (mod N)
可以x % N === 1
在 JavaScript中表示if x
is never negative。否则,即使应该相等,您的相等也不会成立:例如,-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) {
...
}
模 (%) 运算符的工作原理在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
}