ミニプロジェクト
このページでは、読解だけでなく小さな実装成果物で到達確認できるようにする。各プロジェクトは 2〜6 時間で完了できる粒度にしている。
P1. 関係チェッカー
対象章: 第1章、第2章、第3章
仕様:
- 有限集合
Aと二項関係R ⊆ A × Aを入力する。 - 反射律、対称律、反対称律、推移律を判定する。
- 同値関係なら同値類を出力する。
- 半順序なら Hasse 図に必要な cover relation を出力する。
合格条件:
- 空集合、単集合、完全関係、恒等関係でテストしている。
- 反例がある場合、その反例ペアまたは三つ組を返す。
- 判定結果だけでなく、どの定義に基づくかを説明できる。
P2. BFS 到達可能性エクスプローラ
対象章: 第6章、第8章
仕様:
- 隣接リストからグラフを読み込む。
- 始点からの距離、親ポインタ、BFS探索順を出力する。
- 指定した終点までの最短路を復元する。
- 到達不能な頂点を明示する。
合格条件:
- 無向グラフと有向グラフの両方を扱える。
- キューの状態をログ出力できる。
- 「最初に発見した距離が最短距離である」理由を説明できる。
P3. Union-Find による動的連結性
対象章: 第2章、第8章
仕様:
union(x,y),find(x),connected(x,y)を実装する。- path compression と union by size/rank を入れる。
- 連結成分を一覧表示する。
合格条件:
- 代表元と同値類の対応を説明できる。
unionの順序が違っても、同じ分割を表せることを確認する。- 最悪ケースを避ける工夫を説明できる。
P4. DFA シミュレータ
対象章: 第9章
仕様:
- 状態集合、アルファベット、遷移表、初期状態、受理状態を定義する。
- 入力文字列を読み、受理/拒否を返す。
- 遷移表の全域性を検査する。
- 各接頭辞を読んだ後の状態列を出力する。
合格条件:
- 1 の個数が偶数である文字列を受理する DFA を実装する。
0*1*など、別の簡単な言語でもテストする。- 状態が何を記憶しているかを不変条件として書ける。
P5. Hamming距離と単純な誤り検出
対象章: 第10章、第12章
仕様:
- 同じ長さのビット列間の Hamming距離を計算する。
- 符号語集合の最小距離を計算する。
- 受信語から距離が最小の符号語を探索する。
合格条件:
- 最小距離と誤り検出・訂正能力の関係を説明できる。
- 距離が同率最小になる場合を検出できる。
F_2上の加算との関係を説明できる。
P6. 合同算術と小さなRSAデモ
対象章: 第11章
仕様:
- Euclid の互除法を実装する。
- 拡張Euclid法で逆元を求める。
- 小さい素数を使って RSA の暗号化・復号の流れを確認する。
合格条件:
gcd(a,n)=1でないと逆元が存在しない理由を説明できる。- toy RSA は教育用であり、実用暗号ではないことを明記する。
- 剰余演算で大きなべき乗を扱うため
pow(m, e, n)を使う。
P7. 確率実験と理論値の比較
対象章: 第10章
仕様:
- コイントス、サイコロ、条件付き確率の実験を行う。
- seed を固定して再現可能にする。
- 実験値と理論値を比較する。
合格条件:
- 試行回数を増やすと実験値が理論値へ近づく様子を説明できる。
- 独立と排反の違いを例で説明できる。
- シミュレーションは証明ではないと明記する。
P8. 状態遷移系と safety 検査
対象章: 第13章
仕様:
- 有限状態遷移系を定義する。
- 初期状態から到達可能な状態集合を探索する。
- bad state に到達するかを判定する。
- 到達する場合は反例 trace を出力する。
合格条件:
- 非決定性を
setof next states として実装する。 - safety と liveness の違いを説明できる。
- 状態数が組合せ的に増える理由を説明できる。