離散数学 i 第10 - gunma university 2018-06-12 · コンパイラ...

24
離散数学 I 10 再帰 荒木 徹 電子情報理工学科 2018 年度 荒木 徹 (電子情報理工学科) 離散数学 I 10 2018 年度 1 / 24

Upload: others

Post on 06-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

離散数学 I 第 10回再帰

荒木 徹

電子情報理工学科

2018年度

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 1 / 24

Page 2: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

前回の演習

チェス盤の敷き詰め問題

縦横が 2n × 2nのチェス盤から,任意に一つの正方形を取り除いて得られるものを,欠損チェス盤 Bnとする.このとき,どんな Bnも何枚かの B1

で敷き詰めることができることを証明せよ.

証明.nに関する帰納法で証明する.n = 1のとき.明らかに B1は B1で敷き詰めることができる.

n = k のときに,任意の Bk が B1で敷き詰めることができると仮定する.

任意の Bk+1を考える.Bk+1は 2k+1 × 2k+1の欠損チェス盤である.こ

れを図のように 2k × 2k の大きさに 4分割し,これらを A,B,C ,Dと呼ぶことにする.

Bk+1で欠けている正方形は Aにあると仮定しても一般性を失わない1

1注:もし欠けている正方形が他の領域にあったとしても,同じ方針で証明ができる.

そこで無駄な場合分けを避けるために使われれる決まり文句.荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 2 / 24

Page 3: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

帰納法の仮定により,Aは B1で敷き詰めることができる.

また,B の左下,C の右上,D の左上を欠いたチェス盤を考える.それぞれは,また帰納法の仮定により B1で敷き詰めることができる.

最後に,B,C ,D で欠けた部分は,1枚の B1で敷き詰めることができる.

以上より,Bk+1は B1で敷き詰めることができる.

Figure: 欠損チェス盤 B1 と Bk+1.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 3 / 24

Page 4: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

課題 2:フィボナッチ数

任意の正整数 nに対して,n∑

i=1

Fi = Fn+2 − 1であることを証明せよ.

証明.nに関する帰納法で証明する.n = 1のとき.(左辺)= F1 = 1.(右辺)= F3 − 1 = 2− 1 = 1.したがって n = 1のとき成り立つ.k ≥ 1に対して,

∑ki=1 Fi = Fk+2 − 1であると仮定する.

このとき,∑k+1

i=1 Fi = Fk+3 − 1であることを示す.

k+1∑i=1

Fi = Fk+1 +k∑

i=1

Fi

= Fk+1 + Fk+2 − 1

= Fk+3 − 1.

したがって帰納法により成り立つことが証明できた.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 4 / 24

Page 5: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

The Tower of Hanoi

以下のルールに従って,すべての円盤を右端の杭に移動せよ.

最初は,すべての円盤が小さいものが上になるように積み重ねられ

ている.

円盤を一回に一枚ずつどれかの杭に移動させることができる.

ただし、小さな円盤の上に大きな円盤を乗せることはできない.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 5 / 24

Page 6: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

小さな例題

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 6 / 24

Page 7: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 7 / 24

Page 8: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

完成までのステップ数

ディスクが 1枚のとき 1ステップ

ディスクが 2枚のとき 3ステップ

ディスクが 3枚のとき 7ステップ

ハノイの塔

ディスクが n枚あるときの,完成までの最小のステップ数を求めよ.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 8 / 24

Page 9: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

ハノイの塔の解法を考える

ハノイの塔の解くためには

1 まず上の n − 1枚の小さいディスクを 2番めの杭に移す

2 一番大きなディスクを右端に移す

3 2番めの杭にある n − 1枚のディスクを 3番めの杭に移す

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 9 / 24

Page 10: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

再帰的に考える

大事な考え方

「n − 1枚のハノイの塔」が解ければ,n枚のハノイの塔も解ける.

なお「1枚のハノイの塔」は簡単に解ける.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 10 / 24

Page 11: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

Tn:n枚のディスクを移す最小ステップ数

Example:T1 = 1,T2 = 3,T3 = 7.

前のスライドから分かること

Tn ≤ 2Tn−1 + 1.

このように動かせば解ける

ちょっと考えると分かること

Tn ≥ 2Tn−1 + 1.

一番大きなディスクを動かすためには,上の n− 1枚をどこか 1本の杭に移さなければならない

一番大きなディスクは,少なくとも 1回は動かさなければならない

その後に,一番大きなディスクの上に,上の n− 1枚を動かさなければならない.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 11 / 24

Page 12: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

ハノイの塔の最小ステップ数

再帰式

1 T1 = 1,

2 n ≥ 2に対して Tn = 2Tn−1 + 1.

最小ステップ数

任意の n ≥ 1に対して,Tn = 2n − 1.

nに関する帰納法で証明する.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 12 / 24

Page 13: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

平面上の直線によってできる領域

問題

平面上に n本の直線を書いたとき,直線で囲まれる半平面の領域の数 Lnは,最大でいくつか?

Example:小さな値の nで考える.

Ln =???

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 13 / 24

Page 14: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

再帰的に考える

n本目の直線を考える

直線がすでにある領域を横切ると,その領域は 2つに分割される

よって,その横切った領域の数だけ,新しい領域が増える.

n本目の直線は,すでにある直線と n − 1回まで交差できる.

したがって,横切れる領域の数は n個まで.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 14 / 24

Page 15: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

領域の数

前のスライドから分かること

Ln ≤ Ln−1 + n.

多くても n個しか領域を増やせない

しかし

どの 2本の直線も平行でなく

どの 3本の直線も 1点で交わらない

ようにすれば,n番目の直線は他の n − 1本と交差する.

領域の数の最大数

1 L1 = 2,

2 n ≥ 2に対して,Ln = Ln−1 + n.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 15 / 24

Page 16: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

関数を再帰的に定義する

例題:次の関数は何を意味する?

関数 f : N+ × N+ → N+を次のように定義する.

f (m, n) =

{m m < nのとき

f (m − n, n) m ≥ nのとき

例題:次の関数は何を意味する?

関数 g : N+ × N+ → N+を次のように定義する.

g(m, n) =

{0 m < nのとき

1 + g(m − n, n) m ≥ nのとき

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 16 / 24

Page 17: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

集合を再帰的に定義する

例題:次の集合 Eは何を意味する?

1 0 ∈ Eである.2 k ∈ Eならば,k + 2 ∈ Eである.3 上の2つの条件を適用して得られるものだけが,Eの元である.

例題:次の集合 S は何を意味する?

1 5 ∈ S である.

2 x ∈ S かつ y ∈ S ならば,x + y ∈ S である.

3 上の3つの条件を適用して得られるものだけが,S の元である.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 17 / 24

Page 18: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

文字列とは

文字列:コンピュータサイエンスにおいて最も重要な概念の一つ

アルファベット

使用する文字の集合をアルファベットという.この講義では Σで表す.

文字列(string)

Σの要素を有限個並べてできる列 x = x1x2 . . . xnを,Σ上の文字列(または語)という.

空語(文字がない文字列)を λで表す.

文字列の連接(concatenation)

Σをアルファベットとし,x と y をΣ∗上の文字列とする.x と y の連接とは,x の後に y をつなげてできる文字列 x · y である.任意の x ∈ Σに対して,x · λ = λ · x = x と定義する.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 18 / 24

Page 19: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

文字列の再帰的な定義

文字列(38ページ,55ページ)

Σを文字の集合とする(これをアルファベットと呼ぶ).Σ上の文字列とは,次を満たすものである.

1 λは Σ上の文字列である.λを空語という.

2 s が Σ上の文字列であり,かつ x ∈ Σならば,x · s は Σ上の文字列である.

Σ上のすべての文字列の集合を Σ∗で表す.

例.Σ = {a, b}とする.Σ∗の要素は

λ

a, b

aa, ab, ba, bb

aaa, aab, aba, abb, baa, bab, bba, bbb

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 19 / 24

Page 20: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

文字列の長さ:再帰的な定義

文字列の長さ

文字列 s ∈ Σ∗の長さ |s|を,次のように定義する.1 |λ| = 0

2 s ∈ Σ∗かつ x ∈ Σならば,|x · s| = 1 + |s|.

|aba| = 1 + |ba|= 1 + (1 + |a|)= 1 + (1 + (1 + |λ|))= 1 + (1 + (1 + 0))

= 3

関数の再帰的定義

これは,関数 | · | : Σ∗ → Nを再帰的に定義している.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 20 / 24

Page 21: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

カッコの対応がとれている括弧列

例題

Σ = {(, )}とする.左右のカッコがきちんと対応している括弧列の集合 Pを定義しなさい.

“(()())”や “((()(())))”は対応がとれている括弧列.したがって(()()), ((()(()))) ∈ P.

“(((((()”は対応がとれていない括弧列.したがって (((((() ̸∈ P

“)()()(”や “())(()”も対応がとれていない括弧列.

コンパイラ

プログラミング言語のコンパイラをイメージしてみよう.カッコが多す

ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

ているはず.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 21 / 24

Page 22: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

考え方

Σ = {(, )}とする再帰的定義の基底:λ ∈ P とする

s ̸= λの場合を考えると,最初の文字は ‘(’ のはず.

先頭の ‘(’と対応する ‘)’の位置は,次の 2通りのいずれかのはず.

全体の括弧列の最後にある.つまり括弧列 s が対応がとれていて,かつ全体が (s)の形をしている.全体の括弧列の中間にある.つまり対応がとれた括弧列 s1, s2があって,かつ全体が (s1)s2 の形をしている.つまり,全体が対応がとれた二つの括弧列の連接になっている.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 22 / 24

Page 23: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

括弧列の再帰的な定義

対応がとれた括弧列の再帰的定義

Σ = {(, )}とする.括弧列の集合 P を次のように定義する.

1 λ ∈ P

2 s ∈ P ならば,(s) ∈ P である.

3 s1, s2 ∈ P ならば,s1 · s2 ∈ P である.

(()())() = (()()) · ()= ([()()]) · ([λ])= ([() · ()]) · ([λ])= ([([λ]) · ([λ])]) · ([λ])

→ (関連)テキスト 58ページ例 2.6,60ページ問 2.14

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 23 / 24

Page 24: 離散数学 I 第10 - Gunma University 2018-06-12 · コンパイラ プログラミング言語のコンパイラをイメージしてみよう.カッコが多す ぎたり足りなかったりすると,コンパイラがエラーを出して教えてくれ

今日の演習

課題 1

任意の n ≥ 1に対して,Ln = (n2 + n + 2)/2であることを証明せよ.

課題 2:関数の再帰的な定義

関数 pを,整数 n, k,ただし n ≥ k,に対して,p(n, k) = n(n − 1) . . . (n − k + 1)とする.関数を pを再帰的に定義せよ.

課題 3:回文

回文(上から読んでも下から読んでも同じになる文字列)を定義せよ.

ママが私にしたわがまま (ママガワタシニシタワガママ)

数学解くガウス(スウガクトクガウス)

ガウス(1777~1855)はドイツの天才数学者.離散数学(整数論)について大きな業績を残した.

荒木 徹 (電子情報理工学科) 離散数学 I 第 10 回 2018 年度 24 / 24