(defun chebpc (c d n &key (nmax 50)) (declare (type (simple-array double-float (*)) c)) (declare (type (simple-array double-float (*)) d)) (declare (type fixnum n)) (declare (type fixnum nmax)) (prog ((dd (make-array '(nmax) :element-type 'double-float)) (sv 0.0d0) (k 0) (j 0) ) (declare (type (simple-array double-float (*)) dd)) (declare (type double-float sv)) (declare (type fixnum k)) (declare (type fixnum j)) (fdo ((j 1 (+ j 1))) ((> j n) nil) (tagbody (fset (fref d j) 0.0) (fset (fref dd j) 0.0)) ) (fset (fref d 1) (fref c n)) (fdo ((j (+ n (- 1)) (+ j (- 1)))) ((> j 2) nil) (tagbody (fdo ((k (+ (+ n (- j)) 1) (+ k (- 1)))) ((> k 2) nil) (tagbody (setf sv (fref d k)) (fset (fref d k) (+ (* 2.0 (fref d (+ k (- 1)))) (- (fref dd k)))) (fset (fref dd k) sv) )) (setf sv (fref d 1)) (fset (fref d 1) (+ (- (fref dd 1)) (fref c j))) (fset (fref dd 1) sv) )) (fdo ((j n (+ j (- 1)))) ((> j 2) nil) (tagbody (fset (fref d j) (+ (fref d (+ j (- 1))) (- (fref dd j))))) ) (fset (fref d 1) (+ (- (fref dd 1)) (* 0.5 (fref c 1)))) (return (values c d n)) ))