何もないところから数を作る
TRANSCRIPT
何もないところから数を作る
2015/07/24 第4回プログラマのための数学勉強会
@taketo1024
今日のテーマ
「数とは何か」
「万物の根源は数である」
ピタゴラス (BC 582~496)
ピタゴラス (BC 582~496)
「万物の根源は数である」
自然数とその比
無理数などないピタゴラス
死刑ピタゴラス
先生、これ無理数ですけど…
弟子A
1
1
√2
ピタゴラス教団のシンボル
1 黄金比 φ 👈 これも無理数ww
ぐぬぬ…
ユークリッド (BC 300~?)
『原論』の著者で「幾何学の父」。 「数」はやはり自然数のことになっている。
古代ギリシャの滅亡と共にギリシャ数学は衰退、 イスラム世界に引き継がれ代数学が発展していく。
代数方程式の解としての「無理数」
' : 1 = 1 : '� 1 , '('� 1) = 1
, '2 � '� 1 = 0
' =1±
p5
2
13世紀頃、数学はヨーロッパに再輸入され次第に復活。 16世紀のルネッサンス期にはアラビア数字も採用され、
印刷技術の発展と共に急速に発展していく。
17世紀:科学革命の時代
ニュートン、ライプニッツによって微積分学が発明される。 位置や速度など連続的に変化する量を解析する手段が確立される。
アイザック・ニュートン (1642 ~ 1727)
ゴットフリート・ヴィルヘルム・ライプニッツ (1646 ~ 1716)
連続的に変化する量としての「実数」
t
x
18世紀もさらに物理学への応用として微積分学が発展していくが、「無限小」「極限」などが曖昧なままで
変な結果が色々と出てきた。
1X
n=0
(�1)n = 1� 1 + 1� 1 + 1� 1 + 1� 1 + ...
= (1� 1) + (1� 1) + (1� 1) + (1� 1) + ...
= 0
= 1� (1� 1)� (1� 1)� (1� 1)� (1� 1)...
= 1
0 = 1
「解析学に幾何学で要求するような完全な厳密さを与えよう」
コーシーとワイエルシュトラウスによって無限小や極限が定式化される。 → 理系大学生殺しの εδ 論法の完成!
19世紀:数学の基礎と抽象化
"-�
オーギュスタン=ルイ・コーシー (1789 ~ 1857)
カール・ワイエルシュトラス(1815 ~ 1897)
「幾何学で要求するような完全な厳密さ」
経験や直観によらず、定義・公理から出発し、 論理的な手続きのみによって理論を展開していく方法。
=
数列や関数の極限を扱うためには、 そもそも「実数」とは何かを定式化しなければいけない!
実数の公理1.四則演算(+, -, ×, ÷)ができる。
2.実数同士で大小(≦)が比較できる。
3.実数全体はつながっている。
実数の公理
👆 この「連続性」が有理数との決定的な違い! しかしこの事実を定式化するのはとても難しい…
1.四則演算(+, -, ×, ÷)ができる。
2.実数同士で大小(≦)が比較できる。
3.実数全体はつながっている。
「連続性」の定式化• R の空でない有界な部分集合は上限を持つ。
• R の上に有界な単調増加数列は収束する。
• R の有界な数列は収束部分列を持つ。
• 中間値の定理、最大値の定理が成り立つ。
• …
→ 実は全部同値になる。これが「定理」ではなく「公理」なのだ。 この辺でだいたいみんな数学に見放された気分になる。
難しい話はともかく…
実数の公理
1.四則演算(+, -, ×, ÷)ができる。
2.実数同士で大小(≦)が比較できる。
3.実数全体はつながっている。
→ 実数とはこういうものだとして、さらに極限や連続なども粛々と定義していけば、解析学は曖昧さや矛盾なく作り上げていくことができる。
うーん…
一方的に「これは公理です」って言われるのは、 「これは仕様です」って言われるモヤモヤに似てる。
【朗報】
実数は有理数を「完備化」することで作れる!
じゃ有理数はどうやって作るの?
有理数は整数同士の割り算で作れる!
整数は?
整数は自然数を二つ繋げて作れる!
自然数は?
自然数は…
「空集合」から作る!!!
何もないところから数を作る
@taketo1024
2015/07/24 第4回プログラマのための数学勉強会
自然数を作るには、 まず自然数とは何かを定める必要がある。
自然数の公理1. 最初の数 0 ∈ N が存在する
2. 任意の a ∈ N にはその「次」 a+ が存在する
3. a+ = 0 なる a は存在しない(N は 0 から始まる)
4. a ≠ b ならば a+ ≠ b+ (a+ は単射)
5. N では数学的帰納法が成立する
以上を満たす集合 N を自然数系と呼ぶ
フォン・ノイマンによる自然数系の構成
として順に作っていく。
1. 0 = {} (空集合)
2. a+ = a ∪ {a}
復習:集合の合併 ∪
={A, B, C} ∪ {D, E} {A, B, C, D, E}
={A, B, C} ∪ {} {A, B, C}
• 0 = {}
• 1 = 0+ = 0 ∪ {0} = {0}
• 2 = 1+ = 1 ∪ {1} = {0} ∪ {1} = {0, 1}
• 3 = 2+ = 2 ∪ {2} = {0, 1} ∪ {2} = {0, 1, 2}
• ...
1. 0 = {} (空集合) 2. a+ = a ∪ {a}
• 0 = {}
• 1 = {0}
• 2 = {0, 1}
• 3 = {0, 1, 2}
• ...
1. 0 = {} (空集合) 2. a+ = a ∪ {a}
• 0 = {}
• 1 = {0} = { {} }
• 2 = {0, 1} = { {}, { {} } }
• 3 = {0, 1, 2} = { {}, { {} }, { {}, { {} } } }
• ...
1. 0 = {} (空集合) 2. a+ = a ∪ {a}
ね、簡単でしょう?
→ 難しい場合は、空集合を 猫 に置き換えて考えましょう。
• 0 = 🐱
• 1 = {0} = { 🐱 }
• 2 = {0, 1} = { 🐱, { 🐱 } } 👈 さっきの写真
• 3 = {0, 1, 2} = { 🐱, { 🐱 }, { 🐱, { 🐱 } } } • ...
1. 0 = 🐱 (空集合) 2. a+ = a ∪ {a}
簡単でしょう?
はじまりは何でもいいので、 空集合にしとけば何も用意しなくて済むってだけ。
自然数系に順序と演算を入れて行きましょう!
• 0 = {}
• 1 = {0}
• 2 = {0, 1}
• 3 = {0, 1, 2}
• …
集合として 0 ⊂ 1 ⊂ 2 ⊂ 3 ⊂ … となっている。 ⊂ を ≦ とすれば自然数系には順序が入る。
• a + 0 = a
• a + (b+) = (a + b)+
和 a + b の定義
• a + 0 = a • a + (b+) = (a + b)+
和 a + b の定義
3 + 2 = (3 + 1)+
= ((3 + 0)+ )+
= (3+ )+
= 4+
= 5
• a × 0 = 0
• a × (b+) = (a × b) + a
積 a × b の定義
3 × 2 = (3 × 1) + 3
= ((3 × 0) + 3) + 3
= (0 + 3) + 3
= 3 + 3
= 6
積 a × b の定義• a × 0 = 0
• a × (b+) = (a × b) + a
…何やってんの?w
自然数はアルゴリズムで構成できるということ
ふざけたことを…
「空配列」を空集合と見て、 プログラムで実装しちゃいましょう。
struct N: Equatable, Printable { private let val: [Any] private init(_ val: [Any]) { self.val = val } static var zero: N { return N([]) } }
postfix operator + {} postfix func +(n: N) -> N { return N(n.val + [n.val]) }
func +(n: N, m: N) -> N { if(m.val.isEmpty) { return n } else { return (n + m-)+ } }
func *(n: N, m: N) -> N { if(m.val.isEmpty) { return N.zero } else { return (n * m-) + n } }
https://gist.github.com/taketo1024/d60e0b8ba479921f7b16
DEMO
何もないところから自然数が作れました!
作れた後は 0 が空集合だとかいうことは忘れて、普通の自然数として扱っていい。
(普段プログラミングするときに機械語のこと考えないようなモン)
N0 1 2 3 4 5 6 7 …
次、整数 Z を作ります。( Z はドイツ語の「数」を意味する Zahlen から)
N-N0 1 2 3 4 5 6 7-7 -6 -5 -4 -3 -2 -1
N を二つ 0 のところで貼り合わせて、 正負の場合に分けて演算を定義すればいいだけ。
もっとカッコイイやり方:
N0 1 2 3 4 5 6 7
7
6
5
4
3
2
1
N
0 1 2 3 4 5 6 7
もっとカッコイイやり方:
7
6
5
4
3
2
1
0 1 2 3 4 5 6 7
もっとカッコイイやり方:
7
6
5
4
3
2
1
x - y = 0x - y = 1x - y = 2x - y = 3x - y = 4x - y = 5x - y = 6x - y = 7
0 1 2 3 4 5 6 7
もっとカッコイイやり方:
7
6
5
4
3
2
1
0
1
2
3
4
5
6
7
x - y = -1-1-2-3-4-5-6-7
もっとカッコイイやり方:
0 1 2 3 4 5 6 7
7
6
5
4
3
2
1
0
1
2
3
4
5
6
7
-1-2-3-4-5-6-7
「直線上に並ぶ点たち」をまとめて一つの整数とすればいい。
👈 (n, 0) が n ≧ 0 に対応
(0, n) が n ≦ 0 に対応 👉
こうすることで演算が簡単に定まる:
例) 5 - 8 = (5, 0) + (0, 8) = (5, 8) = (0, 3) = -3
例)3 × (-2) = (3, 0) + (0, 2) = (3 × 0 + 0 × 2, 3 × 2 + 0 × 0) = (0, 6) = -6
Z0 1 2 3 4 5 6 7-7 -6 -5 -4 -3 -2 -1
先ほどと同様、もうこの先は普通の真っ直ぐな整数として扱っていい。
Z は +, -, × で閉じた「環」になる。
次、有理数 Q を作ります。( Q はイタリア語の「商」を意味する Quoziente から)
Z (分子)
Z (分母)
Z (分子)
1
Z (分母)2
34 1/1 = 2/2 = 3/3 = 4/4 = …2 = 2/1 = 4/2 = 6/3 = …
1/2
「 (0, 0) と (p, q) を結ぶ直線上の点をまとめたもの」が p/q
Z (分子)
Z (分母)
(p, q) を q = 1 に射影したものが p/q と考えても良い。
Q
(5, 4)
5/4
演算は小学校で習った通りに定義する
例) 2/3 + 3/5 = (2, 3) + (3, 5) = (10, 15) + (9, 15) 👈 通分 = (19, 15) = 19/15
例)3/4 × 2/7 = (3, 4) × (2, 7) = (3 × 2, 4 × 7) = (6, 28) = (3, 14) 👈 約分 = 3/14
Q は +, -, ×, ÷ で閉じた「体」になる。 限りなく密に分布しているが、まだ無理数の穴が空いている。
Q
ではいよいよ、実数 R を作りましょう!( R はもちろん Real Number の R)
Q に空いている無理数の穴はどうやったら埋められるか?
Q⇡ep
2
0 1 2 3 4
Q の中で目標の無理数に近づいていく数列を考える。
Qe
0 1 2 3 4
e
x =1X
n=0
x
n
n!
= 1 + x+x
2
2+
x
3
6+
x
4
24+ ...
ほぼチートだが、テイラー展開:
e
x =1X
n=0
x
n
n!
= 1 + x+x
2
2+
x
3
6+
x
4
24+ ...
e =1X
n=0
1
n!
= 1 + 1 +1
2+
1
6+
1
24+ ...
ほぼチートだが、テイラー展開:
より、 x = 1 として、
👈 有理数の無限和
e =1X
n=0
1
n!
= 1 + 1 +1
2+
1
6+
1
24+ ...
なので、有限部分和を取れば、
a0 = 1
a1 = 2
a2 = 2.5
a3 = 2.666...
a4 = 2.708...
...
a0 = 1
a1 = 2
a2 = 2.5
a3 = 2.666...
a4 = 2.708...
...
Qe
0 1 2 3 4
この数列は Q の中で e に近づいていくので、 この数列のことを e ってことにすればいい。
なんかずるい。
全ての無理数は有理数列の極限として表せるのか?
→ それは知らない。 そもそも「無理数」であることが分かってる数も一部。
ee, e⇡,⇡e などは無理数かどうかまだ知られていない。
じゃあダメじゃん。
人智を超えた「超越的」方法で作る
このような有理数列の「全体」を考え、色々な近づき方でも同じところに落ち着いていくものをまとめたものを、ひとつの実数ってことにする。
Qe
0 1 2 3 4
カントールの実数論
コーシーが定めた連続・極限の概念を元に、 1872年に「コーシー列」の極限として実数を定式化した。
ゲオルク・カントール (1845 ~ 1918)
「デーデキント・カット」 Q の「切断」一つ一つを実数ということにする。
Qe
0 1 2 3 4
もうひとつのやり方切断
リヒャルト・デーデキント(1831 ~ 1916)
これらの構成法によって作られた「数」は、 「連続性」を満たすことが証明できる(とても難しい)
なぜこんなに難しいのか?
実数の公理
👆 当たり前だと思ってたこの性質がそれだけ特別だから!
1.四則演算(+, -, ×, ÷)ができる。
2.実数同士で大小(≦)が比較できる。
3.実数全体はつながっている。
ちなみに
R から 複素数 C を作るのは簡単。 R×R に (0, 1) × (0, 1) = (-1, 0) となる掛け算を入れるだけ。
R
iR C
z
w
zw
まとめ
φ < N < Z < Q <<< R
空集合から出発して、順に実数まで構成していくことができた!しかし Q と R の間には、離散と連続の超えがたい壁があった。
まとめ
φ < N < Z < Q <<< R
空集合から出発して、順に実数まで構成していくことができた!しかし Q と R の間には、離散と連続の超えがたい壁があった。
👆 これはどうやって作るの?
「空っぽの集合」は実在するのか?
→ 公理論的集合論 (1908)
公理ばっかりやん…
19世紀以降、 なぜ数学はどんどん公理化されていったのか?
数学の独立と自由のため。
(…と僕は思う)
前提条件を徹底的に明確にする代わりに、 何を前提とするかを選べる自由を得た。
公理系は自由に採用していい(作ってもいい)。 6 + 7 = 1 でも 1 / 0 = ∞ でも良い。
ユークリッドの公理を満たさない 「非ユークリッド幾何学」も19世紀に確立された。
厳密な論理の上に広がる自由で創造的な 数学の世界を楽しみましょう…!
Thanks!
Twitter: @taketo1024Blog: http://taketo1024.hateblo.jp