測定
そんなに大きい整数を相手にする気も無いのだが. 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作って数値クラスの比較演算子を全て上書きする必要がある様子.