最適化の手前の数学

2,507 views

Published on

2012年7月23日に名古屋GeekBarで開催された「数学ナイト2 @geekbar」で発表したスライドです。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,507
On SlideShare
0
From Embeds
0
Number of Embeds
1,072
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

最適化の手前の数学

  1. 1. MATH NIGHT 2最適化の手前の数学 @antimon2
  2. 2. チャプタ 1自己紹介 1
  3. 3. セク ショ ン 1自己紹介 (1)•名前:後藤 俊介 (@antimon2)•最終学歴:名古屋大学大学院多元数理科学研究科
      博士前期課程修了 (1999/03)(数学修士)•現役時代の専攻:組合せ数学(代数的組合せ論、グラフ理論)•修論のタイトル:Planer Vertex-transitive Graph の Hamiltonian 性 2
  4. 4. セク ショ ン 2自己紹介 (2)•所属:株式会社コスモルート
    CRD(クラウドR&Dグループ) 数学班•研究テーマ: •データ分析手法・ノウハウ(多変量解析、ベイズ解析、etc…) •ビッグデータ分析・機械学習 ※まだ実績なし•ブログ始めました: •名古屋で数学するプログラマ(仮)(http://antimon2.hatenablog.jp/) 3
  5. 5. チャプタ 2フィボナッチ数 4
  6. 6. みんな大好きフィボナッチ数列♪ もちろんみんな知ってるよね? 5
  7. 7.  …一応、定義から説明します。 6
  8. 8. セク ショ ン 1フィボナッチ数列とは?前の2つの数の和が次の数となる数列。 7
  9. 9. (0,) 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 8
  10. 10. フィボナッチ数列の一般項 Fn を フィボナッチ数 と言います。5 は 5 番目のフィボナッチ数。144 は 12番目のフィボナッチ数。etc… 9
  11. 11. チャプタ 3フィボナッチ数を求める コミック版「数学ガール」第13話(下巻 p.144) をTeXで再現 10
  12. 12. セク ショ ン 1問題【問題1】100番目のフィボナッチ数 F100 を求めよ。【問題2】n 番目のフィボナッチ数 Fn を求めるプログラムを書け。 11
  13. 13. 問題2 だけを考えます。問題1は、問題2ができれば n=100 を代入すれば解けるので。(テトラちゃんのようにがんばって手計算で解かなくても良いのでw) 12
  14. 14. セク ショ ン 2fib 関数 (1)def fib n return n.even? ? -fib(-n) : fib(-n) if n < 0 a, b = 0, 1 n.times { a = b + b = a } aend手続き指向の解答例。 13
  15. 15. F0 (= 0)、F1 (= 1)から、
F2 = F1 + F0、F3 = F2 + F1、…を順に n まで計算しているだけ。•シンプル。•計算量:O(n)。•F100は余裕で計算可能。 14
  16. 16. セク ショ ン 3fib 関数 (2)def fib n return n.even? ? -fib(-n) : fib(-n) if n < 0 return n if n < 2 fib(n-1) + fib(n-2)end関数指向の解答例。 15
  17. 17. フィボナッチ数の定義(漸化式)をそのまま実装。再帰。Fn = Fn-1 + Fn-2 , 
 Fn-1 = Fn-2 + Fn-3 ,
 Fn-2 = Fn-3 + Fn-4 , …
•直感的。•計算量:???•F50すらまともに計算できない(1時間以上かかる)。
 F100なんて計算始めた日にゃ…(>_<) 16
  18. 18. ⇒何らかの最適化が必要。•メモ化
…一度計算した値は覚えておいて、再利用する。
 →計算量を O(n) に抑えることが出来る。•末尾再帰
…再帰呼び出しを関数の最後に1回だけにするようにする。
 →こちらも計算量が O(n) に。 17
  19. 19. でもその前に。 18
  20. 20. セク ショ ン 4倍数公式n 番目のフィボナッチ数を (n/2) 番目あたりのフィボナッチ数を使って表す公式。 19
  21. 21. 証明概要: 20
  22. 22. セク ショ ン 5fib 関数 (3)def fib n return n.even? ? -fib(-n) : fib(-n) if n < 0 return n if n < 2 n.even? ? (fib(n/2-1)*2 + fib(n/2)) * fib(n/2) : fib(n/2)**2 + fib(n/2+1)**2end倍数公式を利用した実装例。 21
  23. 23. 倍数公式をそのまま実装。再帰。•計算量:O(log n) ※1•F100はもちろん、F1000くらいは余裕で実用に耐えうるスピード。
 F10000とかになるとやはり重くなってくる。
 ※普通の再帰と同じ問題。→メモ化、または末尾再帰による最適化が必要。
※1: 最適化実施後の計算量。 22
  24. 24. セク ショ ン 6参考:メモ化の例 ※仮想コードです。このままでは動作しません。cache = Hash.newdef fib n return n.even? ? -fib(-n) : fib(-n) if n < 0 return n if n < 2 cache[n] ||= n.even? ? (cache[n/2-1]*2 + cache[n/2]) * cache[n/2] : cache[n/2]**2 + cache[n/2+1]**2endPoint: 計算結果をキャッシュに保持。2回目以降はキャッシュ値を利用。 23
  25. 25. セク ショ ン 7参考:末尾再帰の例 ※仮想コードです。このままでは動作しません。def fib n return n.even? ? -fib(-n) : fib(-n) if n < 0 fib_iter 1, 0, 0, 1, nenddef fib_iter a, b, p, q, c return b if c.zero? case c when even; p, q, c = p**2 + q**2, (2*p+q)*q, c/2 else a, b, c = b*q + a*q + a*p, b*p + a*q, c-1 end fib_iter a, b, p, q, cendPoint: 再帰呼び出しを最後に1回だけにする(呼び出し回数削減)。※処理系によっては末尾再帰に対して最適化コンパイルが実施されさらに高速化。 24
  26. 26. セク ショ ン 8参考:フィボナッチ数の公式導出方法は略。
(証明するだけなら F0, F1 の値と Fn = Fn-1 + Fn-2 を満たすことは容易に確認可能) 25
  27. 27. セク ショ ン 9まとめ•数学的考察による「根本的な高効率化」はとっても重要。
 ⇒場合によっては O(n) → O(log n) の高速化。
•メモ化(キャッシュ)、末尾再帰(イテレーション)等の最適化も重要。
 ⇒でもこれらは「次の手段」。 26
  28. 28. チャプタ 4その他のトピック 27
  29. 29. セク ショ ン 1例えば…•コンピュータパズル
 ⇒解探索の前に、できる限り数学的に考察して枝刈り・高効率化。 •例:「変形魔方陣」(http://antimon2.hatenablog.jp/entry/2012/05/15/230829)•素数列挙
 ⇒既知のアルゴリズムでも、数学的考察に基づく少しの工夫で倍速化。 •例:「汎用的で省メモリかつかなり速い素数無限列挙」
 (http://antimon2.hatenablog.jp/entry/2012/06/19/221335) 28
  30. 30. チャプタ 5The library is closed ! ご清聴、ありがとうございます 29

×