Redundanz

僕の言葉は、人と話をするためにあるんじゃない。

0902

 いつの間にか9月。

 今日は一日かけて計算数学Ⅰのレポートをやるつもりだったのですが、なかなかやる気が湧かず、午前中は末尾再帰について調べて過ごしていました。時折耳にする概念ではあるものの、その実態はよく知らず、少し気になったのです。インターネットの記事を読んだところでは、再帰をする際に、呼び出し先の関数に全てを預けてしまうタイプの再帰、という感じでした。これがどの程度まともな理解かはわかりませんが、とにかくそうすることによって、スタックオーバーフローを防げるはずです。というわけでrubyで書いてみたのですがうまくいかず。更に調べてみると、末尾呼び出し最適化というのをやらねばならないらしい事がわかりました。要はメモリをどの段階で開放するかみたいなところであれこれ言語ごとの仕様があって、普通にやるのではrubyでは末尾再帰の恩恵は受けられないらしい。インターネットを探すと、rubyで上手いこと末尾呼び出し最適化を実装している人も見つかるのですが、いまいち仕組みがよくわかりません。継続渡しなる概念でもなんとかなるらしいのだけど。ううむ、メモリ上でどんなふうにプログラムが実行されているのか、という実態を知らねばならないようです。ガベージコレクションの仕組みも少し気になる。

 夕方からようやく計算数学のレポートを書き始めました。レポート課題は3つあってそのうち一つやればよい形式だったのですが、2つは数学科らしく数学の課題で、数学の苦手な僕は仕方なくもうひとつの課題であるところの「debianに含まれているシェルスクリプトの読解」をやることにしました。
 そういうわけで/binとか/usr/bin辺りで手頃なスクリプトを探してみたのですけど、書きやすそうなものが全然ない。短すぎるか長過ぎるか、他のプログラムと依存関係にあるかで、唯一ちょうど良さそうなwhichなるスクリプトは、計算数学資料集の中にレポートの例として用いられており使えない(そりゃあないぜ先生)。仕方がないので適当にbzgrepなるものを選んで読んでみました。bzip2で圧縮された書庫に対しgrepを呼び出すスクリプト
 人が書いたコードをまともに読むというのは初めての経験だったのだけれど、これが案外難しい。まあ短いし処理は明確だからなんとなく分かるのだけれど、シェルスクリプトに関してはずぶの素人だし、意味不明な概念はあるし大変。八割がたはどういう処理をしているのかわかったのだけれど、ファイルディスクリプタ周りがついぞ理解できませんでした。ついったの友だちによるとOSの気持ちになれば分かるらしい。そんな時間と能力は現段階では、ない。内容を書き終わってlatexでpdfにしようという段階でも問題が起こりまくるし、だいぶ疲労しました。でも、頭を使った感覚はあって、それは楽しかったです。bashの理解がそれなりに深まったし。やっぱり必要に迫られたときの学習効率は高いですね。

 「すべてがFになる」の冒頭で真賀田四季博士が出題した問題。

「1から10までの数字を二組に分けてごらんなさい。そして、両方とも、グループの数字を全部掛け合わせるの。二つの積が等しくなることがありますか?」

 この前すべてがFになるドラマ化について友人と話していた時に、この問題を任意の連続自然数に拡張できるか、という話題になりました。なんとなくできなさそうな気がして、否定の証明を考えていたのですが、なかなかうまく行かず、条件をゆるめて、連続する自然数の積が平方数にならないことを示せないかと考えるも、それも証明できず。なんとなくモヤモヤしていました。
 それを今日思い出して調べてみたのですが、やっぱり連続自然数の積は平方数にはならないようです。エルデシュに証明されているらしい。*1証明の指針は、その時僕らが考えていたのと同じようにnと2nの間に素数が存在することを示すことらしいのですけれど、まだ良く読んでいません。気が向いたら考えてみよう。

 明日は計算論の本を読み進めます。9月9日の試験に間に合うかしら。