2006/07/30

こないだ会社で「集合がわかる本を教えろ」みたいな質問をされたけど、それはたぶんドモルガンとかについてわかりやすく説明してる本ってことですよね。知りません。

まあ、そういう本の必要性は否定しませんが、たぶん読んでも面白くないんじゃないかなあ。っていうのは、ようするに「数式が読めること=数学がわかること」ではないからなんですが。じゃあ「数学がわかること」とは何かってきかれても、自分は必ずしも数学をよくわかっているわけではないので、はっきりとは答えようがないです。だから以下の独り言は音量をさげてこっそり書きます。


なんだかんだいって、数学に対するイメージは、いまだに「数字とか文字式だとかの演算」なのかもしれない。そこまで極端でなくても、「数式が読めること=数学がわかること」だと漠然と思っている人は多い。傍証:おまえ数学科なのになんで計算できないんだよという誹謗中傷。

現代の数学の根っこにあるのは、数式をこねくり回すことじゃない。数学の役割は、人間が恣意的にいじくれないっぽい概念をどう整理(抽象化)すれば人間の把握下におけるか、ってとこにあると思う。具体的には、代数的な構造だとか位相的な構造だとか順序的な構造だとかを持ち出して、超越的にえいって感じで丸め込むのが現代の数学のやり方。

ところで、そんな現代数学のやり口を学ぶ本(あるいは観賞する本)って、数学専攻の学生以外にも役立つような気がするんだけど、どうだろう。読者になり得るのは『ゲーデル・エッシャー・バッハ』を買った人たち。でも、その面白さを潜在的な読者の大多数に書名とパッケージと口コミだけで伝えるのは困難だから、市場での成功は得られないだろうな。『ゲーデル・エッシャー・バッハ』だって、何で売れたのかよくわからないし。仕事でやるとなると、売れるとか売れないとか考えざるを得ない。そもそも誰に書いてもらうかっていうのがネック。数学の言葉で書いちゃダメなわけで。つーか数学の言葉で書いたら、それはただの公理的集合論の教科書なのかも。

あー、もし冒頭の質問が「公理的集合論がわかる本を教えろ」という意味だったのなら、きちんとした内容は別の本で学ぶ必要があるけど、こんな本があります。

『数学の基礎をめぐる論争―21世紀の数学と数学基礎論のあるべき姿を考える』
http://www.amazon.co.jp/gp/product/4431707972

自分が昔読んだときには翻訳がいまいちという印象だった。でも内容は激面白いっす。

2006/07/26

* 「各要素が「0または1をとる乱数」から成る長さnのリストを得よ」
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2006-07-10

「乱数」っていう用語は、とてもあいまい。たとえばこんなのは?
(use math.const)
(use util.stream)

(define so-pseudo-random
(let ((PIchop (let R1 ((x pi))
(stream-cons (floor x) (R1 (* (fmod x 1) 10))))))
(let R ((s PIchop))
(if (odd? (stream-car s))
(stream-cons 1 (R (stream-cdr s)))
(stream-cons 0 (R (stream-cdr s)))))))

gosh>(stream->list (stream-take so-pseudo-random 30))
(1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0)


ようするに円周率の各桁の偶奇に応じて 0 か 1 を出力しているだけだけど、乱数といえないことはない。ただし当たり前だけど暗号化処理のシードに使ったりするわけにはいかない。予測可能だから。(math.const で提供されている定数を使っているからそのうち 0 が続いてしまう問題には目をつぶったとしても)

以下は宣伝モード。
乱数については、発売したばかりのこちらの書籍もどうぞ。やたらに広範な話題に及んでいるので拾い読みがお勧め。

『Building Secure Software』
http://www.amazon.co.jp/gp/product/427406655X

原書は少し前に出た本なんだけど、翻訳書は適宜監訳注が入ってるので不便はないはず。


ところで出題元の"Open Source WEB"では7月10日の日付になっているけど、Bloglinesにはついさっきようやく入ってきた。どうしてこんなに遅いんだろう。
夏になって女の子たちが塗る日焼け止めの香りが好き。毎年7月ごろはそれが日焼け止めに由来することを忘れてるから、たまに電車に乗ったりすると微かに幸せなきもちになって、ちょっと戸惑う。

いいわけ1:
だいたいこういう基地外っぽいことを書いているときは心が弱っているわけで……

いいわけ2:
「夏服にそわそわ」だけにフォーカスしたIrwin Shawの小説もありますよ、と。

『夏服を着た女たち』
http://www.amazon.co.jp/gp/product/4062748207/

2006/07/25

Gauche のストリームと MIT Scheme のストリームがじゃっかん違う?
SICP の Ex. 3.56 は、「2,3,5以外の素因数を持たない整数全体の集合を以下の stream-scale と merge を使って求めろ」という問題。
(define (stream-scale stream factor)
(stream-map (lambda (x) (* x factor)) stream))

(define (merge s1 s2)
(cond ((stream-null? s1) s2)
((stream-null? s2) s1)
(else
(let ((s1car (stream-car s1))
(s2car (stream-car s2)))
(cond ((< s1car s2car)
(stream-cons s1car
(merge (stream-cdr s1) s2)))
((> s1car s2car)
(stream-cons s2car
(merge s1 (stream-cdr s2))))
(else
(stream-cons s1car
(merge (stream-cdr s1)
(stream-cdr s2)))))))))

素直に解答すると、こうなる。
(define S (stream-cons 
1
(merge (stream-scale S 2)
(merge (stream-scale S 3)
(stream-scale S 5)))))

ところが Gauche(0.8.6)だと、この S を見に行くと止まってしまうようだ。先頭の 1つしか決まっていないストリームを merge にぶちこんで再帰することに問題があるらしい。深さに応じてストリームの先頭付近を具体的にしてやると、意図したストリームに近いものを求めてくれる。
(define S (stream-cons 
1
(merge (stream-scale (stream-cons 0 S) 2)
(merge (stream-scale (stream-cons 0 (stream-cons 0 S)) 3)
(stream-scale (stream-cons 0 (stream-cons 0 S)) 5)))))

gosh> (stream->list (stream-take S 100))
(1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 8 0 0 9 0 0 10 0 0 12 0 0 15 0
0 16 0 0 18 0 0 20 0 0 24 0 0 25 0 0 27 0 0 30 0 0 32 0 0 36 0 0 40
0 0 45 0 0 48 0 0 50 0 0 54 0 0 60 0 0 64 0 0 72 0 0 75 0 0 80 0 0
81 0 0 90 0 0 96 0 0 100)

0を無視すれば正しい集合が求まっている。
しっかし、こういうひっかけがあるときはヒントが書いてありそうなもんだ。つまりたぶんこれはなにかおかしい。そこで MIT Scheme で試してみると、あっさり普通に求まった。
1 ]=> 
(define S (cons-stream
1
(merge (stream-scale S 2)
(merge (stream-scale S 3)
(stream-scale S 5)))))

;Value: s

1 ]=> (stream-ref S 1)

;Value: 2

1 ]=> (stream-ref S 4)

;Value: 5

1 ]=> (stream-ref S 100)

;Value: 1600

なんでだろう。考えられるのは、Gauche と MIT Scheme の stream-cdr が違いそうだってことだろうなあ。また何か勘違いしている可能性もあるので、もっとよく考えること。

2006/07/23

真偽値からなるリストを持っていて、その or を知りたい。つまり、真偽値のリストに #t があるかどうか確かめたい。

最初はブール演算できると信じてた。
gosh> (fold or #f '(#f #f #t #f))
*** ERROR: invalid application: (#<syntax or> #f #f)

この期におよんでプロシージャとシンタックス形式の違いに戸惑うとは。しかし困ったな。シンタックス形式だと apply もできない。
gosh> (apply or '(#f #f #t #f))
*** ERROR: invalid application: (#<syntax or> #f #f #t #f)

常套手段。
(define (or-bool-list ls)
(if (null? ls) #f (or (car ls) (or-bool-list (cdr ls)))))
(or-bool-list '(#f #f #t #f))

いんちき。
(member #t '(#f #f #t #f))

もっとかっこいい方法がいいなあ。

2006/07/22

備忘録。set! の戻り値は R5RS では規定されていない。
Gauche では set! した引数の set! 後の値が返る。
gosh> (let ((x 1)) (set! x 3))
3

MIT Scheme では set! 前の値が返る。
1 ]=> (let ((x 1)) (set! x 3))
;Value: 1

2006/07/21

オフィスの席替えがあった。新しい席はえらい人たちで決めたらしいんだけど、一言でいって現状のベスト(ただし主観)。まあ、主観が大きいとはいえ、全体の雰囲気も先週までとは完全にいい方向へ変わったと思う。人間なんだから苦痛な環境では仕事できないって。
それにしても、ほんとうに上司には恵まれていると思う(会社には恵まれていないけど)。これで仕事をしなければ罰当たりってもんだ。

2006/07/17

キミならどう書く 2.0 - ROUND 2 - Collatz予想
http://ll.jus.or.jp/2006/blog/doukaku2

ROUND 1は素数を求める問題だったので意識的にスルーしてた。今回の問題も、この問題がCollatz予想と呼ばれているなんて知らない頃にpythonで素直に解いていたので、最初はスルーするつもりだった。Schemeで同じように解いてもつまらないし、あれから何か凄い計算の効率化のアイデアを思い付いたわけでもないので。ちなみに、効率化についてはWikipediaにも工夫のしどころが掲載されているみたい(Collatz conjecture)。

むしろ、なんでこんな問題が数学の難問になってるのかが興味深いとこだ。そこでちょっと逆向きに考えて、1に収束するまでのステップ数ごとに数字の分布を見てみようと思った。
(define (one-step-far ls)
(cond ((null? ls)
'())
((and (even? (car ls))
(> (car ls) 4)
(zero? (remainder (- (car ls) 1) 3)))
(cons (/ (- (car ls) 1) 3)
(cons (* 2 (car ls))
(one-step-far (cdr ls)))))
(else
(cons (* 2 (car ls))
(one-step-far (cdr ls))))))

(define (gs step)
(let R ((step step) (collatz '(1)))
(cond ((zero? step) collatz)
(else
(R (- step 1) (one-step-far collatz))))))

収束先である1からの距離が10までの数字たちを並べると、こんな感じ。
gosh> (gs 1)
(2)
gosh> (gs 2)
(4)
gosh> (gs 3)
(8)
gosh> (gs 4)
(16)
gosh> (gs 5)
(5 32)
gosh> (gs 6)
(10 64)
gosh> (gs 7)
(3 20 21 128)
gosh> (gs 8)
(6 40 42 256)
gosh> (gs 9)
(12 13 80 84 85 512)
gosh> (gs 10)
(24 26 160 168 170 1024)
まあ、なんてことない結果なんだけど、やたらに密度が低いことがわかる。つまり、パラパラとしか数字が出現しない。この先、1に収束するまでのステップ数がnである数字の個数は、ほぼ10n/10のスピードで急激に増えていくんだけど、どんなにnを大きくしても、いつまでたっても出現しない比較的小さな数字が残ってしまう(実際、97はn=118で始めて出現する)。
gosh> (length (gs 10))
6
gosh> (length (gs 20))
72
gosh> (length (gs 30))
732
gosh> (length (gs 40))
7628
gosh> (length (gs 50))
79255
こういうパラパラとした自然数の集まりって、素数と同じように、現在の数学(つーか代数)ではうまく扱えない構造なんだろうな。

ところで上で定義したone-step-farを使って「キミならどう書く 2.0」の関数hを書くこともできる。
(use srfi-1)

(define (h n)
(let R ((rest (iota n 1))
(collatz '(1)))
(cond ((null? (lset-difference = rest collatz))
rest)
(else
(R (lset-difference = rest collatz)
(one-step-far collatz))))))
ただしcollatzの長さが爆発するので、これだとh(30)ですら止まらない。h(20)は18と19らしいんだけど……

2006/07/16

10年ぶりに北岳に登ってきた(考えてみたら3000m級に登るのも久しぶりだ)。10年前は北岳から農鳥岳にかけての白根山系を縦歩したんだけど、今回は時間的にも体力的にも無理だろうということで、山頂付近に2つある山小屋のうち「肩の小屋」で一泊して帰ってくるだけのルートを選択。とはいえ、登山口になる広河原の標高が1600mくらいなので、約1500mをひたすら登らなければいけない。ここ数年は奥多摩とか八ヶ岳でお茶を濁してきたので、ワコールの筋力サポート下着を導入することにした。

CW-X
http://www.wacoal.co.jp/products/cw-x/menu.html

まだワコールのサイトには紹介されてないみたいだけど、この7月からトレッキング用の「スタビライクス」という新商品が登山用品店限定で出荷されていたので、それを購入。15500円。どうでもいいけど、なんか山に行くたびに物欲が発動してる気がする。Uさんがいつも「男の子の潜在的な欲望は何かを成長させることだ」と言っていて(鹿野フィルタ済)、自転車趣味のUさんの結論は「自転車趣味は身体を鍛えてスペックアップする喜びと新しいパーツを手にいれてマシンをスペックアップする喜びが同居しているから男の子的に止められない」なんだけど、登山も似たようなものだと思う。しょーじき、実際に山に登るのは辛いことばかりなわけで、それを補う感動が山頂で得られるかというと、そんなこともない。むしろ、下界で「次に登るときはこれを持って行くとうれしいかもしれない」とか「ひざが弱ってきてるから毎日エレベータを使わずに階段を使うようにしよう」みたいなことを考えているのが一番楽しい。登山の醍醐味は、山頂に到達することではなく、出発までの妄想です。

まあ、そうはいっても山頂で晴れると嬉しい。

DSC_0150

今回はちょうど高山植物が一斉に花を咲かせる時期に登ることができた。富士山のシルエットきれいすぎ。

DSC_0183

希少種のキタダケソウ。平年は山頂付近に6月下旬にしか咲かない花なんだけど、今年は雪がけっこう残っていて、そのおかげで3株だけ花を見ることができた。ちなみに、上の写真の前景に咲いているのはキタダケソウではなくハクサンイチゲ。

DSC_0107

なぜか人気の高山植物、オダマキ。

DSC_0124

2006/07/12

夏休み。i.e. 出社しないとはかどる仕事をつぶす週間。とはいえ、平日に自由な時間がとれるんだから、映画のひとつくらいは観にいくし、今晩から明後日にかけては山にいくつもり。

というわけで ミッションインポッシブル3 を観てきた。あー、なんていうか、期待は裏切られませんでした。脇役たちがかっこいいし気が利いているので前作みたくトム・クルーズのオレ映画になってないし、スパイ映画的に分かりやすいきれいなお姉さんたちも単純に美人なだけでなくかわいらしいので共感できるし、飽き飽きするような謎解きに尺を割かず火薬が多めだし、まあ、要するに素直におもしろい。あたまを空っぽにして鑑賞するには最高だと思う。考えちゃだめ。「1作目ではリストラスパイの悲哀で観客の共感を呼び、2作目でアクションオンリーのオレ映画にしちゃって叩かれたから、3作目で新婚スパイの妻への愛を軸にして深みを出そうという意図ね」とか勘ぐっちゃだめ。「新婚スパイの妻への愛を描きましたってわりに、殺される直前に回想してんのが奥さんとのベットシーンばかりかよ」とか突っ込んじゃだめ。しかし、そのほうがスクリーン上では記号として分かりやすいのかもしれないけど、マトリックスも2作目は愛を描きますっていいながら結局はベットシーンだったよなあ。なんだかなあ。それは陳腐だ、ではなく、それは違うと思う。

金曜の夜に友人とビールを飲みながら、「死ぬ前に最後に何を食べるか選択できるとしたら」という話をしていた。うまいものや好物を食べたいというのもあるけど、冷静に100メートルくらい上から考えると、おうちで奥様と普通の食事がしたいです。照れくさいはなしですが。