sicp

計算機プログラムの構造と解釈 第二版 P43 問題1.42

問題を読む。 チョロそうだ。 合成関数っていうのの説明は書いてあるし、 結局、 g(x)を作用させた後の値をyとすると さらにf(y)までやった値を返すことができる 「手続き」 を返す 手続きを作ればいいってことだ。 いちおう、教科書で使っている incやsquar…

計算機プログラムの構造と解釈 第二版 P43 問題1.41

問題を読む。 まー大丈夫そう。 必要な答えは、 1. doubleを定義する 2. (((double (double double)) inc) 5)がどういう値を返すか確かめる。 「1.」でdoubleの定義で迷うところは特になし。lambdaをつかえばいい。 「2.」の答えで、incという手続きも必要な…

計算機プログラムの構造と解釈 第二版 P43 問題1.40

問題を読んでも特に難しいことはなさそうなイメージ。念のため「零点」について調べておく。零点 http://ja.wikipedia.org/wiki/%E9%9B%B6%E7%82%B9 零点(れいてん、ぜろてん、zero)とは、ある関数 f によって、0 に移される点、すなわち f(z) = 0 を満た…

計算機プログラムの構造と解釈 第二版 P40 問題1.39

問題をよむ。 とりあえず、 正接関数の近似値を計算する手続き(tan-cf x k)を定義するのが目的 正接関数って、なんだよ。 三角関数 http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0 という6つの値が定まる。それぞれ正弦(サイン/sine)…

計算機プログラムの構造と解釈 第二版 P40 問題1.38

問題をよむ。 よし、サービス問題的なやつかなと思ったら、大間違いでした。 とりあえず、問題1.38で作ったcont-fracをつかって自然対数の底eを求める問題のようだ。 要はパラメータとして何を入れればいいかって言う部分を考えればいいのかな。 そこでとり…

計算機プログラムの構造と解釈 第二版 P40 問題1.37

まずは問題を読む。ふむふむ。 解答が必要なのは、以下aとかbで手順があったけど、順序はばらばらにした、0. cont-fracの回帰的プロセスバージョンを定義 1. cont-fracの反復的プロセスバージョンを定義 2. k項有限分数のkをいくつぐらいにすると、黄金比の…

計算機プログラムの構造と解釈 第二版 P40 問題1.36

まず日本語をよくよむ。 求められているのは3つ0. fixed-pointを印字するようにする 1. x^x = 1000 の解を見つける。 2. ステップ数を調べて、平均緩和の時と比べる。 0. 近似値を印字するには、 tryの実行のタイミングで、表示するようにしてみる。 1. これ…

計算機プログラムの構造と解釈 第二版 P40 問題1.35

まず日本語を読む。求められているモノは2つ 0.黄金比が、ホニャララ(書くのメンドい)の不動点であることを示す。 1. fixed-pointで計算。 φ^2 = φ + 1 の正の解が黄金比の値と定義があるので、φ = x と置き換えれば、 x^2 = x + 1 両辺をxで割って x = 1 + …

計算機プログラムの構造と解釈 第二版 P37 問題1.34

とりあえず、書いてある通りのソースコードを実行してみる。 1 #!/usr/local/bin/gosh 2 ;; -*- coding: utf-8 -*- 3 4 (define (square a) (* a a a)) 5 6 (define (f g) 7 (g 2)) 8 9 10 ;; main 11 (define (main args) 12 13 (display "(f square) : ") …

計算機プログラムの構造と解釈 第二版 P34 問題1.33

方針は以下のような感じ 以下みたいな感じで、filterというパラメータを最後につける。 (filtered-accumulate combiner null-value term a next b filter) そんで、この条件だったら、combinerパラメータで引き込んだ、関数やら「+」やら「-」 やらをやって…

計算機プログラムの構造と解釈 第二版 P34 問題1.32

やばい、思ったより簡単だった。 もちろん、間違ってるかもだけど。 これは、前に出てきてるsumとproductをさらに、accumulateという関数で 抽象化できませんか?という問題。 抽象化をどうやって考えるかといえば、 ざっくり、今まで固定値だった部分を、パ…

計算機プログラムの構造と解釈 第二版 P34 問題1.31

実は理解が足りないのかもしれないが、わりと簡単に問題が解けた。 解くための方針は以下みたいな感じ。 まず、productの問題。 sumはある式の解を、がんがん足していくのだが、 productは式の解を、がんがん掛けていく。 だから基本的に以前作ったsumの「+…

計算機プログラムの構造と解釈 第二版 P33 問題1.30

この問題、ここまでまじめにやってきた僕にとってボーナス問題に近い。 反復的にっていうのは僕の解釈だと、 「今までの計算結果(状態)を引数で渡してあげちゃって、終了条件で結果を返す」 みたいな方式で、そうすると「立つ鳥後を濁さず」みたく再帰計算が…

計算機プログラムの構造と解釈 第二版 P33 問題1.29

はいはい、そうそう、 ちょっと前までの説明の dx の代わりに、 h = (b - a)/n ととかやって、 y[k] = f(a + k * h) とかやる訳ね。 よゆうよゆう と余裕をかましていたのでした。 数分後 - - - ああ、もうわかる訳がない!! こんな問題!!! なんだこりゃ…

計算機プログラムの構造と解釈 第二版 P29 問題1.28

[追記20090226] これソースコードのところ、間違ってます。 教科書の以下のくだりに目をつけた。 つまり1でもn-1でもないがその二乗がnを法として1になる数がなかったか調べる。そういうnを法とした1の自明でない平方根があれば、nが素数でないことが証明で…

計算機プログラムの構造と解釈 第二版 P29 問題1.27

ここで出ている、charmichael数っていうのは、 561、1105、1729、2465、2821 っていう数で、 Felmatテストはパスするけど、素数ではない数。 教科書に書いてあった nを法として合同 とかいうことば。 先々週ぐらいに、教えてもらったのに、そもそも意味がわ…

計算機プログラムの構造と解釈 第二版 P29 問題1.26

そもそも、 (* (expmod base (/ exp 2) m) (expmod base (/ exp 2) m)) なんてことをやると、ここで計算が二系統に分かれる。しかも同じ計算を倍々にし続けることになる。 これはめちゃくちゃスペースをくう。整数の平方を求めるのに比べて大きく遅くなる。 …

計算機プログラムの構造と解釈 第二版 P29 問題1.25

とりあえずは、ここに書いてありますexpmodを実装してみる。 1 #!/usr/local/bin/gosh 2 ;; -*- coding: utf-8 -*- 3 4 (use ggc.debug.trace) 5 (use math.mt-random) 6 7 ;;random;;;;;;;;;;;;;;;;;;;;;; 8 (define mt (make <mersenne-twister> :seed (sys-time))) 9 (defin</mersenne-twister>…

計算機プログラムの構造と解釈 第二版 P29 問題1.24

Fermat法を利用してのprime-test ちゃんと、θ(log n)な感じの計算量増加。 底を10とすると、nが100倍されても、計算量が2倍ってやつ。 nが1000倍なら計算量は3倍。いけてます。 goucheだからかわかんないけど、教科書のFermat法の実装を使うだけだとエラーが…

計算機プログラムの構造と解釈 第二版 P29 問題1.22 1.24

タイトルの問題で、Gaucheにない関数(runtimeとrandom)を使うのでそれを覚え書き。誰かのブログから取ってきたんだけど、誰のだか忘れた。 ;;runtime (define (runtime) (use srfi-11) (let-values (((a b) (sys-gettimeofday))) (+ 1000000 b))) randomは結…

計算機プログラムの構造と解釈 第二版 P29 問題1.22

こんな感じ。 #!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) ;;runtime;;;;;;;;;;;;;;;;;;;;;; (define (runtime) (use srfi-11) (let-values (((a b) (sys-gettimeofday))) (+ 1000000 b))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;1-…

計算機プログラムの構造と解釈 第二版 P29 問題1.21

たぶんこんな感じ。 1 #!/usr/local/bin/gosh 2 ;; -*- coding: utf-8 -*- 3 4 (use ggc.debug.trace) 5 6 (define (square n) 7 (* n n)) 8 9 10 (define (smallest-divisor n) 11 (find-divisor n 2)) 12 13 (define (find-divisor n test-divisor) 14 (co…

計算機プログラムの構造と解釈 第二版 P29 問題1.23

教科書通りでだいたい、2倍程度はやくなった。 計算時間が、60%になったってとこか。 10%はなんかのオーバーヘッドとか、1の加算の方が、2の加算より早いとか云々。 変えたのは、21行目から25行目 1 #!/usr/local/bin/gosh 2 ;; -*- coding: utf-8 -*- 3 4 (…

Shibuya.lisp テクニカルトーク#2

http://shibuya.lisp-users.org/2009/01/30/sltt-2/おお、 第一部「Technical Talks」 14:35 Mosh Internals & SRFI-98 (ひげぽん/サイボウズ・ラボ株式会社) 15:15 休憩(10min) 15:25 Lisp quote unquote (黒田寿男/数理システム) 16:10 大休憩(35min) 16:4…

計算機プログラムの構造と解釈 第二版 P26 問題1.19

計算機プログラムの構造と解釈 第二版 P26 問題1.19 すごく難しかったが、 割とよくできたと思うので、結果を乗せておきます。 (Tpq)^2 = Tp'q' なので、Tpq を二回実行して、比較してみれば、p' q'は、もとまる。 Tpqを一回実行した結果の対をA B とすると…

ggc

会社でsicp読書会が開かれておりまして、 生意気にもいそいそとそれに参加させてもらうことになりました。そんで僕はgaucheをつかいたいんだけど、 gaucheにはtraceっていって、実行をトレースしてくれる関数がない!!ということで、調べたところ、、、 結…