2015年2月14日土曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.2(手続きとその生成するプロセス)、1.2.6(例: 素数性のテスト)、問題 1.28.を解いてみる。

その他参考書籍

問題 1.28.

コード(BBEdit, Emacs)

sample28.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(use srfi-27)                           ; random-integer

(define square (lambda (x) (* x x)))
(define even? (lambda (n) (= (remainder n 2) 0)))

(define expmod
  (lambda (base exp m)
    (define inner
      (lambda (n)
        (define inner-1
          (lambda (s)
            (if (and (not (= n 1))
                     (not (= n (- m 1)))
                     (= s 1))
                0
                (remainder s m))))
        (inner-1 (square n))))
    (cond ((= exp 0) 1)
          ((even? exp)
           (inner (expmod base (/ exp 2) m)))
          (else
           (remainder (* base (expmod base (- exp 1) m))
                      m)))))

(define fast-prime?
  (lambda (n times)
    (cond ((= times 0) #t)
          ((miller-rabin-test n)
           (fast-prime? n (- times 1)))
          (else #f))))

(define miller-rabin-test
  (lambda (n)
    (define try-it
      (lambda (a)
        (define t (expmod a (- n 1) n))
        (and (not (= t 0)) (= t 1))))
    (try-it (+ 1 (random-integer (- n 1))))))

(for-each
 (lambda (n)
   (print n ": " (fast-prime? n 1000)))
 (list 1009 1013 1019
       10007 10009 10037
       100003 100019 100043
       1000003 1000033 1000037))

(for-each
 (lambda (n)
   (print n ": " (fast-prime? n 1000)))
 (list 561 1105 1729 2465 2821 6601
       1000 1001 1002
       10000 10001 10002
       10000 10001 10002
       100000 100001 100002))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample28.scm
1009: #t
1013: #t
1019: #t
10007: #t
10009: #t
10037: #t
100003: #t
100019: #t
100043: #t
1000003: #t
1000033: #t
1000037: #t
561: #f
1105: #f
1729: #f
2465: #f
2821: #f
6601: #f
1000: #f
1001: #f
1002: #f
10000: #f
10001: #f
10002: #f
10000: #f
10001: #f
10002: #f
100000: #f
100001: #f
100002: #f
$

0 コメント:

コメントを投稿