; two more random exercises
(define (ilog b n)
(let loop1 ((lo 0) (b^lo 1) (hi 1) (b^hi b))
(if (< b^hi n) (loop1 hi b^hi (* hi 2) (* b^hi b^hi))
(let loop2 ((lo lo) (b^lo b^lo) (hi hi) (b^hi b^hi))
(if (<= (- hi lo) 1) (if (= b^hi n) hi lo)
(let* ((mid (quotient (+ lo hi) 2))
(b^mid (* b^lo (expt b (- mid lo)))))
(cond ((< n b^mid) (loop2 lo b^lo mid b^mid))
((< b^mid n) (loop2 mid b^mid hi b^hi))
(else mid))))))))
(define (middle-square n)
(let* ((len (+ (ilog 10 n) 1)) (len2 (quotient len 2)))
(modulo (quotient (* n n) (expt 10 len2)) (expt 10 len))))
(let loop ((n 675248) (k 25))
(when (positive? k)
(display n) (newline)
(loop (middle-square n) (- k 1))))
(define (randu n) (modulo (* 65539 n) (expt 2 31)))
(let loop ((n 1) (k 25))
(when (positive? k)
(display n) (newline)
(loop (randu n) (- k 1))))