;; 4/4/08 RJF ;; I can't find the hashtable polynomial multiplication, so I'll rewrite it. ;; multivar version, sparse monomials ;; pack exponent version ;;(setf size 10) ; much larger after testing ;;(setf mem (make-array size :fill-pointer 0 )) ;;(dotimes (i size) (vector-push-extend (make-array 2 :element-type 'double-float :initial-element 0.0d0) mem)) (defun ptimes(r s) (let ((ans (make-hash-table :test 'eql )) (m nil) (q 0.0d0)) (declare (double-float q)(optimize (speed 3)(safety 0))) (maphash #'(lambda(ex v) ; exponent, coefficient-list (declare (double-float ex) (type (simple-array double-float 1) v)) (maphash #'(lambda (ex2 v2) (declare(double-float ex2) (type (simple-array double-float 1) v2)) (setf q (+ ex ex2)) (setf m (gethash q ans nil)) ; is there an entry? (if (null m)(setf m (setf (gethash q ans) (make-array 1 :element-type 'double-float :initial-element 0.0d0)))) ;make an entry ; (format t "~%make entry for ~s"q) (incf (the double-float (aref m 0)) (* (the double-float (aref v 0)) (the double-float (aref v2 0)))))r)) s) ans)) (defun ppower(r n) (cond((= n 0) 1) ((= n 1) r) (t (ptimes r (ppower r (1- n)))))) (defun list2hash(k) (let ((ans (make-hash-table :test 'eql)) ) (dolist (i k ans) (setf (gethash (cdr i) ans) (make-array 1 :element-type 'double-float :initial-element (coerce (car i) 'double-float)))))) (defun pdump(r)(maphash #'(lambda(key val)(format t "~%~a*x^~a" (aref val 0)key)) r))