; leading digits of powers of 2

(display (expt 2 32)) (newline)

(define (leading-digit two-to-n) ; slow
  (- (char->integer (string-ref
    (number->string (expt 2 two-to-n)) 0)) 48))

(display (leading-digit 32)) (newline)

(define (leading-digit two-to-n) ; fast
  (let* ((q (* (log10 2) two-to-n))
         (r (- q (truncate q))))
    (let loop ((i 2))
      (if (< r (log10 i)) (- i 1)
        (loop (+ i 1))))))

(display (leading-digit 32)) (newline)

(define (lead2 n)
  (let ((counts (make-vector 10 0)))
    (do ((i 0 (+ i 1))) ((= i n) counts)
      (let ((d (leading-digit i)))
        (vector-set! counts d
          (+ (vector-ref counts d) 1))))))

(display (lead2 100000)) (newline)