結城浩さんのプログラマの数学を読了したよ!!
プログラマの数学 第2版
備忘録的に。今後はもっとちゃんと書評書きたいな。
結城さんの本は昔、デザインパターン学習時に大変お世話になりまして、 以来、難しいことを分かりやすく丁寧に説明して頂ける文章のすっかりファンとなってます。
そして今回、僕のような理系苦手プログラマの鬼門である数学。 なんなら高校時代めっちゃ赤点でしたからね、数学。
1章 0の物語
- なぜ0が必要なのか
- ルールがシンプルになる
- なぜコンピュータでは2進数が使われているのか。
- コンピュータもわかりやすい方がいい
- 指数法則
- ...101 = 10, 100 = 1, 10^-1 = 1_/10...
- 102 * 103 = 102+3
なんとなくプログラムの指数表現に対しても抵抗がなくなった気がする
2章 論理
- 「もれ」や「だぶり」のない網羅的で排他的な分割を行う
- 「ならば」という命題
- カルノー図による論理の整理
- 未定義を含む論理
プログラマとしては避けて通れない
if文がややこしくなったときに、テーブル駆動で対応してたんですが、 カルノー図で整理できたらもっと分かりやすく書けるかもしれないですね。
3章 剰余
- 周期性と余りによる簡略化
- 1010000日後は何曜日?
「問題を単純化する」ということは、 メソッドやクラス分割にもつながりますね。
4章 数学的帰納法
- 「基底の証明」と「帰納の証明」で無限に対抗する
- F(1)を証明する // 1でなくてもよい
- F(n+1)が成り立つことを証明する
5章 順列・組み合わせ
すごいあやふやになんとなく解いていた5P3とか4C2がようやく腑に落ちました。 組み合わせの場合は「重複を取り除く」なんですね。 キーワードは「順列」「置換」「組み合わせ」。 前半は集合演算の基礎っぽいのもあったので、RDB理解に役立つかも。
6章 再帰
再帰的なメソッドはいままでにも書いたことがあるけど、 今ひとつループより可読性が落ちている気がしてました。 漸化式ならば再帰処理で実装したほうがよさそう。 漸化式は、前のn-1(1とは限らないけど)を利用して解にするような式。
7章 指数的な爆発
紙を折り続けると月に届くという話は有名ですが、そういえばドラ◯もんのバイバインも指数的な爆発起こしてますね。 指数的な爆発を含むときは総当りはNG。バイナリサーチ(二分探索)などのツールを使って対応する必要があります。 また、これまたあやふやだった、logを学べました。
8章 計算不可能な問題
「背理法」というツールの紹介がありました。 証明したいことの否定を命題として仮定して、矛盾を探すという証明法です。
カウンタブルな集合とは、順序付けをすることが出来、漏れが存在しない集合。 カウンタブルかつ無限、はありえる、がカウンタブルでないかつ無限もまた存在する。
「停止判定問題の証明」というのも紹介されてましたが、これはなかなか僕には難しい…。 一度理解するまで読んでもしばらくするとあれれってなりますね。再読しよう。
9章 プログラマの数学とは
ここまでのおさらいと総括。 問題を「別の世界に移して考える」ことが大事なんだなーと。 問題を「抽象化・一般化する」のと合わせて、現実問題にも応用していきたいと思います。
付録1 機械学習への第一歩
「入力ベクトル」「出力ベクトル」「目標ベクトル」「重みパラメータ」などなど…。 あと「ニューロンネットワーク」や「深層学習」「予測問題」「分類問題」などなど…。 機械学習は要するに、与えられた「入力ベクトル」を基に「出力ベクトル」を「目標ベクトル」に近づくような形で コンピュータ自身が「重みパラメータ」を調整していくようなもの…なのかな。 今後重要なトピックなので、今後も学んでいきたいです。
過学習の説明の例がわかりやすかったです。
感想
ちょっと数学がす、好きになってき、きました。。。 プログラミングにあんまり理数系かって関係ないよなあ、 と思っていたけど 現実世界の法則のモデリングという意味では、 プログラムにもやっぱり近いのかな…。