arusu0629のブログ

UnityエンジニアからiOSエンジニアへ

「プログラマの数学」を読んで

サボりぐせが早速出てしまいました...!
が、気にせずに書いていきます。

2018年の目標として「1ヶ月に1冊本を読む」という目標を立てていて、 今のところはリーダブルコードしか読めてません(笑)

2冊目として読んでいたプリンシプルオブプログラミングは半分ほど読んでちょっと飽きてしまっていて、ちょうど数学ガールでお馴染みの結城さんの本が新しく出るということでプログラマの数学」を読んで少し整理するために振り返ろうと思います。

※基本的には読みながらノートにメモした言葉を連連と書くだけです。

1章 ゼロの物語

メモ:大きな問題は小さな「まとまり」に分けて解け
→問題全体をいきなり解くのではなく、小さな「まとまり」に分けることから始めることが大切。

2章 論理

メモ:「だぶり」がないことー排他的であること
論理和論理積など大学生に学んだことを思い出しました。論理表を書くことの大切さやベン図、カルノー図など実際に図解することで理解が深まりました。
またカルノー図は複雑な条件式を簡略化することが出来る方法だとこの本を読んで気付いたので、これからの仕事でも活かすことが出来そうだなと思いました。

3章 余剰

メモ:同期性を見抜く。
   余剰は同期性を活用するための道具。
   余剰を使って、大きな数の問題を小さな数の問題に落とし込む
   オセロで通信
  「正確な把握」よりも「的確な分類」の方が役に立つ場合もある

→余剰も日頃からよく使っているモノかな、と思いました。例えば奇数や偶数判定時に余剰をしばしば使っています。

if (x % 2 == 1) // 奇数
if (x % 2 == 0) // 偶数

本書ではもっと大きな枠として「同期性」について繰り返し説明していたような気がします。余剰を使うことでグルーピングすることができたり大きな問題を小さくすることが出来たりと...!
「オセロで通信」はコラム的な形で紹介されており、個人的にすごい面白かった内容なので多分メモってたんだと思います(笑)是非皆さんに読んでほしいです!

4章 数学的帰納法

5章 順列・組み合わせ

→メモがありませんでした...(汗)
もう1度ちゃんと読み直さないといけないかもしれないです...

6章 再帰

メモ:数えるとはー整数との対応付け
→あるものを数えるときに「0,1,2,3,...」とそれぞれのものに整数の「ラベル」のようなものを割り当てることを「数える」という行為であると解釈しました。後の章に出てくる内容で「カウンタブル」などに通ずる話だなーと全部を読んで思いました。

再帰はプログラムを書くときにも偶に出てきたりすると思いますが、自分はこの再帰を使うことがなかなか苦手なので、この章をもう少し深く理解して仕事に活かせるようになったら良いなと思いました。

再帰を扱うにはこれまでに出てきた、小さな問題に分けてみたり、パターンを見抜いたり、規則性、同期性がないかを見つけて初めて再帰だと気付くと思うので、つくづくこの本は今までの話がどの章にも絡んでくる重要な事柄だと感じました。

あと「組み合わせは順序を考えて重複度」で割るという考え方も新しかったです。
今までは順列や組み合わせを公式として覚えているだけだったので...

7章 指数的な爆発

→メモがありませんでした...(2回目汗)
ただ最近読んだ内容なので、覚えている内容としては倍倍には気をつけろ!ということです。
有名なコラムでもありますが、厚さ1mmの紙をどんどん折っていくと数十回では月まで届くようなものすごい大きな厚さになってしまうという話を例にあげていました。

また逆にその指数的な爆発を味方にすることができれば強力な武器にもなると!
本書ではバイナリサーチ(2分探索)について触れていました。
指数は数が大きくなるのでそれを扱いやすくすために「対数」という話にも触れていました。どんどん学生時代に習った内容がより分かりやすく、具体例をもとに説明されているので読んでて凄く楽しかったです。学生時代にこういう風に習っておけば...と数学ガールを読んだ時のような思いになりました(笑)

8章 計算不可能な問題

メモ:「カウンタブル」ー「集合の要素が有限個であるか、または集合のすべての要素を1以上の整数と一対一に対応付けられる」集合のこと。
→正直この章は1番理解が浅いのであと2,3回はこの章を読まないといけないと思っています...(汗)
計算不可能とは答えがなかったり、計算にものすごく時間がかかるという意味ではないらしく、「絶対に解けない問題」と解釈したほうが良いんでしょうかね...!

もう1つのメモとして「任意のプログラムの振る舞いを調べる問題はプログラムで解くことが出来ない」も印象的というか読んでいてほんの少しだけ理解できた気がします。

プログラムを書いていると時々誤って無限ループ(=処理が一生終わらない)になってしまうコードを書いてしまうことがあり、それをプログラマートライアンドエラーで解決します。
しかし、その解決を別のプログラムが行うことはできないみたいな例だった気がします!(ちゃんと理解できていないので間違って解釈していたらすみません...)

仮に上記のことが出来てしまうと現在未解決の数学問題を解けてしまうことになると背理法の考え方で矛盾が生じるとも話していました。
とにかくあと数回は読み直さないと理解できなかったです!(笑)

9章 プログラマの数学

メモ:問題の構造を見ぬき、それをシンプルに表現し、一貫性のあるルールにまとめる。
→この1文に本書の全てが表現されているな、と思いました!

確かに日常的なプログラマーの仕事では難しい数学の知識や数式が出てくることはめったにないと思います。普通は義務教育の範囲内で履修する内容で解くことが出来る問題だらけですが、色々なしがらみを持って(コロコロ変わる仕様や無理なスケジュールなど...)問題を複雑にしている気がします。

その問題をいかにシンプルに解くか、シンプルに解くにはどうしたら良いか、大きな問題を小さくしたり、構造を見抜いて規則性や同期性を見つけて一般化することが出来たりと...!そういうことが大事なんじゃないかと。

またそうやって解く1つの方法として「実際に小さな数字(=問題)に当てはめてみて解いてみる」という方法も本書ではよく登場していて、普段自分がよく行う手段だなーと思って、自分がやっている解決のアプローチはあながち間違いではないと思ったりもしました(笑)
そこから一般化する事ができれば汎用的にその問題を解くことが出来る!(汎用的というと語弊があるかもしれませんが...)

この章はまとめの章となっていて、各章について数行で振り返りをしていました。この章を読むだけでも十分理解できるというか、簡単に読むことが出来る内容だったので凄くよくまとめられていると思いました。(全章を読んだ前提があるかもしれませんが...)



最後に

結城さんの本は数学ガールもそうですが、先生と生徒の会話や面白いコラム、最初は何を言っているか分からない名言のような言葉(=ちゃんと内容に関連している)が個人的には凄く楽しくて、スラスラ読める理由なのかなーと思いました!