2008年2月22日金曜日

銀河

京都へ出張した帰路, 3月14日で運転をやめる寝台急行銀河を利用した. 以前銀河で下ったときの乗客は半分以下で, 車掌といつまで運転するのかなぁと話したりした. 運転打ち切りの直前ともあって今回は満員であった.

寝ながら聞く鉄橋を渡る響き, すれ違う列車の音, まれに停車する駅の物憂いアナウンス, 「おはようございます. 何月何日何曜何時何分です」という車掌の声で朝を知る. 独特の寝台列車の朝の雰囲気である.

子供のころから寝付かれない夜は今寝台列車で旅していると考えるとすぐ眠れた. 「銀河鉄道の夜」も何度も読んだ.

最近利用する寝台列車は函館からの帰りの北斗星ばかりだが, 利用回数の多いのは銀河であった.

新幹線を併走する路線で寝台列車を利用するのは, 物好きといわれても仕方ない. 能登は残っているし, これからは金沢へ向かう能登と函館から戻る北斗星をときどき利用するだけになりそうだ.

ついでに
英字新聞を読んだ人からアメリカでは洪水で何万という人が寝ていて流されたと聞いたがこのsleeperは寝ている人ではないらしい. sleeperは寝台車であると同時に線路の枕木のことでもある.

2008年2月14日木曜日

knuthのGPS

電通大での講義の時に,GPS(general problem solver)の話をした.Algol 60の名前呼びの機能を最大限活用するものだ.


real procedure gps(i,n,z,v); real i,n,z,v;
  begin for i:=1 step 1 until n do z:=v; gps:=1 end


つまり4つの引数i,n,z,vはvalueと宣言していないからすべて名前呼びである.

これを使うプログラムは

i:=gps(i, if i=0 then -1.0 else i,p,
 if i=1 the 1.0 else
  if gps(a,i,z,if a=1 then 1.0 else
   entier(a)×(entier(i)÷(entier(a))=entier(i)∧a<i then 0.0
    else z)=z then
     (if p<m then=p+1 else i×gps(a,1.0,i,0.0)) else p)

プログラムを実行するとpにm番目の素数が入る

最初の行はiを制御変数にしてfor文をまわす.iは1になっているので終点はiということ,すなわちiはどこまでも増え続ける.forループで実行するのは変数pへの代入で,まずはiが1なので1.0が入る.
次はiが2になって代入文へくる.今回からpへ代入する値はelse以降3行目からになる.
そこでgpsを呼ぶ.今回は制御変数aで1からiまで増える.代入先はzで初回は1.0が入る.その後aは1ずつiまで増える.代入される値は4行目で計算する.ここでentierはAlgol 60の基本関数で小数点以下を切り捨てる. ÷の記号は商の小数点以下を切り捨てる除算. したがってここではiがaで割り切れるかを見ている. 割り切れてしかもaがiより小さければiには約数がある,素数ではない. そうならzにoを入れ,そうでなければzのまま. zには最初1を入れたが途中1つでも約数があると最後は0になっている.
一方このgpsから脱出してきたときの値はgpsの宣言の最後にあるように1である. zがそれに等しいというのはiが素数であったことである. そこで最後の行のelseより前を実行してその値をpに代入する. pがmより小さければp+1だからpはmになるまで素数のたびに1ずつ増える. 素数でなければp, つまり不変.
ということでm番目の素数が見つかったところで中ほどのelseの次に来る. iには今m番目の素数が入っている. gpsの値1を掛けてpに入れる. gpsの仕事はiに0を代入して外側のgpsのループを停止させることである. 問題は最後の乗算でiを先に評価すればよいが, gpsを先に評価すると大切なiの値が変わっていることだ.
まだ他にも微妙な点はあるが,いちおうこのようなプログラムだ.

2008年2月5日火曜日

計算機プログラムの構造と解釈

この冬学期,電気通信大学の大学院で記号処理特論という講義をしました.この学期には「計算機プログラムの構造と解釈」の4章,5章を説明しました.90分の講義15回でカバーするのは結構大変です.

私は実装に興味があるので,使い方の例題はほとんど無視してしまいました.また問題にも触れませんでした.

相当なスピードで進んだので,消化不良の学生さんもいたと思われます.

希望的にはMITのサイトからプログラムをダウンロードし,さまざまな例題でプログラムを走らせ,体験を通して理解して欲しかったと思います.(そうした人がいなかったとは言い切れません)

私個人は4章,5章が1350分で講義できたという経験が貴重です.講義の機会をいただいた電気通信大学に感謝しています.