1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
@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
|