6

我正在尝试在 JavaScript 中实现一个简单的算法。无论我在哪里看,它都需要代码来解决1 (mod N)。据我所知,1 模任何(或1%N)是 1。

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

4

2 回答 2

12

该算法可能会这样说:

x ≡ 1 (mod N)  # x is congruent to 1 (modulo N)

(mod N)三等号表示您正在使用模算术,而不是普通算术。把它想象成时钟的指针。在模算术中,x ≡ 1意味着x1属于同一个剩余类。如果您有一个带有N小时刻度的时钟,转动指针1时间或x时间将使指针到达相同的结束位置。

对于您的特定情况,x ≡ 1 (mod N)可以x % N === 1在 JavaScript中表示if xis never negative。否则,即使应该相等,您的相等也不会成立:例如,-1 ≡ 1 (mod 2)但是(-1) % 2 === -11即使它们在模算术意义上“相等”也不等于。

如果你期望x是负数,你可以重新排列同余关系:

       x ≡ 1 (mod N)
⇒  x - 1 ≡ 0 (mod N)

x - 1一致0意味着它N本身可以整除,因此您可以安全地使用模运算符:

if ((x - 1) % N === 0) {
    ...
}
于 2013-04-04T00:59:44.220 回答
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
}
于 2013-04-04T02:24:38.463 回答