prime-form fun
Tobias Kunze
t@ulysses.Stanford.EDU
Wed, 5 Nov 1997 14:27:30 -0800
I still don't know what a prime form is good for, but this seems
like fun and, while still unoptimized, probably an order of
magnitude faster (albeit less elegant):
(decode-prime-form (encode-prime-form '(f4 e4 ef5 bf4)))
=> (0 1 2 7)
(= (encode-prime-form '(g4 b4 af5 df6)) (encode-prime-form '(fs3 c4 g4
bf4)))
=> T
(time
(dotimes (i 1000)
(decode-prime-form (encode-prime-form '(f4 e4 ef5 bf4)))))
; cpu time (non-gc) 270 msec user, 0 msec system
; cpu time (gc) 0 msec user, 0 msec system
; cpu time (total) 270 msec user, 0 msec system
; real time 354 msec
; space allocation:
; 15,004 cons cells, 0 symbols, 32 other bytes
------^^^^^^
argh. 15,004 cons cells...
-----------------------------------------
(defun encode-prime-form (notes)
(let ((x 0))
(map nil #'(lambda (n)
(setf x (logior x (ash 1 (mod (degree n) 12))))) notes)
(loop repeat 12
for y = x then (logand (logior (ldb (byte 1 11) y) (ash y 1)) 4095)
minimize y)))
(defun decode-prime-form (prime)
(loop for i below 12
when (= (ldb (byte 1 i) prime) 1)
collect i))