狠狠撸

狠狠撸Share a Scribd company logo
MATH NIGHT 2



最適化の
手前の数学




  @antimon2
チャプタ 1

自己紹介




         1
セク ショ ン 1




自己紹介 (1)
?名前:後藤 俊介 (@antimon2)

?最終学歴:名古屋大学大学院多元数理科学研究科?
 ?????博士前期課程修了 (1999/03)(数学修士)

?現役時代の専攻:組合せ数学(代数的組合せ論、グラフ理論)

?修論のタイトル:Planer Vertex-transitive Graph の Hamiltonian 性




                             2
セク ショ ン 2




自己紹介 (2)
?所属:株式会社コスモルート?
 ???CRD(クラウドR&Dグループ)?数学班

?研究テーマ:

       ?データ分析手法?ノウハウ(多変量解析、ベイズ解析、etc…)

       ?ビッグデータ分析?機械学習

       ※まだ実績なし

?ブログ始めました:

       ?名古屋で数学するプログラマ(仮)(http://antimon2.hatenablog.jp/)

                             3
チャプタ 2

フィボナッチ数




         4
みんな大好き
フィボナッチ数列?
 もちろんみんな知ってるよね?


       5
?…一応、定义から説明します。




                  6
セク ショ ン 1




フィボナッチ数列とは?




前の2つの数の和が次の数となる数列。




                     7
(0,) 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …




                                                    8
フィボナッチ数列の一般項 Fn を

           フィボナッチ数
                 と言います。



5 は 5 番目のフィボナッチ数。

144 は 12番目のフィボナッチ数。etc…


                     9
チャプタ 3

フィボナッチ数を求める




              コミック版「数学ガール」第13話(下巻 p.144) をTeXで再現




         10
セク ショ ン 1




問題

【問題1】
100番目のフィボナッチ数 F100 を求めよ。


【問題2】
n 番目のフィボナッチ数 Fn を求めるプログラムを書け。




                11
問題2 だけを考えます。
問題1は、問題2ができれば n=100 を代入すれば解けるので。

(テトラちゃんのようにがんばって手計算で解かなくても良いのでw)




                   12
セク ショ ン 2




fib 関数 (1)
def fib n
    return n.even? ? -fib(-n) : fib(-n) if n < 0
    a, b = 0, 1
    n.times { a = b + b = a }
    a
end



手続き指向の解答例。



                            13
F0 (= 0)、F1 (= 1)から、?
F2 = F1 + F0、F3 = F2 + F1、…を順に n まで計算しているだけ。



?シンプル。

?計算量:O(n)。

?F100は余裕で計算可能。




                              14
セク ショ ン 3




fib 関数 (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
フィボナッチ数の定義(漸化式)をそのまま実装。再帰。

Fn = Fn-1 + Fn-2 , ?
 Fn-1 = Fn-2 + Fn-3 ,?
  Fn-2 = Fn-3 + Fn-4 , …?


?直感的。

?計算量:???

?F50すらまともに計算できない(1時間以上かかる)。?
 F100なんて計算始めた日にゃ…(>_<)




                            16
?何らかの最適化が必要。

?メモ化?
…一度計算した値は覚えておいて、再利用する。?
?→計算量を O(n) に抑えることが出来る。

?末尾再帰?
…再帰呼び出しを関数の最後に1回だけにするようにする。?
?→こちらも計算量が O(n) に。




                     17
でもその前に。




          18
セク ショ ン 4




倍数公式




n 番目のフィボナッチ数を (n/2) 番目あたりのフィボナッチ数を使って表す公式。




                     19
証明概要:




        20
セク ショ ン 5




fib 関数 (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)**2
end

倍数公式を利用した実装例。




                             21
倍数公式をそのまま実装。再帰。



?計算量:O(log n) ※1

?F100はもちろん、F1000くらいは余裕で実用に耐えうるスピード。?
 F10000とかになるとやはり重くなってくる。?
 ※普通の再帰と同じ問題。

→メモ化、または末尾再帰による最適化が必要。?
※1: 最適化実施後の計算量。




                        22
セク ショ ン 6




参考:メモ化の例
   ※仮想コードです。このままでは動作しません。

cache = Hash.new
def 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]**2
end

Point: 計算結果をキャッシュに保持。2回目以降はキャッシュ値を利用。




                                23
セク ショ ン 7




参考:末尾再帰の例
   ※仮想コードです。このままでは動作しません。

def fib n
   return n.even? ? -fib(-n) : fib(-n) if n < 0
   fib_iter 1, 0, 0, 1, n
end
def 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, c
end

Point: 再帰呼び出しを最後に1回だけにする(呼び出し回数削減)。

※処理系によっては末尾再帰に対して最適化コンパイルが実施されさらに高速化。



                                           24
セク ショ ン 8




参考:フィボナッチ数の公式




導出方法は略。?
(証明するだけなら F0, F1 の値と Fn = Fn-1 + Fn-2 を満たすことは容易に確認可能)




                           25
セク ショ ン 9




まとめ

?数学的考察による「根本的な高効率化」はとっても重要。?
 ?場合によっては O(n) → O(log n) の高速化。?


?メモ化(キャッシュ)、末尾再帰(イテレーション)等の最適化も重要。?
 ?でもこれらは「次の手段」。




                            26
チャプタ 4

その他のトピック




         27
セク ショ ン 1




例えば…

?コンピュータパズル?
 ?解探索の前に、できる限り数学的に考察して枝刈り?高効率化。

  ?例:「変形魔方陣」(http://antimon2.hatenablog.jp/entry/2012/05/15/230829)

?素数列挙?
 ?既知のアルゴリズムでも、数学的考察に基づく少しの工夫で倍速化。

  ?例:「汎用的で省メモリかつかなり速い素数無限列挙」?
    (http://antimon2.hatenablog.jp/entry/2012/06/19/221335)




                                            28
チャプタ 5

The library is closed !


         ご清聴、ありがとうございます




               29

More Related Content

最适化の手前の数学