87 lines
1.9 KiB
Common Lisp
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))
|
|
|