generators.scm 689 B

123456789101112131415161718192021222324252627
  1. (define-module (euler generators))
  2. (define-public (make-convergent-frac-generator)
  3. (let ((*k* #f))
  4. (lambda (n)
  5. (let ((term (if *k* (*k* n) n)))
  6. (call-with-prompt
  7. 'expand
  8. (lambda ()
  9. (if *k*
  10. (*k* (+ n (/ 1 (abort-to-prompt 'expand))))
  11. (+ n (/ 1 (abort-to-prompt 'expand)))))
  12. (lambda (k)
  13. (set! *k* k)))
  14. term))))
  15. (define-public (linear-congruential-generator values)
  16. (define expt1 (expt 2 20))
  17. (define expt2 (/ expt1 2))
  18. (let loop ([k 1] [t 0] [generated-values '()])
  19. (if (> k values) (reverse generated-values)
  20. (let ([t+1 (modulo (+ (* t 615949) 797807)
  21. expt1)])
  22. (loop (1+ k) t+1
  23. (cons (- t+1 expt2)
  24. generated-values))))))