10月5日の日曜日、仕事で出社した帰りに本屋に寄って海事関連・コンピュータ関連の書籍を見てました。地方の本屋はそんなに品揃えは良くなく、今ではアマゾンなどのレビューを参考にするクセがすっかり付いちゃったので、書店に足を運ぶのも久しくなっていました。

さて、前々から「数学をちゃんとやっとかないといけなかったなぁ…」と中高生の数学の本を買って復習しようと思い、実際に何冊か本を買ってみたものの中々机に向かうことができず…。ちょうど参考書や数学の本が置いてあるコーナーが目に入ったので立ち寄ってみることにしました。

数学の本は畳一枚分くらいの棚にいろいろと難しそうなタイトルの本がありました。一番よく見えるところに見覚えがあるタイトルがあり、目にとまりました。

何冊かシリーズで出ていた本は「数学ガール」。以前、アマゾンのオススメに出てきてコミック版を買った本でした。コミック版上下巻を先に読んでしまったので、ちょっとイマイチ感があったんです。コミカライズした絵師の方には失礼なんですが、絵がしっくりこないのと、コミックならコミックとしての良さ(見せ方や演出)があるはずなんですが、あんまり面白いと思いませんでした。これはマンガで読むものじゃないなと。 その際に著者の結城浩さんのサイトにて原作であるWeb版をちょっとだけ読んでみて「こっちのほうがなんだかしっくりきていいなあ」と漠然とした感想を持ったまま、書籍化された小説版を読まないでいました。

手にとってぱらぱらと見てみると、数学の参考書なんかよりもよっぽど読みやすい口語文体が中心で、参考書が読み手に「覚えさせる」ことを主眼として書かれているのに対して、数学ガールは純粋に読み手に数学の面白さや美しさを紹介してくれ、あんまり強迫観念地味た情報の詰め込みがなさそうか気がしたので即、シリーズの一番最初の本を購入。

購入から1週間、それまで朝9時前から夜中の12時までの仕事がずっと続いていたので、ろくに読み進めてはいませんが、ちょっと読んだだけでも楽しいです。主題となっている数式遊びはもちろんですが、主人公やその他の登場人物のやりとりが計算し尽されているのかと思うほど「ちょうどいい」感じがしています。余計なストーリーを詰め込むことによってまどろっこしい舞台演出をするわけでもなく、かといって、教科書に出てくる加藤健や田中久美や、ネットワーク論議のアリスやボブのように、書き手が、「具体的なキャラクターを登場させて親近感を持たせ、それで覚えさせようとしている」といった、いかにも安直な手法であるとも思えません。 書き手の一方的な傲慢さがまったく無い構成が、非常に好感を持てました。

自分は一応ソフトウェアで飯を食っている人間なので、ソフトウェア界隈から見た視点で読み進めているところもあります。フィボナッチ数列を考える話では、数列から母関数、閉じた式を見いだし、さらに一般項を求める流れが簡潔にストーリー化されています。ソフトウェア視点で読みながふと思ったのは、次の場合分けした漸化式が登場した時点で、プログラミングの設計思考は止まってしまうんだろうなあ…と。

k=0→9のフィボナッチ数列を出力するプログラム

ネットで検索すればゴロゴロ出てくるんでしょうが、とりあえず「数学ガール」の漸化式だけを頼りにコードを書いてみると…

fib.c (Gist)

#include <stdio.h>

int fib(int k)
{
  if (k == 0)
    return 0;
  else if (k == 1)
    return 1;
  else if (k >= 2) {
    return fib(k-2) + fib(k-1);
  }
}

int main(int argc, char** argv)
{
  int k, n, a;
  for (k=0,n=10; k<n; k++) {
    a = fib(k);
    printf("%d ", a);
  }
  return 0;
}

fib.sh (Gist)

#!/bin/bash
# coding: utf-8

function fib()
{
  k=$1
  [ $k -eq 0 ] && echo 0 && return 0
  [ $k -eq 1 ] && echo 1 && return 0
  a=$(fib $(($k-2)))
  b=$(fib $(($k-1)))
  echo $(($a-$b))
}

for i in {0..9}
do
  echo $(fib $i) | tr -d -
done

漸化式のとおり、場合分けした上でk>=2の時に再帰的にk-2とk-1を呼び出しています。簡単ですねー。

出力

出力も大丈夫なようです。

0 1 1 2 3 5 8 13 21 34 

コードとしては場合分けで十分なことが多々あります。この数列を得る関数fib()も、上の実装で十分だと思います。むしろ場合分けを使わずに、あえて難解なコーディングで実装するほうが可読性を損ねる原因につながり、それは往々にして悪とも言えます。

しかし、数学はここで思考を停止させる理由はないのでどんどんと「美しい」形(≠難読化、どちらかと言えば標準化?)に成長させることができることを改めて印象づけられました。これは、実用性や可読性、安全性、安定性、速度といった日常的に大切にしなければない要素を捨て去り、ただただそのプログラミング言語の可能性や面白さを追求するために、あえて難読性を評価するIOCCCや、1バイトでも少ないコード量を追求した七行プログラミングと同じような楽しみがあります。

脳という量子コンピュータとそれを表現するあらゆるデバイス、ネットワークを備えた人類を一つのコンピューティングプラットフォームだとすると、そんな巨大なシステムが数千年の歴史の中で生み出してきた「数学」というソフトウェアには、現在存在するありとあらゆるプログラミング技術やハードウェア技術とは比べものにならないほどの高度な夢が詰まっている気さえします。これは絶対に勝てるわけがないなあ…と。

でも、コンピュータに対して絶望したわけでもありません。数学もコンピュータも切っても切れない縁があるわけで、対比できるようなものでもないし、それだけコンピュータの世界にも「数学のような可能性」がもっともっと存在する気がしてきて、嬉しくなってきました。

自分はソフトウェア屋としてはまだまだ三流だし、数学も全然できないので語る資格があるかないかで言えば後者だと思います…。ただ、そんな自分でもこういう楽しみを与えてくれる数学ガールは素晴しい本なんじゃないかと思いました。

ちなみに、数学ガールをTwitterでポロっとつぶやいて見たところ

数学ガール、色々と思い出しながら読むのに必死だけど、難易度をすごくすごく下げて説明してくれるから助かる…

— dyama (@dyama226)

2014, 10月 7

著者の結城浩さんにリツイートいただいてました。一読者としてそれだけで嬉しい気分になります。

数学文章作法という書籍も出されており、数学ガールでも語られていた「言葉の大切さ」などをうったえる活動を精力的にされているようです。

Amazon で見る