#lang racket
(require racket/generator)
(define (mod-op op a b n)
(modulo (op
(modulo a n)
(modulo b n))
n))
(define (mod-exp a x n)
(cond ((zero? x) 1)
((odd? x)
(mod-op * (mod-exp (mod-op * a a n) (quotient x 2) n) a n))
((even? x)
(mod-exp (mod-op * a a n) (quotient x 2) n))))
(define (make-prime-generator)
(generator ()
(let loop ((prime-list '())
(current 2))
(cond ((foldr (λ (v l) (and v l)) #t (map (λ (x) (not (zero? x))) (map (λ (x) (modulo current x)) prime-list)))
(yield current)
(loop (cons current prime-list) (add1 current)))
(else
(loop prime-list (add1 current)))))))