This is an explanation I gave to a student in class today of how the modulus operator behaves in Ruby. As I was writing the explanation down, it all became quite clear to me. I only had a tentative grasp on this concept until trying to explain it. That’s a good feeling when your helping another to understand something gives you clarity on the subject.
Given (-n % x) or (n % -x), the RHS (right hand side) of the modulus operation must be multiplied by the negative integer closest to 0 that will get it past the number on the LHS (left hand side). Then, the result is the difference between this number and the LHS. e.g.:
-7 % 3 # result is 2 # climbing (positive) from -9 (3 * -3) to -7 7 % -3 # result is -2 # dropping (negative) from 9 (-3 * -3) to 7
Of course, when the polarity is the same on both sides, such as (n % x) or (-n % -x), you just multiply the RHS times the positive integer that gets you the closest to the RHS without going past it then the result is the difference between the remainder and the LHS. e.g.:
7 % 3 # result is 1 # climbing (positive) from 6 (3 * 2) to 7 -7 % -3 # result is -1 # dropping (negative) from -6 (-3 * 2) to -7
It might help to note that in Ruby, the RHS always dictates the polarity of the result.