指数の裏側

Eca2f293c36947e2a8944b39e57d105c?s=47 けんご
February 05, 2016

 指数の裏側

Eca2f293c36947e2a8944b39e57d105c?s=128

けんご

February 05, 2016
Tweet

Transcript

  1. 指数の裏側 プログラマのための数学勉強会@福岡 2016.02.05 @tkengo

  2. 立石 賢吾 Twitter : @tkengo RubyとJavaScriptが好きです。でも、トトロの方が もっと好きです。 github : @tkengo

  3. 数学関数 •今日は3つの数学関数の話をします •pow(a, b) •exp(x) •log(x) ab ex log x

    (loge x)
  4. 数学関数 •今日は3つの数学関数の話をします •pow(a, b) •exp(x) •log(x) •実装したことある人? ab ex log

    x (loge x)
  5. 数学関数 • とか は簡単に実装できそう • とか も簡単に実装できそう 24 79 e4

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

    は? • とか は? 24 79 e4 e10 20.5 31.7492 e 0.111 log 4 log 8 . 552
  7. 数学関数 •ということで今日は実装の話をします •そのために少し歴史の話をします •始まりは対数から...

  8. 対数

  9. 対数 • 指数関数の逆関数 • • • 16世紀頃にその概念が発見された y = ax

    x = loga y
  10. 時代背景(16〜17世紀) • 指数関数の概念はなかった • 科学、特に天文学が発展する • 複雑で桁数の多い数値計算が必要 • パソコンとかスマホとか無い •

    人々は紙と鉛筆を使って地道に計算していた
  11. 2756 7547 = ? x

  12. もっと簡単に計算したい...

  13. 掛け算を足し算にできれば 簡単なのに...

  14. 掛け算を足し算 • 当時、高精度な三角関数の表は既にあった • その表と、三角関数の積和の公式を使ってみる sin ↵ cos = 1

    2 (sin( ↵ + ) + sin( ↵ ))
  15. 掛け算を足し算 : 例 • 2756 x 7547 = ?

  16. 掛け算を足し算 : 例 • 2756 x 7547 = ? 0

    . 2756 = sin 16 , 0 . 7547 = cos 41 ↵ = 16 , = 41
  17. 掛け算を足し算 : 例 • 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 ))
  18. 掛け算を足し算 : 例 • 0.2756 x 0.7547 = 0.2080 なので

    • 2756 x 7547 ≒ 20800000
  19. 掛け算を足し算 : 例 • 0.2756 x 0.7547 = 0.2080 なので

    • 2756 x 7547 ≒ 20800000 • 実際は... • 2756 x 7547 = 20799532 • だいたいあってる 誤差: 468
  20. 対数の発見 • ジョン・ネイピア • 対数の発見者として語り継がれている • 三角関数を使う方法を見て考えてみた

  21. 対数の発見 もっと直感的な方法で 掛け算を足し算にしたる • ジョン・ネイピア

  22. 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を底にしたこんな表を使うと 対数の発見
  23. 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を底にしたこんな表を使うと 対数の発見
  24. • 2を底に使うと全ての数に対応できない • そこで... •     を底にすればいいんじゃ? 1 1 107

    0 1 2 3 4 1 0.9999999 0.9999998 0.9999997 0.9999996 x ✓ 1 1 107 ◆ x 対数の発見
  25. • もっと高い精度が欲しい • そこでもっと考えた... • 指数を少数にすればいいんじゃ? (つまりもっと微小な幅の表が欲しい) ✓ 1 1

    107 ◆ x = ✓ 1 1 107 ◆107 ! x 107 対数の発見
  26. • 対数の発見 • つまり を底とする ✓ 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
  27. の発見 e

  28. 対数関数と指数関数 • レオンハルト・オイラー • ネイピアの時代から約2世紀後 • 指数関数とその逆関数である対数関数を定義 • y =

    ax () x = loga y
  29. 対数関数と指数関数 • レオンハルト・オイラー logを微分したる

  30. • 微分の定義 対数関数と指数関数 lim h!0 f ( x + h

    ) f ( x ) h x + h x f ( x ) f ( x + h ) h f ( x + h ) f ( x )
  31. • 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 ◆
  32. 対数関数と指数関数 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 と置く
  33. 対数関数と指数関数 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
  34. 対数関数と指数関数 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
  35. • 対数関数と指数関数 lim n !1 ⇣ 1 + x n

    ⌘ n = ex ✓ 1 1 107 ◆107 ⇡ e 1 lim n!1 ✓ 1 + 1 n ◆n = e • • ← ネイピアが使った底
  36. 数学関数の実装

  37. 指数関数の実装 • を展開してみる 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 · · ·
  38. • を展開してみる 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! ◆ 指数関数の実装
  39. • • の周りでテイラー展開した結果と同じ • テイラー展開 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 + · · · 指数関数の実装 • この形であれば実装できそう • もちろん無限回計算は不可能。途中で打ち切る
  40. • ただし の範囲でしか成り立たない • 使えない・・・? • もテイラー展開すれば実装できそう • ただし 周りではテイラー展開できない

    • 代わりに を 周りで展開する 対数関数の実装 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
  41. • は浮動小数点数の表現 • 任意の実数 における と を求めるのは簡単 • 例えば なら

    • という風に分解する • と分解できる 対数関数の実装 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
  42. べき乗関数の実装 • もテイラー展開? • 実は と表せるので • 既に と は実装済みなので計算可能

    ab ex log x ab = eb log a
  43. • 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 · · · と
  44. おわり