Upgrade to Pro — share decks privately, control downloads, hide ads and more …

指数の裏側

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for けんご けんご
February 05, 2016

 指数の裏側

Avatar for けんご

けんご

February 05, 2016
Tweet

More Decks by けんご

Other Decks in Programming

Transcript

  1. 数学関数 • とか は簡単に実装できそう • とか も簡単に実装できそう • とか とか

    は? • とか は? 24 79 e4 e10 20.5 31.7492 e 0.111 log 4 log 8 . 552
  2. 掛け算を足し算 : 例 • 2756 x 7547 = ? 0

    . 2756 = sin 16 , 0 . 7547 = cos 41 ↵ = 16 , = 41
  3. 掛け算を足し算 : 例 • 2756 x 7547 = ? 0

    . 2756 = sin 16 , 0 . 7547 = cos 41 ↵ = 16 , = 41 • 積和の公式に代入する sin 16 cos 41 = 1 2 (sin(16 + 41 ) + sin(16 41 )) = 1 2 (0.8387 0.4226) = 0.2080 = 1 2 (sin 57 + sin( 25 ))
  4. 掛け算を足し算 : 例 • 0.2756 x 0.7547 = 0.2080 なので

    • 2756 x 7547 ≒ 20800000 • 実際は... • 2756 x 7547 = 20799532 • だいたいあってる 誤差: 468
  5. 16 · 32 = 24 · 25 = 24+5 =

    29 = 512 • 発想の雛形はこんな指数法則から。 2n2m = 2n+m 0 1 2 3 4 5 6 7 8 9 10 1 2 4 8 16 32 64 128 256 512 1024 x 2x ← 掛け算を足し算で計算した • 2を底にしたこんな表を使うと 対数の発見
  6. 16 · 32 = 24 · 25 = 24+5 =

    29 = 512 • 発想の雛形はこんな指数法則から。 2n2m = 2n+m 0 1 2 3 4 5 6 7 8 9 10 1 2 4 8 16 32 64 128 256 512 1024 x 2x 25 · 59 =? ← 掛け算を足し算で計算した ← じゃこれは?表の中には25も59もでてこない • 2を底にしたこんな表を使うと 対数の発見
  7. • 2を底に使うと全ての数に対応できない • そこで... •     を底にすればいいんじゃ? 1 1 107

    0 1 2 3 4 1 0.9999999 0.9999998 0.9999997 0.9999996 x ✓ 1 1 107 ◆ x 対数の発見
  8. • 対数の発見 • つまり を底とする ✓ 1 1 107 ◆107

    • 指数部 は少数になる x 107 ✓ 1 1 107 ◆107 ! x 107 0 1 2 3 4 0 0.0000001 0.0000002 0.0000003 0.0000004 0 … … … … x x 107 ✓ 1 1 107 ◆107 ! x 107
  9. • 微分の定義 対数関数と指数関数 lim h!0 f ( x + h

    ) f ( x ) h x + h x f ( x ) f ( x + h ) h f ( x + h ) f ( x )
  10. • logの微分 対数関数と指数関数 lim h!0 loga(x + h) loga(x) h

    = lim h!0 1 h loga ✓ x + h x ◆ = lim h!0 1 h loga ✓ 1 + h x ◆
  11. 対数関数と指数関数 lim h!0 loga(x + h) loga(x) h • logの微分

    = lim h!0 1 h loga ✓ x + h x ◆ = lim h!0 1 h loga ✓ 1 + h x ◆ = lim n!1 n x loga ✓ 1 + 1 n ◆ h x = 1 n と置く
  12. 対数関数と指数関数 lim h!0 loga(x + h) loga(x) h • logの微分

    = lim h!0 1 h loga ✓ x + h x ◆ = lim h!0 1 h loga ✓ 1 + h x ◆ = lim n!1 n x loga ✓ 1 + 1 n ◆ h x = 1 n と置く = 1 x lim n!1 loga ✓ 1 + 1 n ◆n = 1 x loga lim n!1 ✓ 1 + 1 n ◆n
  13. 対数関数と指数関数 lim h!0 loga(x + h) loga(x) h • logの微分

    = lim n!1 n x loga ✓ 1 + 1 n ◆ h x = 1 n と置く = 1 x lim n!1 loga ✓ 1 + 1 n ◆n = 1 x loga lim n!1 ✓ 1 + 1 n ◆n = lim h!0 1 h loga ✓ 1 + h x ◆ = lim h!0 1 h loga ✓ x + h x ◆ e
  14. • 対数関数と指数関数 lim n !1 ⇣ 1 + x n

    ⌘ n = ex ✓ 1 1 107 ◆107 ⇡ e 1 lim n!1 ✓ 1 + 1 n ◆n = e • • ← ネイピアが使った底
  15. 指数関数の実装 • を展開してみる ex ex = lim n !1 ⇣

    1 + x n ⌘ n = lim n!1 ⇣ 1 + x n ⌘ ⇣ 1 + x n ⌘ ⇣ 1 + x n ⌘ · · · = lim n!1 1n + nC11n 1 ⇣ x n ⌘1 + nC21n 2 ⇣ x n ⌘2 · · · = lim n!1 1 + nC1 1 n x + nC2 1 n 2 x 2 · · ·
  16. • を展開してみる ex ex = lim n !1 ⇣ 1

    + x n ⌘ n = lim n!1 ⇣ 1 + x n ⌘ ⇣ 1 + x n ⌘ ⇣ 1 + x n ⌘ · · · = lim n!1 1n + nC11n 1 ⇣ x n ⌘1 + nC21n 2 ⇣ x n ⌘2 · · · = lim n!1 1 + nC1 1 n x + nC2 1 n 2 x 2 · · · = 1 + x 1! + x 2 2! · · · ✓ lim n!1 nCk 1 nk = 1 k! ◆ 指数関数の実装
  17. • • の周りでテイラー展開した結果と同じ • テイラー展開 x = 0 ex =

    1 + x 1! + x 2 2! + · · · f ( x ) = f ( a ) + f 0( a ) 1! ( x a ) + f 00( a ) 2! ( x a )2 + · · · 指数関数の実装 • この形であれば実装できそう • もちろん無限回計算は不可能。途中で打ち切る
  18. • ただし の範囲でしか成り立たない • 使えない・・・? • もテイラー展開すれば実装できそう • ただし 周りではテイラー展開できない

    • 代わりに を 周りで展開する 対数関数の実装 x = 0 log x log(x + 1) x = 0 log(x + 1) = x x 2 2 + x 3 3 x 4 4 + · · · 1 < x < 1
  19. • は浮動小数点数の表現 • 任意の実数 における と を求めるのは簡単 • 例えば なら

    • という風に分解する • と分解できる 対数関数の実装 log x = log(c · 2 n ) = log c + n log 2 x = c · 2n (0 < c < 2) 予め計算して定数として保持しておける log 2 = 0 . 6931 · · · なのでテイラー展開可能 0 < c < 2 c · 2n x c n x = 10 c = 1.25, n = 3
  20. • log(x) と置いて 数学関数まとめ • exp(x) ex = 1 +

    x 1! + x 2 2! + · · · log(x + 1) = x x 2 2 + x 3 3 x 4 4 + · · · x = c · 2n を使う を使う • pow(a, b) ab = eb log a を使う log 2 = 0 . 6931 · · · と