Представленное выше Y + X rem Y, похоже, неверно: либо (Y + X) rem Y, либо Y + (X rem Y) дают неверные результаты. Пример: пусть Y = 3. Если X = -4, первая форма возвращает -1, если X = -3, вторая форма возвращает 3, ни одна из которых не находится в [0; 3 [.
Я использую это вместо:
% Returns the positive remainder of the division of X by Y, in [0;Y[.
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,
% since -5 =-2 * 3 + 1.
modulo(X,Y) when X > 0 ->
X rem Y;
modulo(X,Y) when X < 0 ->
K = (-X div Y)+1,
PositiveX = X + K*Y,
PositiveX rem Y;
modulo(0,_Y) ->
0.