開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.4(値として返される手続き)、Newton法、抽象と第一級手続き、問題 1.45.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 1.45.
実験。
コード(BBEdit, Emacs)
sample.scm
#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-
;; これまでに書いた手続き
(load "./procedures.scm")
(define (n-root-test n c)
(fixed-point ((repeated average-damp c)
(lambda (y)
(/ (expt 2 n)
(expt y
(- n 1)))))
1.0))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
gosh> n-root-test
gosh> (n-root-test 2 1)
2.000000000000002
gosh> (n-root-test 3 1)
1.9999981824788517
gosh> (n-root-test 4 1)
C-c C-c*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
Stack Trace:
_______________________________________
0 ((real? x) (cond ((real? y) (%expt x y)) ((number? y) (* (%expt x ...
At line 158 of "/opt/local/share/gauche-0.9/0.9.3.3/lib/gauche/numerical.scm"
1 (expt y (- n 1))
At line 412 of "(stdin)"
2 f
3 f
gosh> (n-root-test 4 2)
2.0000000000021965
gosh> (n-root-test 5 2)
2.000001512995761
gosh> (n-root-test 6 2)
2.0000029334662086
gosh> (n-root-test 7 2)
2.0000035538623377
gosh> (n-root-test 8 2)
C-c C-c*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
Stack Trace:
_______________________________________
0 (expt y (- n 1))
At line 412 of "(stdin)"
1 f
2 f
3 f
gosh> (n-root-test 8 3)
2.0000000000039666
gosh> (n-root-test 9 3)
1.9999997106840102
gosh> (n-root-test 10 3)
2.000001183010332
gosh> (n-root-test 11 3)
1.999997600654736
gosh> (n-root-test 12 3)
1.9999976914703093
gosh> (n-root-test 13 3)
2.0000029085658984
gosh> (n-root-test 14 3)
1.9999963265447058
gosh> (n-root-test 15 3)
2.0000040951543023
gosh> (n-root-test 16 3)
C-c C-c*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
Stack Trace:
_______________________________________
0 f
gosh> (n-root-test 16 4)
2.000000000076957
gosh> (n-root-test 17 4)
2.0000000561635765
gosh> (n-root-test 18 4)
2.0000005848426476
gosh> (n-root-test 19 4)
2.0000003649180282
gosh> (n-root-test 20 4)
1.999999063225966
gosh> (n-root-test 21 4)
2.000001254054255
gosh> (n-root-test 22 4)
1.9999986334227027
gosh> (n-root-test 23 4)
1.999997131591442
gosh> (n-root-test 24 4)
1.999997814692085
gosh> (n-root-test 25 4)
1.9999977429539468
gosh> (n-root-test 26 4)
1.999997554120725
gosh> (n-root-test 27 4)
1.9999966641661142
gosh> (n-root-test 28 4)
1.999995794390521
gosh> (n-root-test 29 4)
1.9999957104786472
gosh> (n-root-test 30 4)
2.0000044907654058
gosh> (n-root-test 31 4)
1.9999951809750391
gosh> (n-root-test 32 4)
C-c C-c*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
Stack Trace:
_______________________________________
0 f
1 f
gosh> (n-root-test 32 5)
2.000000000000006
gosh>
| n乗根 | 平均緩和回数 |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 3 |
| 9 | 3 |
| 10 | 3 |
| 11 | 3 |
| 12 | 3 |
| 13 | 3 |
| 14 | 3 |
| 15 | 3 |
| 16 | 4 |
| 17 | 4 |
| 18 | 4 |
| 19 | 4 |
| 20 | 4 |
| 21 | 4 |
| 22 | 4 |
| 23 | 4 |
| 24 | 4 |
| 25 | 4 |
| 26 | 4 |
| 27 | 4 |
| 28 | 4 |
| 29 | 4 |
| 30 | 4 |
| 31 | 4 |
| 32 | 5 |
平均緩和回数について、1回増えるまで2、4、8、16(2の1乗、2の2乗、2の3乗、2の4乗)という間隔なっている。この実験結果から、n乗根を近似する為の平均緩和回数は、
[log2 n]と予測できる。
このことからn乗根を計算する単純な手続きを実装。
sample.scm
#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-
;; これまでに書いた手続き
(load "./procedures.scm")
(define (n-root n x)
(fixed-point ((repeated average-damp
(floor (log n
2)))
(lambda (y)
(/ x
(expt y
(- n 1)))))
1.0))
(for-each (lambda (n)
(define y (n-root n 100))
(print 100 "の" n "乗根: " y
" (" y "の" n "乗: " (expt y n) ")"))
'(1 2 3 4 5 6 7 8 9 10))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
gosh> 100の1乗根: 100.0 (100.0の1乗: 100.0) 100の2乗根: 10.0 (10.0の2乗: 100.0) 100の3乗根: 4.641585829030015 (4.641585829030015の3乗: 99.99980580480566) 100の4乗根: 3.162277660168379 (3.162277660168379の4乗: 99.99999999999997) 100の5乗根: 2.5118850413846463 (2.5118850413846463の5乗: 99.99972329095421) 100の6乗根: 2.1544323047105944 (2.1544323047105944の6乗: 99.99933570099907) 100の7乗根: 1.9307017486395444 (1.9307017486395444の7乗: 100.00145742491912) 100の8乗根: 1.7782794100800858 (1.7782794100800858の8乗: 100.00000001851814) 100の9乗根: 1.6681003815774011 (1.6681003815774011の9乗: 99.99991603603233) 100の10乗根: 1.584892548296255 (1.584892548296255の10乗: 99.99959356019488) #<undef> gosh>
0 コメント:
コメントを投稿