[ create a new paste ] login | about

Link: http://codepad.org/sZyPIi4v    [ raw code | output | fork ]

Scheme, pasted on Apr 24:
(require (lib "40.ss" "srfi"))
(require (lib "43.ss" "srfi"))

(define (ln2-from n)
  (stream-cons (/ 1.0 n)
	       (stream-map - (ln2-from (+ n 1)))))
(define ln2-stream (ln2-from 1))

(define (scale-stream stream factor)
    (stream-map (lambda (x) (* x factor)) stream))

(define (add-streams s1 s2)
  (stream-map + s1 s2))

(define (partial-sums s)
  (define sums
    (stream-cons 0
		 (add-streams s sums)))
  (stream-cdr sums))

(define ln2 (partial-sums ln2-stream))

(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s) (- n 1))))

(define (square x) (* x x))

(define (euler-transform s)
  (let ((s0 (stream-ref s 0))
	(s1 (stream-ref s 1))
	(s2 (stream-ref s 2)))
    (stream-cons (- s2 (/ (square (- s2 s1))
			  (+ s0 (* -2 s1) s2)))
		 (euler-transform (stream-cdr s)))))

(define (make-tableau transform s)
	(stream-cons s
		     (make-tableau transform
				   (transform s))))

(define (accelerated-sequence transform s)
	(stream-map stream-car
		    (make-tableau transform s)))

(define head stream-car)
(define tail
  (lambda (stream) (stream-cdr stream)))

(letrec ( 
   (n 10) 
   (loop (lambda (s) 
      (if (not (= n 0)) 
          (begin (set! n (- n 1)) 
                 (write (head s)) 
                 (newline)
                 (loop (tail s)))))))
  (loop (accelerated-sequence euler-transform ln2)))


Output:
1
2
3
4
5
6
7
8
9
10
1.0
0.7
0.6932773109243697
0.6931488693329254
0.6931471960735491
0.6931471806635636
0.6931471805604039
0.6931471805599445
0.6931471805599427
0.6931471805599454


Create a new paste based on this one


Comments: