言語雑感

Perl:とりあえず、怪しいことをしたくなると唱える。一行しか書けない。読めない。
Bash:気がついたら出来ている。これを使って管理。
Ruby:10行から100行くらいまではこれでいくようになった。
Python:好感がもてる。
C++:標準語。お互いに意思疎通するときに使う。たまにネイティブがいると流暢すぎてよく分からない。template は邪悪。
asm:祭祀用。吟ずるもの。
Java:System.out.println な言語。アプレットのため展示のために書いてた。
Haskell:電卓として最強。エラーメッセージが分からん。計算量見積もり間違う。
PHP:これは言語じゃない。
OCaml:300行超えるときはこれで書くらしい。まだ、そんなに長いものを"計画的に"書いたことはない。
C:システムとしゃべる用。あとは数値計算に。
Fortran:知らないけれども、数値計算にいいらしい。嫌われているらしいね。
Scheme:Scheme で min-scheme を作ったときには感動した。
BASIC:すこーぷすこーぷすこーぷ。
Javascript:手元に notepad と IE しかない緊急事態にも使える。あとは、Greesemonkey でごにょごにょ。

haskell の fib は遅くない

http://d.hatena.ne.jp/nishiohirokazu/20100622/1277208908
に驚愕するような話が書かれていて、要するに、

fib = 1:1:zipWith (+) fib (tail fib)

は遅いと。何に驚愕したかというと、3点しかとらずに、「O(N ** 2.6)である。」と結論づけていることだ。空間使用量が O(N**2) で増えていくコードなのだから、そんなの空間計算量が一時的に影響与えたと考えるのが自然だろうに、その可能性も潰さずに原因も考えずに結論を出している。そんな適当な実験をするんだ、ということだ。

ランダウの記号 O(f(n)) は n が無限大でどのような関数で押さえられるか、についての表現だ。なので実行時間を論じているときには、n が 10^6 みたいな小さい値の周辺でフィットする行為は実行時間のオーダーを推測する補助手段でしかない。

fib !! n は、理論的に実行時の動きを考えると O(n**2) になる。
遅延評価ではサンクをつくるがそれは定数倍しか時間に影響を与えないのは当然だと思う。

import System
import List

fib = 1:1:zipWith (+) fib (tail fib)

main = do
  args <- getArgs
  print $ (0 *) $ (fib !!) $ read $ args !! 0

はじめにとったデータ。

10000 0.06
20000 0.16
30000 0.28
40000 0.44
50000 0.66
60000 0.9
70000 1.23
80000 1.62
90000 2.1
100000 2.56
110000 3.18
120000 3.92
130000 4.48
140000 5.31
150000 6.21
160000 7.24
170000 8.33
180000 9.27
190000 10.56

ここまでは、綺麗に O(n**2) にのっている。

perl -e '$i=10000;while($i<10000000){print "$i ".substr(`/usr/bin/time -o /dev/stdout -f "%e %U %S %t %K %p %F %R %c" ./a.out $i +RTS -K200M`,2);$i+=10000;}' | tee out.txt

(ただし、定数はこのままではない)

10000 0.03 0.01 0.00 0 0 0 0 797 11
20000 0.08 0.06 0.00 0 0 0 0 836 16
30000 0.19 0.16 0.00 0 0 0 0 937 37
40000 0.33 0.30 0.01 0 0 0 0 1277 50
50000 0.50 0.45 0.01 0 0 0 0 1297 83
60000 0.81 0.71 0.02 0 0 0 0 1572 137
70000 0.99 0.93 0.02 0 0 0 0 1978 75
80000 1.32 1.27 0.02 0 0 0 0 2270 53
90000 1.75 1.70 0.02 0 0 0 0 2271 46
100000 2.19 2.15 0.02 0 0 0 0 2564 25
200000 11.23 11.15 0.07 0 0 0 0 4398 32
300000 30.13 29.99 0.13 0 0 0 0 6782 68
400000 63.98 63.55 0.22 0 0 0 0 8004 739
500000 114.39 114.01 0.33 0 0 0 0 9736 706
600000 180.20 179.69 0.44 0 0 0 0 11987 892
700000 270.16 269.50 0.59 0 0 0 0 13974 1217
800000 409.71 408.42 0.74 0 0 0 0 15703 3437
900000 579.54 578.00 0.93 0 0 0 0 16923 4353

はじめは O(n**2) にのっているが、3*10**6 あたりからわずかにはずれる。ここをとりだして O(n**2) じゃないと騒いでたって事だね。

遅延評価だと(正格評価のつもりでいると予想しないところでメモリを食う、ので、メモリを食うとGCの影響やメモリ階層の影響がフクザツなので)実行時間が読みづらい、というのはあると思う。けど、実行される演算の回数は、必要な演算は結局最後には全部呼ばれるので、深く考えず普通に数えればok

http://twitter.com/kinaba/status/16854299925

法学は社会科学か

日本十進分類法の話か。それならよく知っている。納得。ちなみに、僕はジュンク堂書店新宿店で法律書コーナーにいるといわれ、実用書の階->人文書の階->社会科学の階と全部回ったことが。


たぶん、私が法学を社会科学に分類しないのは、中世ヨーロッパでは、神学・法学・医学・哲学の四学部に分けていたことの印象が強いからだ。だから、神学は科学ではないし、医学も科学ではないし、法学も科学ではない。科学の影響を受けていてもね! そして残りは哲学の末裔。


ラムザイヤーの法と経済学の序文から。

米国の法学教育がロー・スクールという大学院のレベルで行われるため、法学を学びに来る学生は、必ず他の分野を専門科目として勉強した経験を持つ。10年前のハーバード大学等には、他の分野においてすでに修士号や博士号を持ちながら、米国の1970年代のオーバー・ドクターの状況を前にして、もとの分野をあきらめてロー・スクールに入って来た者もいた。正直にいえば、私もその一人であった。
ロー・スクールに入る前に大学院で他の分野の研究を行っていた学生は、法学を他の学問と絶えず比較していた。私たち方向転換組の学生は、他の学生と同じように講義に出て、判例を読み、優秀なものは、ロー・レビューの編集委員になったが、他の社会科学分野における経験を有していたため、伝統的な法学研究に対して、どうしても不満を持つことが多かった。はっきりいえば、それは、不満というよりも、根本的な点における法学に対する失望であったといえよう。
ロー・スクールで、私たちは、判例の整理・分析の仕方を習った。すなわち、各分野の判例や立法をどのように筋の通った形で整理するかを習い、無秩序に存在する判例や法律にどのように秩序正しい外観を与えるかを習ったのである。それは、私たちが弁護士として自立するために必要な技術であり、また、現在でも、私は学生に対して、そのような技術を教えている。そして、私が、学生時代に、そのような知的ゲームに一種の面白さを感じたのも事実であった。
しかし、判例や立法の整理が学問でないことだけは、明らかであろう。簿記の研究と同じく、それは単なる技術であり、社会科学的研究でもなければ、哲学でもなかった。そのような疑問は、ロー・スクールの講義で習った判例の整理についてだけではなく、ハーバード・ロー・レビューの編集委員として読んだ論文の大多数にも及んだ。その中には、講義と同じく判例に理屈を付けようとしている論文もあった。しかし、それらは私にはやはり物足りなかった。規範的研究も、実際の世界に及ぶ法の効果をシステマティックに研究した上で法制度の改革を提案したものではなく、著者の個人としての単なる政治的価値判断を発表したものにすぎなかったからである。若い研究者の多くが「法と経済学」の方法論を用い始めた理由は、この失望にあったと思う。
米国の伝統的な法学研究の誤りは、法を「法学」という学問として取り扱おうとしたところにあったのである。なぜなら、学問には研究の方法論 (methodology) が必要であるが、法学には (判例や立法の整理以外には) 何の方法論もなく、作ろうと思っても作れないからである。それは、「法」が研究方法の人つではなく (また、社会科学の分野の一つでもなく)、社会の一つの「現象」にすぎないからである。いい換えれば、「法」、「社会に対する法の影響」、または「法に対する社会の影響」等は、研究の方法ではなく、研究し得る客体にすぎないのである。そして、その法という客体を研究するには何らかの方法論が必要であり、法学にはその方法論が全くないため、社会科学的研究を行うには他の分野から方法論を持ち込まざるを得ないのである。
そこで現われた研究方法論と研究現象の一つの一致が「法と経済学」である。一言でいえば、それは経済学で発展させられた方法論を通して、法的現象を研究する学問なのである。もちろん、葬式の慣行を研究するのに、経済学だけではなく、人類学、社会学、心理学等を用いることが可能であるのと同じく、法制度の研究にも、様々な方法論を用いることができる。経済学は、多くの法的問題を解決するにあたっての重要な方法ではあるが、最終的には、多くの研究方法の一つにすぎない。したがって、経済学を用いてもよいし、社会学を用いてもよいが、何らかの方法論を社会科学から持ち込まなければ法学が学問になり得ないことだけは、明らかである。

遺伝的に反社会的行動が行われることが分かってきたので、責任主義に対する批判が米国では行われているが、日本ではどうかと聞かれてこう答えた。
法学というのはローマ時代から続く古い学問(?)というか社会現象であり、近代以前のロジックが残っています。アメリカでも、他分野のポスドクロースクールに流れ込んだ70年代80年代以降に初めて社会学としてのディシプリンを持ったと聞きますので、日本は30年は遅れるのではないかと思います。
少なくとも、大学院で説明される学説(、大抵はいくつかの主要な学説をやりますが、その)レベルでは、責任主義を認めないものはなかったと思います。
私も責任主義には、どこかしら不合理なものを感じるのですが。


日本の文系という語は、数学理科ができないことしか意味していない。僕は自分で簡単な計量社会学の調査をして、法学部生に見せたところ、「へえー、理系の研究は面白いね」っていわれてショックだった。ちげえよ、これはどっちかといえば法学よりも文系に分類されるよ!

科学の価値

自然科学の研究をした人は、いかに自然が豊かな構造をもち、いかに人の浅慮の及ぶものではないか、を知っている。だから、謙虚だ。それに対し、多くの分野は人が理解できるものしか扱わないから極めて尊大な態度をとる人が多い。この比較だけからも科学に触れる価値は十分導けると思う。