計算機プログラムの構造と解釈[第2版]
(翔泳社)
ハロルド エイブルソン (著) ジュリー サスマン (著)
ジェラルド・ジェイ サスマン (著)
Harold Abelson (原著) Julie Sussman (原著)
Gerald Jay Sussman (原著) 和田 英一 (翻訳)
開発環境
- OS X Yosemite - Apple (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈[第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.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
- Scheme手習い
問題 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 コメント:
コメントを投稿