Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does 1 (mod N) mean?

I am trying to implement a simple algorithm in JavaScript. Wherever I look, it calls for the code to work out 1 (mod N). As far as I can tell, 1 modulo anything (or 1%N) is 1.

What am I missing? Is it always 1, and if so, why not just use 1?

like image 875
JJJollyjim Avatar asked Apr 04 '13 00:04

JJJollyjim


2 Answers

The algorithm probably says something like:

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

The (mod N) and the triple equals sign denote that you're working with modular arithmetic, not normal arithmetic. Think of it like the hands of a clock. In modular arithmetic, x ≡ 1 means that x and 1 belong to the same residue class. If you have a clock with N hour divisions, turning the hand 1 time or x times will bring the hand to the same end position.

For your specific case, x ≡ 1 (mod N) can be represented as x % N === 1 in JavaScript if x is never negative. Otherwise, your equality will not hold even though it should: for example, -1 ≡ 1 (mod 2) but (-1) % 2 === -1, which isn't equal to 1 even though they're "equal" in the modular arithmetic sense.

If you expect x to be negative, you can just rearrange the congruence relation:

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

x - 1 being congruent to 0 means that it's divisible by N itself, so you can use the modulo operator safely:

if ((x - 1) % N === 0) {
    ...
}
like image 123
Blender Avatar answered Sep 24 '22 01:09

Blender


How the modulo (%) operator works is defined in ECMA-262 §11.5.3. There are a few quirks, the ECMAScript modulo operator accepts floats as well as integers:

For integers:

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

For floats,

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

So without the context of how the modulo operator is being applied, it's very difficult to determine why it's being used. Best of all would be documentation of the code, but I suppose that's not available.

One use is, where an integer is expected, to evaluate 0 and 1 as false and everything else as true, so:

if (1 % n) {
  // do this if n is something other than 0 or 1
}
like image 23
RobG Avatar answered Sep 23 '22 01:09

RobG