２００４年度前期・数理解析・計算機数学 I
理学部数理学科４年・大学院多元数理科学研究科
講義担当：内藤久資
実習担当：内藤久資・久保仁【講義の内容】
情報科学・計算機と数学との関連を（１年間で）概観する. 特に, 「アルゴリズム」とは何かを, 数学の視点から実例を通して解説する. そのアルゴリズムの実現のためのプログラム言語としてＣ言語の習得を目指す.

▼ 前期の内容
前期では計算機内部での数値の表現方法や, 「ユークリッドの互除法」, 「エラトステネスのふるい」などの極めて初歩的なアルゴリズムを概観する. また, 数学とは直接は関係しないが, コンピュータを利用する上での基礎的な教養としてのコンピュータリテラシ（コンピュータの歴史・原理やコンピュータネットワーク）を解説する.

▼ 必要な基礎知識
数学的な内容は「高校までに学習した数学」で十分である. しかし, 単なる数学的な知識だけが要求されるのではなく, その内容を理解するために必要な考え方を身につけていることが重要である.

▼ 履修のためのアドバイス「コンピュータの授業」は「コンピュータの使い方」を習得するためのものではない. コンピュータを単なるユーザとして利用するだけではなく, コンピュータを基礎から数学的な立場で理解するための努力を惜しまない学生のみを歓迎する. たとえ教職免許の取得が主目的であっても, この考え方を理解して履修してほしい.

【講義の目的】コンピュータと数学が深い関わりを持っていることをアルゴリズムという視点から考える. また, コンピュータおよびネットワークの基礎を理解することにより, それらを正しく使える汎用的知識・能力とコンピュータに何をさせることができるのかを判断・創造する力を身につけることが主要な目的である. また,プログラム言語の仕様を正しく理解することを通じて, アルゴリズムを正しく実装する力を身につけるとともに, コンピュータの動作原理と言語仕様との関連を理解する. さらに, アルゴリズムを正しく理解するだ
けではなく, それを正確に表現する方法やプログラムとして正しく実装する手段を習得することも重要な目

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I2的である.

▼ 講義の目的ではないこと
単に「コンピュータの使い方がわかれば良い」とか, 「電子メールの使い方や「ホームページ」の書き方を知りたい」と言うのは, 本講義の目的ではない. 「特定のアプリケーションの使い方を教えてほしい」なんてのは論外である.

【授業の進め方】
基本的には, １時間目を講義, ２時間目をでの実習とする. ただし, １・２時間目両方を講義にあてることや, 中途半端な時間から実習または演習を開始することもありうる. 実習は, 学部生については「情報メディア教育センター理学部サテライトラボ」を, 大学院生については多元数理科学研究科計算機室を利用する.

▼ 実習について講義で解説する各種のアルゴリズムをＣ言語を利用して, 実際にアルゴリズムを実装する（プログラムを書く）ことを実習の内容とする.
実習で利用するアプリケーションに関しては, 各機種固有のものではなく, できる限り標準的と思われるものを利用する. それ以外のものを利用するのは自由だが, そのことに起因するトラブルなどに対しては一切責任を持たない. 各自のオペレーション・ミスなどに起因するトラブルに関しては, 各自で責任を持つこと.

▼ 出席について毎回出席をとるが出席は成績には一切関係しない. また, 毎回授業に対して電子メールにより「感想・その他」の提出を求める. この「感想・その他」のメールは授業のあった週の翌週月曜日夕方までに下に指定するメールアドレス宛に送付すること. 「感想・その他」のメールの内容を講義にフィードバックしたい.

▼ レポートについて
授業中に課題として出したプログラムに関しては, 授業のあった週の翌週月曜日夕方までに電子メールによりレポートとして提出すること. ただし, 特に問題のない限り, 個別にレポートのコメントは返送しない.
（つまり, コメントが戻ってこなければ, 特に問題がなかったと思って欲しい.）このレポート課題は必ず提出すること. （レポート課題をきちんとこなしていくことが単位を習得するための最も簡単な方法である.）▼ 授業の進め方

1. 講義は８時４５分から開始する.
学生諸君の中に「朝イチの授業は苦手」と感じている人が多いのは良く理解している. （かく言う私も, 学生時代は朝の授業はサボりまくっていた.）しかし, 春学期の授業でもあるので, 遅刻しないように出席してもらいたい.

2. 講義は約９０分から１２０分. その後は実習.
通常は, 講義を９０分〜１２０分程度（きりが良いところまで）行い, １０分〜１５分程度の休憩の後

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I

3に, 実習を行う.

【勉強の方法】
コンピュータを勉強する方法は, 基本的には数学を勉強する方法と全く同じである. すなわち,• 単純かつ正確な論理を正しく積み上げて, 大きなものを作るという考え方. （“Building Block” という）• アルゴリズムを正しく理解し, 筋の良い教科書を参考にしながら, 自力でプログラムを書くこと. （これを数学で言えば, 「概念を正しく理解し, 筋の良い教科書を参考にしながら, 自力で問題を考えること」となる.）逆に, 正しいプログラムに到達することにより, アルゴリズムとそこに潜む数学をより深く理解できるはずである.

• 一発で正しいプログラムを書けるようなことはなく, 何度も失敗しながら, どこが間違っているのかを考えることが必要である. プログラムを書くことは非常に時間の掛る作業である.

• プログラムを書くときに最も重要なことは, そのプログラムが「正しいかどうか」を調べることである. そのためには, プログラムの検証のためにどのようなデータを入力するのが適切かを判断し, プログラムの間違い（「バグ」）を修正する技術が必要である. この技術を身につけることは非常に困難であり, 多大な時間を要することを理解して欲しい.

• プログラムは「動けば良い」という考え方は間違いである. 数学だって, 「計算できれば良い」なんて考え方は間違っているのと同じである.

▼ 具体的な方法• 指示された課題を自力でこなしていくこと.
わからない内容は友人・教員に質問することも重要であるが, 最終的には自力でレポートを書くことが重要である.

• プログラミングは短時間の実習で習得できる技術ではない. 実習内容として指示された課題を理解するためには, 各自が実習時間以外に自習時間を十分にとることが必要である.

• アルゴリズムは抽象的に理解するのではなく, 多くの例を通して理解すべきものである. 単に「証明」などを追い掛けるのではなく, 自分の手で（紙の上に）実際に計算を行い, その経過・結果とプログラムとを比較することが必要である.
• プログラムには「正解」は存在しない.
課題として指示されたプログラムを書くためには, 自力で考えるだけではなく, 「筋のよい参考文献」を探すことも必要である. そこに書かれたプログラムの内容を理解し, 各自で書き直すことも必要となるだろう. しかし, 世の中に出回っているプログラムには「筋の悪い」ものも少なくない. 多くの文献（実際の書籍やネットワーク上のリソースなど）を見て, それを判断する力を身につけることも重要である.

▼ 注意事項• 他人が書いたプログラムを「丸うつし」して「プログラムが書けました」などということはやめてい
ただきたい. 必ず自力で理解してプログラムを書くこと.
• 自宅の「パソコン」などで自習をすることはかまわない（可能ならば, そのような努力も必要である）.
しかし, 「自宅のパソコンでは正しく動きました」という発言はご遠慮いただきたい. Ｃ言語の特徴はどのような環境であっても正しく動作することである.

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I

4【評価の方法】
８月後半を締め切りとしたレポートの内容のみ評価する. それ以外の課題は評価の対象としない. すなわ
ち, 講義・実習中に提出を求めたレポートの内容は受講者の理解度を判断するための材料としてのみ用いる.
ただし, ５月末頃に「中間レポート」の提出を求める. 中間レポートは, その時点での講義内容の理解度を判断する材料とし, 最終的な評価には反映させないが, 中間レポートを提出しない学生は評価の対象としない.

▼ おおよその評価基準
合格最低基準（可） 講義で解説したアルゴリズムを用いて, Ｃ言語による正しいプログラムを書けること.
特に, 標準的なプログラムを正しく書けること. （要するに, Ｃ言語のプログラミングと初歩的なアルゴリズムが最低限のレベルで理解できていること.）
良 講義で解説したアルゴリズムを正しく理解し, Ｃ言語による正しいプログラムを書けること. （要するに, 初歩的なアルゴリズムを正しく理解し, それをＣ言語で正しくプログラミングできること.）
優 講義で解説したアルゴリズムを応用して, アルゴリズムを自分で考え, それをＣ言語で正確にプログラムできること. 特に, Ｃ言語の仕様を正しく理解できていること.
いかなる場合でも, レポートは自力で作成すること. 他人のレポートまたは, 教科書・参考書を写した（コピーして単純に書き直したものを含む）と考えられるものがあった場合には単位を出さない. （当然, 元のレポートを作成した学生にも単位を出さない.）レポート提出の詳細に関しては, 夏休み前に別途指示する.

▼ 教職免許の単位について
この授業は教職免許取得のために必要な科目「情報機器の操作」に指定されているが, そのための特別な配慮は一切行わない.

▼ 電子メールによるレポート・感想文の提出方法
電子メールによりレポートを提出する場合には, 以下の宛先に提出すること.
宛先 computer-lecture@math.nagoya-u.ac.jp
送付する電子メールに関する条件は以下の通り.

1. 電子メールの発信元は学部生の場合は情報メディア教育センターであること. 大学院生に関しては,多元数理科学研究科のワークステーションであること.
プライベートな電子メールアドレスからのレポート提出や成績等に関する問い合わせは受け付けない.

2. 送付する電子メールには学年・氏名を明記すること.
3. 感想文のメールは Subject を “第Ｘ回講義の感想” とすること.
4. レポート提出時のメールは Subject を “レポート（問題番号ＸＸ）” とすること.
夏休み明けのレポートの提出に関しては別途指示する. なお, 講義内容に対する質問はプライベートな電子メールアドレスから送付してもかまわないが, できる限り上記の電子メールアドレスから送付すること.

【講義内容】
前期の講義でとりあげるテーマは以下の通りである.
Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I

5• コンピュータとネットワークの基礎知識（コンピュータリテラシ）• Ｃ言語
Ｃ言語は ANSI の規格に沿ったものを解説する. 内容は「配列」, 「ポインタ」, 「文字列」までとする.

• 種々の初歩的なアルゴリズム
ただし, 前期は「浮動小数点計算」に関わるアルゴリズムは扱わない. 主に「整数計算」に関わるアルゴリズムのみを考察する.
この中で, 「コンピュータリテラシ」の部分の多くは, 教育実習で４年生の出席が少なくなる６月前半に講義する1 .

▼ 具体的な講義内容
以下の予定で講義を行う. しかし, これは「現在での予定」であって, 授業の進度によっては変更がありうる. また, 「リテラシ (3, 4)」の部分に関しては, 教育実習で欠席する学生が多い２週間を選んで講義する.
第１回 (04/07)【イントロダクション】• 講義の内容と趣旨の説明• 評価方法の説明【ＵＮＩＸ (1)】

• ログイン・ログアウトの方法• パスワード• X Window System の利用法
• emacs の利用法
【Ｃ言語 (1)】• Ｃ言語の処理系の利用法 (1)• 簡単なプログラム (1)– “Hello World”– 簡単な計算
第２回 (04/14)【ＵＮＩＸ (2)】

第３回 (04/21)【リテラシ (1)】• 計算機内部での整数の表現方法• ２の補数を用いた減算の方法• デジタル回路と加算器• AND, OR, XOR【Ｃ言語 (3)】• プログラム言語とは• Ｃ言語の処理系• 変数とは• 整数型変数の宣言（定義）と値の代入方法
第４回 (04/28)【リテラシ (2)】

• 浮動小数点数の内部表現【Ｃ言語 (4)】• 変数の型の意味と整数以外の型• ファイルシステムとディレクトリ
• テキストファイルとその操作• 算術演算• 代入演算など, その他の演算• シェル• 基本コマンド (2)• 演算の優先順位と結合規則【Ｃ言語 (2)】

第５回 (05/12)【Ｃ言語 (5)】• Ｃ言語の処理系の利用法 (2)• 条件文• 簡単なプログラム (2)• 繰り返し文– 1 から 10 までの和を求める– 偶奇を判定する

第６回 (05/19)【アルゴリズム (1)】1 本来は, 教職につく学生こそリテラシを身につけるべきであるが, リテラシを他の時期にやると, Ｃ言語やアルゴリズムの内容が佳境に入った頃に４年生が抜けるため, ４年生で落ちこぼれる学生が大量に発生するための措置である.

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I

6• ユークリッドの互除法– 正当性– 計算量評価– 拡張されたユークリッドの互除法– ２進互除法
第７回 (05/26)【Ｃ言語 (6)】• 関数 (1)【アルゴリズム (2)】

• 再帰的関数呼び出し【中間レポート】
第８回 (06/02)【リテラシ (3)】• コンピュータの歴史• コンピュータ・ハードウェア• コンピュータ・ソフトウェア
第９回 (06/09)【リテラシ (4)】• コンピュータ・ネットワーク
第１０回 (06/16)【Ｃ言語 (7)】• 配列と文字列【アルゴリズム (3)】• エラトステネスのふるい• 基数変換第１１回 (06/23)【Ｃ言語 (8)】• 関数 (2)– 関数の宣言の意味– 変数のクラス– メモリ配置
第１２回 (06/30)【Ｃ言語 (9)】• ポインタ• ポインタや配列を引数とした関数• 文字列の基本操作
第１３回 (07/07)【Ｃ言語 (10)】• ポインタ• ポインタや配列を引数とした関数• 文字列の基本操作
第１４回 (07/14)【Ｃ言語 (11)】• 関数副作用第１５回 (07/21)【夏休みのレポート問題の説明】【その他】
講義のレポート・感想文, 質問などは, 電子メールで提出すること. その際は以下のアドレスにメールを送付すること.

computer-lecture@math.nagoya-u.ac.jp

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp

２００４年度前期・数理解析・計算機数学 I

7

【最後に】
こんな風に書くと, 非常に厳しい授業のように思うと思います. 実際もその通りです. しかし, 「コンピュータを理解したい」とか「数学とコンピュータの関わりを理解したい」と思っている人や, 将来コンピュータを本格的に使う職業につきたいと思っている人は忍耐強く授業や実習に出てください. 当然, それなりの努力が必要です. 数学がよくわかった人もそうでなかった人も, この講義は計算機に関してはゼロからはじめるので, 気をとりなおしてがんばりましょう.
おしまい
それでは, みなさん１年間がんばって勉強しましょう.

Id: resume.tex,v 1.6 2004-04-06 13:38:39+09 naito Exp