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))