Open Source WEB

##(link2sicp "book-Z-H-11.html#%_thm_1.28" "Exercise 1.28")

解答例

Miller-Rabinテスト

(define (expmod2 base exp m)
  (cond ((= exp 0) 1)
        ((even? exp)
         (let* ((n1 (expmod2 base (/ exp 2) m))
                (n2 (remainder (square n1) m)))
           (if (and (= n2 1)
                    (not (or (= n1 1) (= n1 (- m 1)))))
               0
               n2)))
        (else
          (remainder (* base (expmod2 base (- exp 1) m)) m))))

(define (miller-rabin-test n)
  (define (try-it a)
    (= (expmod2 a (- n 1) n) 0))
  (try-it (+ 1 (random-integer (- n 1)))))

(define (miller-rabin-test2 n)
  (define (try-it a)
    (= (expmod2 a (- n 1) n) 0))
  (define (iter a)
    (if (= a 1)
        #f
        (or (try-it a)
            (iter (- a 1)))))
  (iter (- n 1)))

miller-rabin-test はランダムに選んだ a < n なる a でテストする miller-rabin-test2 は a < n なるすべての自然数でテストする

実行結果(miller-rabin-test2 は引数が合成数であれば、#tを返す)

gosh> (miller-rabin-test2 561)
#t
gosh> (miller-rabin-test2 1105)
#t
gosh> (miller-rabin-test2 1729)
#t
gosh> (miller-rabin-test2 2465)
#t
gosh> (miller-rabin-test2 2821)
#t
gosh> (miller-rabin-test2 6601)
#t

コード

##(sicp-answer-code "ex-1.28.scm")

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us