フレッシュマンセミナー2005

46
情報科学への誘い 高校数学を学んできた諸君に 2005-06-15 国島丈生

Upload: takeo-kunishima

Post on 15-Feb-2017

27 views

Category:

Education


0 download

TRANSCRIPT

情報科学への誘い高校数学を学んできた諸君に

2005-06-15国島丈生

自己紹介• 知能メディア工学研究室(横田研究室)助教授

• 情報通信工学演習I(1年次)・情報通信工学実験B(2年次)

• 計算機言語I(2年次)

• コンパイラ・計算機言語II(3年次)

• 形式言語理論(修士1年次)

自己紹介• 京都大学工学部情報工学科(今の情報学部) (1989, M1991, D1994)

• 奈良先端科学技術大学院大学情報科学研究科助手(1994~1997)

• 岡山県立大学助教授(1997~)

興味のある分野• ソフトウェア技術• 構造化文書(XML)処理技術

• データベース• プログラミング言語• WWW技術

今日の内容• 高校数学から情報科学への橋渡し• 自分の(大学時代の)経験をもとに

• 注意• 私の経験が皆に役立つとは限らない• 私≠皆さん、皆さんも全員違う人間• 大学は(他の誰とも違う)自分を見つけていく場

学科を選んだ理由• 高校までコンピュータとは無縁• 友達のコンピュータでゲームをした程度

• 数学が好きだった• 理学部数学科だと就職に困りそう• {数理,情報}工学科の偏差値の高い方を選択

友達のコンピュータ

メモリ2~16KB

どんな時代?• 国産パソコン NEC PC-9801

• PC-9801VX01(1987年):CPU 8MHz, HDDなし(FDのみ), 353,000円

• Windows なんぞ当然なし• Sun3/60(4回生配属時に導入されたWS)

• CPU 20MHz, メモリ24MB

• 数百万円

実際のところは?• 物理が結構必要だった…

• 電気回路・電子回路など• 一般教養の数学は難しかった• 専門でも高校数学の延長(微分とか積分とか)は出てこなかった• どちらかというとパズルみたい

• 成績は…Dは少なかったが、B/Cは結構あったような?

後悔した?• そうでもない• もともとパズルっぽいものは好き• 高校数学とは別物と考えれば、結構おもしろい

• プログラムを書くのがおもしろい• ただし本当におもしろいと思い出したのは4回生でUNIXに触れてから

結局• 理論寄りの研究室に配属• 講義で教授が気に入った• ブール代数、アルゴリズム、論理設計• でも研究室内ではアウトサイダー(ソフトウェア)

• その後ソフトウェア寄りの研究室に鞍替え

未来は神のみぞ知る• 研究者としては割と回り道をしている• 有限オートマトン(B4~M2)

• データ工学、論理(D)

• HTML, WWW(助手)

• 関数型言語, Java, 形式言語(県立大)

• しかし• すべてが今の興味の対象(XML)に関連

今にして思えば• 情報工学の二面性• 計算機科学• コンピュータの構成に関する学問• 物理現象が関わってくる

• 情報科学• コンピュータ上で問題を解く学問• 計算手順、アルゴリズム

車の両輪• 情報技術者には両方の素養が必要• プログラムが書ければええやん→否• 問題の難しさを見極めなければいいプログラムは書けない

• 計算手順(アルゴリズム)• ハードウェアの制約

今、そして昔• 昔…情報技術者はオールマイティ• ハードウェアからソフトウェアまで• 学べる程度の範囲だった

• 今は?• カバーする範囲がとてつもなく広く深くなった• 学ぶ範囲はどんどん狭く(タコツボ化)

• 常識程度の知識はオールマイティであってほしい

情報科学への橋渡し

• 結城浩「プログラマの数学」

• ソフトバンク社、2200円

本を読もう• 時間のあるうちに• インターネットに頼るだけでは知識の底が浅くなる

• 情報科学関係のお勧め例

• コンピュータの名著・古典100冊(インプレス)

何が必要だった?• 離散の世界の数学• 0/1の代数(ブール代数)

• 集合、剰余系、場合の数、数学的帰納法、数列、etc.

• 苦手だったんですけど→情報科学の視点から、これから理解していけばOK

問題• 今日は日曜日です。100日後は何曜日?

• 1日後は月、2日後は火、…100日後は火

• 今日は日曜日。1億日後は何曜日?

• とても数えられません• 7の倍数日後はいつも日曜日。1億÷7

= 14285714 あまり 2。∴火曜日

問題

• 今日は日曜日。10100日後は何曜日?

• 10100なんてとても計算できません。7

で割った余りも計算できません

• 10nを7で割った余りを、n=1, 2, …で計算してみよう

すると• 100%7=1, 101%7=3, 102%7=2, 103%7=6,

104%7=4, 105%7=5, 106%7=1, 107%7=3, …

• %:余りを求める演算子

• nが1増えると、周期6で同じ数が出てくる(1, 3, 2, 6, 4, 5) 周期7ではない!!

• 100 % 6 = 4 ∴木曜日

プログラムにするとvoid nannyoubi(int n){

if (n%6 == 0) {printf(“月曜日¥n”);

} else if (n%6 == 1) {printf(“水曜日¥n”);

} else if (n%6 ==2) {/* 以下省略 */

}

問題生まれて2日経つと子を1匹産めるようになり、それ以降は毎日子を1匹産むという生き物がいる。

1日目に、生まれたての生き物を1匹もらったとすると、11日目には全部で何匹になっているか。

考え方• n日目に生きている生き物は

• n-1日目までに生まれていた生き物

• n-2日目までに生まれていた生き物が産んだ子供

• n日目の生き物の数をF(n)とすると

• F(n) = F(n-1) + F(n-2), F(1) = 1, F(2) = 1

• これに従って計算すると F(11) = 89

実は• 有名な数列(フィボナッチ数列)

• 一般項は複雑• しかしプログラムは漸化式そのもの(再帰関数)

F (n) =1√

5

{

(1 +

5

2)n + (

1 −

5

2)n

}

int F(int n){

if (n == 1 || n == 2) {return 1;

} else {return F(n-1)+F(n-2);

}}

問題川岸に、狼、山羊、キャベツをつれた人がいる。川には船が一艘あるが、一度にたかだか一つの荷物しか運べない。また、狼と山羊(山羊とキャベツ)だけを川岸に置いたまま人が離れると、狼(山羊)が山羊(キャベツ)を食べてしまう。このとき、すべての荷物を反対側の岸に運ぶ最短手順を求めよ。

どうやって解こう?• 最初は山羊を連れていくしかない• ほかのものだと食べられてしまう

• 山羊を対岸に残し、人だけで戻ってくるしかない

• 山羊を連れて帰ったら元に戻ってしまう

• …

書き方を決める• 人(P)、狼(W)、山羊(G)、キャベツ(C)

• 左岸にいるもの-右岸にいるもの

• 例:最初は PWGC-Φ

• Φ:何もいないことを表す

• 目標:PWGC-Φ から Φ-PWGC に至る最短経路を示すこと

図にしてみるとPWGC-Φ WC-PG PWC-G

W-PGCC-PWG

WGP-CPGC-W

G-PWCPG-WCΦ-PWGC

G Φ

G Φ

G Φ

ΦG

C

CWW

GGGG

WWC

C

枝のラベル:Pが対岸に運んだもの

結局• 最短手順は2通り• 最短手順以外の解が無数にある• 実は• 手順を示した図=有限オートマトン• 情報科学の基本概念の一つ• 文字列検索、論理設計など• 関連科目:離散数学、コンパイラ、形式言語理論(大学院)

どう考えたのか• 最初にできることは• 狼を連れて行く→山羊とキャベツ…×

• 山羊を連れて行く• キャベツだけ連れて行く→狼と山羊…×

• 人だけ渡る→狼と山羊、山羊とキャベツ…×

• 場合分けを繰り返す

局面の表現

• 各局面を「左岸にいるものの集合」「右岸にいるものの集合」の2つで表現

• 船で荷物や人が移動=2つの集合の要素が変化すること

• 移動中の状況は無視

変数• 高校数学と情報科学で最も変わるもの• 高校数学での変数とは• 未知数:方程式や不等式• 数の抽象化:関数

• プログラム(特にCなど)の変数とは• 値を保持する「器」• プログラムの実行に伴い値が書き換えられる

例:自動販売機• 飲み物1, 飲み物2, …の価格 p1, p2, …

• 飲み物1, 飲み物2, …が買えるか b1, b2, …(ランプのon/off)

• 投入金額 n

• 硬貨を投入するたび

• n が増える

• n ≧ pk なら bk を on に

• 飲み物kを購入したら

• n - pk > 0 なら n - pk を釣り銭に

難しく言うと• 変数p1, p2, …, b1, b2, …, n:ある瞬間の自動販売機の状態を表している

• 硬貨の投入/飲み物の購入によって、自動販売機の状態が変化

• つまり• 変数の値の変化=プログラムの実行

なぜこんな使い方を?• 演習Iのレポートの復習

• CPUはメモリ(HDD)上のデータを読み出し、計算し、結果をメモリ(HDD)に書き込む

• メモリ(HDD):0/1を保持する領域の集まり

• 変数/アルゴリズム≒メモリ(HDD)/CPU(フォン・ノイマン型計算機)

それでもなお学生:「先生、分からないんですけど」私:「アルゴリズムは分かるの?」学生:「それは何となく分かります」私:「そんなら、そのままプログラムにすればええやん」学生:「どうやってプログラムにしたらいいかが分からないんです」

Algorithm = Program?

• 否• Algorithm + Data Structure = Program

(by N. Wirth)

• プログラムには両方重要• アルゴリズム(計算手順)• それに適したデータ構造(変数、配列、構造体etc.)…高校数学やパズルにはまったくなかった部分

鍵はデータ構造• 局面をどう表すか• アルゴリズムの世界では…比較的自由• 線形リスト、スタック、待ち行列、木、二分木、配列、集合、…

• プログラムの世界では…単純、限定• Cだと:変数、配列、構造体、…

• データ構造をいかに翻訳するかが鍵• アルゴリズム⇔プログラムの翻訳はデータ構造の翻訳についてくる

諸君の健闘を祈る

レポート課題• 以下の問題のうち1問以上を解いてレポートにまとめよ。

• 6/21(火) 17:00までに2610に提出

• 用紙はA4が望ましい

• なるべく自分が知らなかった問題をやってみること

問題1:ハノイの塔台の上に3本の棒(左から順にA, B, C)が固定されており、Aにn枚の円盤がはまっている。円盤は下に行くほど半径が大きくなっている。次のルールを満たしながら、円盤をすべてBに移すのに必要な手数をnで表せ。• 一度に一枚の円盤しか移動できない• 移動の途中で円盤の大小を逆にしてはいけない

問題2天国と地獄の分かれ道に2人の人がいる。彼らはチャーチルとヒットラーであるが、どちらがどちらかは分からない。チャーチルは、質問には必ず本当のことを答える。ヒットラーは必ず本当と反対のことを答える。1回だけ質問をして、天国への道を見分ける方法を考えよ。

問題3問題2の変形として次の状況を考える。このとき2回の質問で天国への道を見分ける方法を考えよ。

• 分かれ道にいるのはチャーチル、ヒットラー、スターリン。

• スターリンは本当と嘘(本当と反対のこと)をランダムに言う。

問題4

図のようにかかっている7本の橋を、次の条件を満たしながらすべて渡りたい。渡れるなら手順を示し、渡れないなら証明を述べよ。

• それぞれの橋は一度しか渡れない。• それぞれの土地は何度通ってもよく、どこから開始しても、どこで終わってもよい。開始点と終了点が違っていてもかまわない。

将来に向けて• どの問題も関連する講義がある• 問題1:計算機言語I、情報通信工学実験B(再帰)

• 問題2・3:人工知能(論理)• 問題4:離散数学(グラフ理論)