最近Pythonと数学に関する話に興味を持つようになり、色々と気になる本や記事を漁っています。
個人的な話、Pythonについてはエンジニア認定基礎試験の資格を持っているぐらいの知識はありますが、それを数学的に応用するにはどうやったらいいの?という感じでした。
そういう感じで漠然と何かやってみたいなーと思いネットを探していたら面白そうな本が見つかりましたのでここで紹介したいと思います。

書籍の紹介

Pythonではじめる数学の冒険 Peter Farrell 著 / 鈴木 幸敏 訳

著者のPeter Farrell氏は数学とコンピュータサイエンスの教師をしてきており、その経験を元に書かれたのがこの本だそうです。
Pythonを利用した問題解決の方法や数学知識をベースにした図形の描画方法など様々な例を学ぶことができます。
文体は柔らかめで読みやすいですが、本の中盤辺りから数学的な話に踏み込んだ内容が多くなってくるため、コードの1行1行をしっかり理解しながら読み進めないと分からなくなってきます。

各章の内容とコメント

各章の大まかな内容と読んでみた感想やコメントなどを簡単に書いていきます。

1〜3章

1章はPythonの標準モジュールであるturtleを使い、図を描画するための基本中の基本を学びます。
ただし、今後(4章以降)本格的に描画を行う場合はProcessingという描画ツールを使っていくことになるので、turtleであることは重要ではありません。
2、3章はPythonの基本的な内容について書かれています。
もうPythonは分かるよ!という人はサラッと流し読みするだけでもいいかもしれません。
3章の後半にあるランダムウォークの描画や平方根を自力で見つけるロジックなどは大切です。

4、5

ProcessingとPythonを利用して描画するための基本事項を学びます。
円や多角形やそれらを組み合わせた基本的な図形の描画がメインです。
簡単な二次関数などの描画もあります。

6、7章

三角関数や複素数を応用した図の描画がメインです。
ここから発展的な数学の内容が含まれてきて、描画する図もより複雑なものになります。
スピログラフのような図形やマンデルブロ集合といったものを描画します。

8章

Pythonで行列の計算を行う方法とその応用について学びます。
基本的な行列同士の和・積の計算をプログラムで表現する方法を示した後、2次元・3次元座標空間での図形の変換操作や連立方程式を解く方法について述べられています。
数学的な理屈の説明は「まあそんなもんか」と読み進めて行けると思いますが、実際にプログラムとして記述する段階になると割と複雑で、行列の各要素の対応関係や行と列の処理順などをじっくり追っていかないとかなり混乱するところだと思います。

9章

オブジェクトの考え方を利用して簡単なライフゲームのようなものを作ります。
牧草が生えている領域内を、羊に見立てた点が動き回り、誕生、牧草を食べる、繁殖(分裂)、死亡(消滅)といったライフサイクルを繰り返す様子をモデル化します。
羊のライフサイクルに関するロジックをたくさん記述していくことになりますが、数学的な話はあまり出てこないので8章や10章に比べれば理解しやすい内容だと思います。

10章

再帰処理を利用してフラクタル構造の図形を作成します。
「フラクタルツリー」や「コッホ雪片」などの複雑な図形を少しのコードで一瞬にして描けるのは感動ものです。
章の一番最後に出てくる「ドラゴン曲線」の概念とコードは割と難易度高めで、最初読んだときは結構悩みました。

11章

9章をさらに応用した感じで、セルオートマトンを利用して本当のライフゲームを作ります。
二次元のグリッド状に並んでいるセルが、簡単なルールに基づいて生存、死滅、復活の状態を繰り返す様子をシミュレーションすることができます。
章の最後には、二進法を利用したルールに基づくセルオートマトンが紹介されていて難易度が上がります。
各セルに隣接する上下左右斜めのセルを走査して状態を参照するロジックは、このセルオートマトンの他にも色々使える場面が多そうです。

12章

任意の文章を推定する問題、複数の点を結ぶ最短経路を見つける問題の2つを通して遺伝的アルゴリズムの基本について学びます。
最終章だけあってかなり難易度が高いように思われますが、今後コンピュータサイエンスを学んでいくためには越えないといけない関門ですね。
まだ理解しきれていない部分もあるのでじっくり読み返したいです。

おわりに

幅広くコンピュータサイエンスとはどういうものかを知るためには丁度良い本だと思います。
ただし、この本では数学を道具として使っていくことに重きが置かれているため、例えばスピログラフの座標を表す式は何でこうなるのか?回転行列は何故こう表されるのか?などと気になる人は別途自分で深掘りしてフォローしていく必要があります。
入門編としては最適だと思いますので、これを足がかりにもう少しステップアップした書籍にも取り組んでいこうと思います。

おまけに、冬らしく雪を降らせてみました。
このProcessingコードはこちらに載せましたので興味ある方はどうぞ。

持ち回りで書いているブログですが、自分の分を先延ばし先延ばしにしていたらこれが今年最後の記事になってしまいました。
それでは皆さま、良いお年を。