@code{(require 'modular)} @ftindex modular @defun mod x1 x2 @defunx rem x1 x2 These procedures implement the Common-Lisp functions of the same names. The real number @var{x2} must be non-zero. @code{mod} returns @code{(- @var{x1} (* @var{x2} (floor (/ @var{x1} @var{x2}))))}. @code{rem} returns @code{(- @var{x1} (* @var{x2} (truncate (/ @var{x1} @var{x2}))))}. If @var{x1} and @var{x2} are integers, then @code{mod} behaves like @code{modulo} and @code{rem} behaves like @code{remainder}. @format @t{(mod -90 360) @result{} 270 (rem -90 180) @result{} -90 (mod 540 360) @result{} 180 (rem 540 360) @result{} 180 (mod (* 5/2 pi) (* 2 pi)) @result{} 1.5707963267948965 (rem (* -5/2 pi) (* 2 pi)) @result{} -1.5707963267948965 } @end format @end defun @defun extended-euclid n1 n2 Returns a list of 3 integers @code{(d x y)} such that d = gcd(@var{n1}, @var{n2}) = @var{n1} * x + @var{n2} * y. @end defun @defun symmetric:modulus n Returns @code{(quotient (+ -1 n) -2)} for positive odd integer @var{n}. @end defun @defun modulus->integer modulus Returns the non-negative integer characteristic of the ring formed when @var{modulus} is used with @code{modular:} procedures. @end defun @defun modular:normalize modulus n Returns the integer @code{(modulo @var{n} (modulus->integer @var{modulus}))} in the representation specified by @var{modulus}. @end defun @noindent The rest of these functions assume normalized arguments; That is, the arguments are constrained by the following table: @noindent For all of these functions, if the first argument (@var{modulus}) is: @table @code @item positive? Work as before. The result is between 0 and @var{modulus}. @item zero? The arguments are treated as integers. An integer is returned. @item negative? The arguments and result are treated as members of the integers modulo @code{(+ 1 (* -2 @var{modulus}))}, but with @dfn{symmetric} @cindex symmetric representation; i.e. @code{(<= (- @var{modulus}) @var{n} @var{modulus})}. @end table @noindent If all the arguments are fixnums the computation will use only fixnums. @defun modular:invertable? modulus k Returns @code{#t} if there exists an integer n such that @var{k} * n @equiv{} 1 mod @var{modulus}, and @code{#f} otherwise. @end defun @defun modular:invert modulus n2 Returns an integer n such that 1 = (n * @var{n2}) mod @var{modulus}. If @var{n2} has no inverse mod @var{modulus} an error is signaled. @end defun @defun modular:negate modulus n2 Returns (@minus{}@var{n2}) mod @var{modulus}. @end defun @defun modular:+ modulus n2 n3 Returns (@var{n2} + @var{n3}) mod @var{modulus}. @end defun @defun modular:- modulus n2 n3 Returns (@var{n2} @minus{} @var{n3}) mod @var{modulus}. @end defun @defun modular:* modulus n2 n3 Returns (@var{n2} * @var{n3}) mod @var{modulus}. The Scheme code for @code{modular:*} with negative @var{modulus} is not completed for fixnum-only implementations. @end defun @defun modular:expt modulus n2 n3 Returns (@var{n2} ^ @var{n3}) mod @var{modulus}. @end defun