測定

そんなに大きい整数を相手にする気も無いのだが. 2^{20000}辺りを引数にすると差が出た.

;(define (nu_2 a)
;  (cond [(zero? a) "infty"]
;        [else (the number of consecutive zeros inthe LSBs of the binary representation of a)]))

(define (nu-div a)
  (if (integer? a)
      (let loop [(c a) (i 0)]
        (cond
         [(zero? a) #f]
         [(odd? c) i]
         [else (loop (/ c 2) (+ i 1))]))))

(define (nu-bit a)
  (if (integer? a)
      (let loop [(c a) (i 0)]
        (cond
         [(zero? a) #f]
         [(odd? c) i]
         [else (loop (ash c -1) (+ i 1))]))))

(define (nu-bit-ref a)
  (if (integer? a)
      (let loop [(i 0)]
        (cond
         [(zero? a) #f]
         [(logbit? i a) i]
         [else (loop (+ i 1))]))))

正確には, aが0の場合+Infを返す必要がある. ビット長がdoubleに収まらないことはそう無いだろうからとりあえずは+inf.0で代用する方針で. 真面目にやる場合には, symbol作って数値クラスの比較演算子を全て上書きする必要がある様子.