chickadee » srfi-94 » modulo

moduloprocedure

These procedures implement number-theoretic (integer) division. If n1 is not an exact integer, or if n2 is not an exact non-zero integer, an error is signaled. All three procedures return exact integers. If n1/n2 is an integer:

(quotient n1 n2)                   ==> n1/n2
(remainder n1 n2)                  ==> 0
(modulo n1 n2)                     ==> 0

If n1/n2 is not an integer:

(quotient n1 n2)                   ==> n_q
(remainder n1 n2)                  ==> x_r
(modulo n1 n2)                     ==> x_m

where n_q is n1/n2 rounded towards zero, 0 < |x_r| < |n2|, 0 < |x_m| < |n2|, x_r and x_m differ from n1 by a multiple of n2, x_r has the same sign as n1, and x_m has the same sign as n2.

From this we can conclude that for integers n1 and n2 with n2 not equal to 0,

(= n1 (+ (* n2 (quotient n1 n2))
      (remainder n1 n2)))
                                  ==>  #t
(modulo 13 4)                          ==>  1
(remainder 13 4)                       ==>  1

(modulo -13 4)                         ==>  3
(remainder -13 4)                      ==>  -1

(modulo 13 -4)                         ==>  -3
(remainder 13 -4)                      ==>  1

(modulo -13 -4)                        ==>  -1
(remainder -13 -4)                     ==>  -1