[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Wed May 19 15:09:09 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv24256
Modified Files:
integers.lisp
Log Message:
Added gcd, mainly borrowed from cmucl.
Date: Wed May 19 11:09:07 2004
Author: ffjeld
Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.8 movitz/losp/muerte/integers.lisp:1.9
--- movitz/losp/muerte/integers.lisp:1.8 Fri Apr 23 09:02:22 2004
+++ movitz/losp/muerte/integers.lisp Wed May 19 11:09:05 2004
@@ -9,7 +9,7 @@
;;;; Created at: Wed Nov 8 18:44:57 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: integers.lisp,v 1.8 2004/04/23 13:02:22 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.9 2004/05/19 15:09:05 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -1103,3 +1103,32 @@
(defun minus-if (x y)
(if (integerp x) (- x y) x))
+(defun gcd (&rest numbers)
+ (numargs-case
+ (1 (u) u)
+ (2 (u v)
+ ;; Code borrowed from CMUCL.
+ (do ((k 0 (1+ k))
+ (u (abs u) (ash u -1))
+ (v (abs v) (ash v -1)))
+ ((oddp (logior u v))
+ (do ((temp (if (oddp u) (- v) (ash u -1))
+ (ash temp -1)))
+ (nil)
+ (declare (fixnum temp))
+ (when (oddp temp)
+ (if (plusp temp)
+ (setq u temp)
+ (setq v (- temp)))
+ (setq temp (- u v))
+ (when (zerop temp)
+ (let ((res (ash u k)))
+ (declare (type (signed-byte 31) res)
+ (optimize (inhibit-warnings 3)))
+ (return res))))))))
+ (t (&rest numbers)
+ (declare (dynamic-extent numbers))
+ (do ((gcd (car numbers)
+ (gcd gcd (car rest)))
+ (rest (cdr numbers) (cdr rest)))
+ ((null rest) gcd)))))
More information about the Movitz-cvs
mailing list