Entries from 2015-07-01 to 1 month

数値積分のシンプソンの公式

SICPの問題1.29です。 (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (integral f a b n) (let* ((h (/ (- b a) n)) (inc (lambda (x) (+ x 1))) (term (lambda (k) (cond [(or (= k 0) (= k n)) (f (+ a (…

SICP問題1.28 Miller-Rabinテスト

; 1.28 (use srfi-27) (define (expmod base exp m) (cond [(= exp 0) 1] [(even? exp) (miller-rabin (expmod base (/ exp 2) m) m)] [else (remainder (* base (expmod base (- exp 1) m)) m)])) (define (miller-rabin a m) (if (and (not (= a 1)) (not …

対数的ステップ数のフィボナッチ数列アルゴリズム

以下は、ふつうのフィボナッチ数列のアルゴリズムです。 (define (fib n) (cond [(= n 0) 0] [(= n 1) 1] [else (+ (fib (- n 1)) (fib (- n 2)))])) これを反復的になるように書き換えると以下のようになります。ステップ数はです。 (define (fib n) (fib-i…

対数的ステップ数の2数の積

SICPの問題1.18。「ロシア農民の方法」として知られるアルゴリズムらしい。これは30分くらい考えてわかった。解けたときすっきりした。 ; 1.18 (define (fast-* a b) (*-iter a b 0)) (define (*-iter a b n) (cond [(= b 0) n] [(even? b) (*-iter (double …

不変量を使った累乗の計算

SICPの問題1.16。これは思いつかなかった。 ; 1.16 (define (fast-expt b n) (expt-iter b n 1)) (define (expt-iter b n a) (cond [(= n 0) a] [(even? n) (expt-iter (* b b) (/ n 2) a)] [else (expt-iter b (- n 1) (* a b))]))