Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

数学関数 • とか は簡単に実装できそう • とか も簡単に実装できそう 24 79 e4 e10

Slide 6

Slide 6 text

数学関数 • とか は簡単に実装できそう • とか も簡単に実装できそう • とか とか は? • とか は? 24 79 e4 e10 20.5 31.7492 e 0.111 log 4 log 8 . 552

Slide 7

Slide 7 text

数学関数 •ということで今日は実装の話をします •そのために少し歴史の話をします •始まりは対数から...

Slide 8

Slide 8 text

対数

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

時代背景(16〜17世紀) • 指数関数の概念はなかった • 科学、特に天文学が発展する • 複雑で桁数の多い数値計算が必要 • パソコンとかスマホとか無い • 人々は紙と鉛筆を使って地道に計算していた

Slide 11

Slide 11 text

2756 7547 = ? x

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

掛け算を足し算 : 例 • 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 ))

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

掛け算を足し算 : 例 • 0.2756 x 0.7547 = 0.2080 なので • 2756 x 7547 ≒ 20800000 • 実際は... • 2756 x 7547 = 20799532 • だいたいあってる 誤差: 468

Slide 20

Slide 20 text

対数の発見 • ジョン・ネイピア • 対数の発見者として語り継がれている • 三角関数を使う方法を見て考えてみた

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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を底にしたこんな表を使うと 対数の発見

Slide 23

Slide 23 text

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を底にしたこんな表を使うと 対数の発見

Slide 24

Slide 24 text

• 2を底に使うと全ての数に対応できない • そこで... •     を底にすればいいんじゃ? 1 1 107 0 1 2 3 4 1 0.9999999 0.9999998 0.9999997 0.9999996 x ✓ 1 1 107 ◆ x 対数の発見

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

• 対数の発見 • つまり を底とする ✓ 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

Slide 27

Slide 27 text

の発見 e

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

対数関数と指数関数 • レオンハルト・オイラー logを微分したる

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

• 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 ◆

Slide 32

Slide 32 text

対数関数と指数関数 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 と置く

Slide 33

Slide 33 text

対数関数と指数関数 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

Slide 34

Slide 34 text

対数関数と指数関数 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

Slide 35

Slide 35 text

• 対数関数と指数関数 lim n !1 ⇣ 1 + x n ⌘ n = ex ✓ 1 1 107 ◆107 ⇡ e 1 lim n!1 ✓ 1 + 1 n ◆n = e • • ← ネイピアが使った底

Slide 36

Slide 36 text

数学関数の実装

Slide 37

Slide 37 text

指数関数の実装 • を展開してみる 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 · · ·

Slide 38

Slide 38 text

• を展開してみる 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! ◆ 指数関数の実装

Slide 39

Slide 39 text

• • の周りでテイラー展開した結果と同じ • テイラー展開 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 + · · · 指数関数の実装 • この形であれば実装できそう • もちろん無限回計算は不可能。途中で打ち切る

Slide 40

Slide 40 text

• ただし の範囲でしか成り立たない • 使えない・・・? • もテイラー展開すれば実装できそう • ただし 周りではテイラー展開できない • 代わりに を 周りで展開する 対数関数の実装 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

Slide 41

Slide 41 text

• は浮動小数点数の表現 • 任意の実数 における と を求めるのは簡単 • 例えば なら • という風に分解する • と分解できる 対数関数の実装 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

Slide 42

Slide 42 text

べき乗関数の実装 • もテイラー展開? • 実は と表せるので • 既に と は実装済みなので計算可能 ab ex log x ab = eb log a

Slide 43

Slide 43 text

• 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 · · · と

Slide 44

Slide 44 text

おわり