diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:29 -0800 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:29 -0800 |
commit | 8466d8cfa486fb30d1755c4261b781135083787b (patch) | |
tree | c8c12c67246f543c3cc4f64d1c07e003cb1d45ae /modular.txi | |
parent | 87b82b5822ca54228cfa6df29be3ad9d4bc47d16 (diff) | |
download | slib-8466d8cfa486fb30d1755c4261b781135083787b.tar.gz slib-8466d8cfa486fb30d1755c4261b781135083787b.zip |
Import Upstream version 3a1upstream/3a1
Diffstat (limited to 'modular.txi')
-rw-r--r-- | modular.txi | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/modular.txi b/modular.txi new file mode 100644 index 0000000..d947b35 --- /dev/null +++ b/modular.txi @@ -0,0 +1,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 |