ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

素数夜曲 女王陛下のLISP

素数夜曲 女王陛下のLISP読みました。簡単に感想を。

本の内容

 タイトル通り数学とLispの本です。
 この本は大きく前半と後半(付録)に別れています。前半は算数から数学に自然に入って行くような内容が講義形式で話が進みます。整数、最大公約数から入り、無限、有理数無理数と、数を扱った数学をわかりやすく説明しています。この本の基本スタンスが、「手を動かして自分で法則に気がつく」事を重視しています。数学の楽しみ方を音楽に例えているのははじめて見ました。音楽の楽しみ方が、下手でも良いから演奏することのように、数学に関しても主体的に取り組んでいくことがとても大事というのは共感できます。プログラミングも同じですね。数学の本なのに英語の表記を併記してあるのは助かります。よくわからないところは、検索しもって読んでいくと面白いと思います。時々AAで書かれた検索梟が登場して「○○」で検索しろと教えてくれます。私は無限と濃度の所は特に面白く感じました。自然数と偶数が同じ程度に多くある事を受け入れるためには、無限を受け入れないといけない所に無限の深さを感じました。まあ、無限だからどこまでも深いんですけどね。
 後半はSchemeの文法の説明が最初にあって、Schemeを使って数学のいろんな問題を解いていきます。ただ解くだけではなく、結果を可視化する所が良くできています。実践的なプログラムを作ると言うよりは、プログラミングを通して数学と向き合うところがメインです。SICPλ計算を加えて内容を数学側に振ったような内容です。非決定性計算、無限ストリームのような概念だけでなく、チャーチ数、Yコンビネータクオータニオンモンテカルロ乱択アルゴリズムまでいろんな概念をSchemeで実装していきます。

Schemeプログラムの紹介

この本の中から、Schemeのプログラムを一つ紹介します。付録Dに出てくるオイラー函数です。
オイラー函数とは、与えられた数n未満の数の中で、nと互いに素(relatively prime)な関係にある数の個数を表します。例えば、n=6の時、n未満の数は1,2,3,4,5となり、6と互いに素な数は1と5なので、φ(6)=2と表せます。本書ではもう少し数学的に突っ込んだ話があるのですが、0から999までのこのオイラー函数を求めるコードがこれです。本書と若干iotaの動きが違うのと、出力部分は利用しやすいように少し変更しています。

; オイラーの函数
(define (totient n)
  (apply +
         (map (lambda (x)
                (if (= 1 (gcd n x)) 1 0))
              (iota n))))
; 出力部
(map (lambda (x)
       (let ((t (totient x)))
         (format #t "~A,~A~%" x t)))
     (iota 1000))

これをプロットするとこのようになります。

このグラフの規則性と素数の持つ不規則性から、『素数の魅力は、こうした"矛盾の中にある"』と話を締めくくっています。この結果を面白いと思うのであれば、この本はおすすめです。

おすすめの人

 高校3年生なら、ゆっくり読んでいけば十分理解できる内容だと思います。夏休み等まとまった時間があれば是非挑戦して欲しいです。数学ガールが好きな人も楽しめると思います。