ulisp/tak.lsp

87 lines
1.9 KiB
Common Lisp

(defun tak (x y z)
(if (not (< y x))
z
(tak
(tak (1- x) y z)
(tak (1- y) z x)
(tak (1- z) x y))))
(defun benchmark-tak ()
(tak 18 12 6))
(defun fib (n)
(if (< n 3) 1
(+ (fib (- n 1)) (fib (- n 2)))))
(defun benchmark-fib ()
(fib 23))
(defun q (n)
(if (<= n 2) 1
(+
(q (- n (q (- n 1))))
(q (- n (q (- n 2)))))))
(defun benchmark-q ()
(q 21))
(defun q2 (x y)
(if (or (< x 1) (< y 1)) 1
(+ (q2 (- x (q2 (1- x) y)) y)
(q2 x (- y (q2 x (1- y)))))))
(defun benchmark-q2 ()
(q2 7 8))
(defun factor (n)
(cond
((zerop (mod n 2)) 2)
((zerop (mod n 3)) 3)
(t (let ((d 5) (i 2))
(loop
(when (> (* d d) n) (return n))
(when (zerop (mod n d)) (return d))
(incf d i) (setq i (- 6 i)))))))
(defvar *factor-prime* 2142142141)
(defun benchmark-factor ()
(factor *factor-prime*))
(defun sieve (size)
(let ((a (make-array size :element-type 'bit))
max)
(setf (aref a 0) 1 (aref a 1) 1)
(dotimes (i size max)
(when (zerop (aref a i))
(setq max i)
(do ((j (* 2 i) (+ j i))) ((>= j size)) (setf (aref a j) 1))))))
(defun benchmark-sieve ()
(sieve 100000))
(defun benchmark-check (fun expected)
(let ((answer (fun)))
(unless (eq answer expected)
(error "benchmark failed: have ~a, expected ~a~%"
answer
expected)
t)))
(defun benchmark-time-it (fun expected)
(time (benchmark-check fun expected)))
(defun benchmark ()
(print '(tak 18 12 6))
(benchmark-time-it benchmark-tak 7)
(print '(fib 23))
(benchmark-time-it benchmark-fib 28657)
(print '(q 21))
(benchmark-time-it benchmark-q 12)
(print '(q2 7 8))
(benchmark-time-it benchmark-q2 31)
(print '(factor 2142142141))
(benchmark-time-it benchmark-factor *factor-prime*)
(print '(sieve 100000))
(benchmark-time-it benchmark-sieve 99991))