16709 words
84 minutes
Osaka University IST Graduate Entrance Exam (2020)

大阪大学 情報科学研究科 情報工学 2020年度 必須問題&選択問題#

Author#

KardeniaPoyu


1 【必須問題】アルゴリズムとプログラミング#

Description#

配点: (1) 12点, (2) 12点, (3) 14点, (4) 25点, (5-1) 20点, (5-2) 30点, (6) 12点

図1に示す ANSI-C 準拠である C 言語のプログラム (program) は、複数の整数 (integer) のデータ (data) を、二分木 (binary tree) を利用して昇順 (ascending order) に整列 (sort) して出力 (output) するプログラムである。図1のプログラムでは、配列 (array) の添え字 (index) が二分木の節点番号 (node number) に対応している。ただし、二分木の根 (root) の節点番号を 0 とし、節点番号が ii の節点に子 (child) がある場合、左の子の節点番号を 2i+12i+1、右の子の節点番号を 2i+22i+2 とする。また、配列に格納されたデータは、二分木の対応する節点のデータを示している。

整列するデータは図2に示すような形式 (format) のファイル data.txt で与えられ、1行目には整列するデータの個数 nn (n1n \ge 1)、2行目以降の nn 行には整列するデータの値 (value) が書かれている。図3は、図2の data.txt を与えて図1のプログラムを実行した場合の、28行目が実行される直前の配列 d に対応する二分木であり、丸が節点、丸の左側の数字が節点番号、丸の中の数字がデータの値、線分が枝 (edge) を示している。図1のプログラムに関する以下の各問に答えよ。

#include <stdio.h>
#include <stdlib.h>
void swap(int d[], int p, int q) {
int tmp;
tmp = d[p]; d[p] = d[q]; d[q] = tmp;
}
void downh(int d[], int n, int k) {
int child, current = k;
while (current < n / 2) {
child = current * 2 + 1;
if ((child + 1 < n) && (d[child] < d[child + 1])) // (ア) (イ)
child++;
if (d[current] < d[child]) // (ウ)
swap(d, current, child);
else
break;
current = child;
}
}
void uph(int d[], int k) {
int parent, current = k;
while (0 < current) {
parent = (current - 1) / 2;
if (d[parent] < d[current]) // (エ)
swap(d, parent, current);
else
break;
current = parent;
}
}
void sort(int d[], int n) {
int i;
for (i = 1; i < n; i++) // 28行目
uph(d, i);
for (i = n - 1; 0 < i; i--) { // 29行目
swap(d, 0, i);
downh(d, i, 0);
}
}
int main() {
int i, N, *D;
FILE* fp;
fp = fopen("data.txt", "r");
fscanf(fp, "%d", &N);
D = (int*) malloc(sizeof(int) * N);
for (i = 0; i < N; i++)
fscanf(fp, "%d", &D[i]);
fclose(fp);
sort(D, N);
for (i = 0; i < N; i++)
printf("%d ", D[i]);
printf("\n");
free(D);
return 0;
}

(1) 40行目で呼び出されている関数 (function) sort で実現されている整列アルゴリズム (sorting algorithm) は、一般に何と呼ばれているか名称を答えよ。

(2) 図2の data.txt を与えてプログラムを実行した場合の、28行目が実行された直後の配列 d に対応する二分木を図示せよ。ただし、図3にならい、丸で節点、丸の左側の数字で節点番号、丸の中の数字でデータの値、線分で枝を示すこと。

(3) 11行目および12行目が実行されることにより、節点番号が current の節点のデータとその子データの間に成立する関係を説明せよ。

(4) 関数 sort で実現されている整列アルゴリズムの最悪時間計算量 (worst case time complexity) を、整列するデータの個数 nn を用いて理由と共にオーダ表記 (order notation) で示せ。

(5) 関数 sort において、28行目の実行時に関数 swap が呼び出される回数を T(n)T(n) とする。nn は整列するデータの個数である。28行目を変更し、28行目の for ループの繰り返し回数と T(n)T(n) の最大値をできる限り削減(28行目の実行に要する最悪時間計算量を削減)することを考える。以下の各小問に答えよ。

(5-1) 下記の (あ) 〜 (え) を埋めて変更後の 28 行目を完成させよ。 for (i = (あ); 0 <= i; i--) downh( (い), (う), (え) );

(5-2) 変更後のプログラムにおける T(n)T(n)nn に関するオーダ表記を理由と共に示せ。 j=0hj2j=22+h2h\sum_{j=0}^{h} \frac{j}{2^j} = 2 - \frac{2+h}{2^h} を用いてよい。

(6) 下線 (ア) 〜 (エ) で示す条件式を必要に応じて変更し、データを降順 (descending order) に整列して出力することを考える。変更後のプログラムにおける下線 (ア) 〜 (エ) の条件式をそれぞれ答えよ。


Kai#

(1)#

  • 日本語 (Japanese): ヒープソート (Heap Sort)
  • 英語 (English): Heap Sort
  • 中文解析 (Chinese Analysis): 该程序实现的是堆排序(Heap Sort)。利用数组模拟完全二叉树,并通过向上调整(uph)和向下调整(downh)维护大顶堆(max-heap),每次将堆顶最大值放置到未排序部分的末尾以实现升序排列。

(2)#

  • 日本語 (Japanese): 28行目のヒープ構築ループが終了した直後の二分木の状態は以下の通りである。
  • 英語 (English): The state of the binary tree immediately after the heap construction loop (Line 28) completes is shown below.
  • 中文解析 (Chinese Analysis): 初始数据为 [40, 30, 50, 10, 60, 20],执行完28行的 uph 循环后,数组 d 被调整为满足大顶堆性质的 [60, 50, 40, 10, 30, 20]。对应的完全二叉树结构如下所示:
graph TD
0((0: 60)) --- 1((1: 50))
0 --- 2((2: 40))
1 --- 3((3: 10))
1 --- 4((4: 30))
2 --- 5((5: 20))

(3)#

  • 日本語 (Japanese): 節点番号 current の節点のデータは、その存在するすべての子のデータ以上であるという関係が成立する。
  • 英語 (English): The relationship established is that the data of the node at index current is greater than or equal to the data of all its existing children.
  • 中文解析 (Chinese Analysis): 建立的关系是:父节点 current 的数据大于或等于其所有子节点(左子节点,以及若存在则包含右子节点)的数据。 过程分析:第11行先判定右子节点是否存在,并选择左右子节点中数值较大的一个(将下标存入 child)。第12行将当前节点与这个较大的子节点进行比较,若当前节点较小,则与之交换,从而保证当前节点不小于它的任何子节点。

(4)#

  • 日本語 (Japanese): 最悪時間計算量は O(nlogn)O(n \log n) である。 理由:
    1. ヒープ構築フェーズ: n1n-1uph を呼び出す。各ステップ ii での uph の最大実行時間は完全二分木の高さ O(logi)O(\log i) に比例するため、ヒープ構築の最悪計算量は i=1n1O(logi)=O(nlogn)\sum_{i=1}^{n-1} O(\log i) = O(n \log n) となる。
    2. 整列フェーズ: n1n-1downh を呼び出す。サイズ ii のヒープに対する downh の最大実行時間は高さ O(logi)O(\log i) に比例するため、整列フェーズの最悪計算量は i=1n1O(logi)=O(nlogn)\sum_{i=1}^{n-1} O(\log i) = O(n \log n) となる。 両フェーズを合わせた全体の最悪時間計算量は O(nlogn)+O(nlogn)=O(nlogn)O(n \log n) + O(n \log n) = O(n \log n) となる。
  • 英語 (English): The worst-case time complexity is O(nlogn)O(n \log n). Reason:
    1. Heap construction phase: The loop calls uph n1n-1 times. For each index ii, the worst-case time of uph is proportional to the tree height O(logi)O(\log i). The total time is i=1n1O(logi)=O(nlogn)\sum_{i=1}^{n-1} O(\log i) = O(n \log n).
    2. Sorting phase: The algorithm extracts the maximum element and calls downh n1n-1 times. The worst-case time for downh on a heap of size ii is O(logi)O(\log i). The total time is i=1n1O(logi)=O(nlogn)\sum_{i=1}^{n-1} O(\log i) = O(n \log n). Thus, the overall worst-case time complexity is O(nlogn)+O(nlogn)=O(nlogn)O(n \log n) + O(n \log n) = O(n \log n).
  • 中文解析 (Chinese Analysis): 堆排序的整体最坏时间复杂度为 O(nlogn)O(n \log n)具体原因
    • 堆构建阶段:从二叉树的第2个节点(索引1)开始,依次向上调整(uph),由于完全二叉树的高度为 logn\log n,因此 nn 个节点逐步插入堆的耗时累计为 logi=O(nlogn)\sum \log i = O(n \log n)
    • 排序调整阶段:依次将堆顶与未排序的最后一个元素交换,然后向下调整(downh)。每次向下调整的最大深度为当前二叉树的高度 O(logi)O(\log i),执行 n1n-1 次,累加耗时同样为 O(nlogn)O(n \log n)
    • 两者相加,最坏时间复杂度为 O(nlogn)O(n \log n)

(5-1)#

  • 日本語 (Japanese):
    • (あ): n / 2 - 1
    • (い): d
    • (う): n
    • (え): i 完成した28行目: for (i = n / 2 - 1; 0 <= i; i--) downh( d, n, i );
  • 英語 (English):
    • (あ): n / 2 - 1
    • (い): d
    • (う): n
    • (え): i Completed line 28: for (i = n / 2 - 1; 0 <= i; i--) downh( d, n, i );
  • 中文解析 (Chinese Analysis): 为了优化建堆效率,我们可以采用**自底向上(Bottom-up)**的建堆方法(即弗洛伊德建堆算法)。
    • 所有的叶子节点(下标为 n/2\lfloor n/2 \rfloorn1n-1 的节点)本身已经是可以看作合法的堆,因此不需要向下调整。
    • 我们只需要从最后一个非叶子节点(即下标为 n/21\lfloor n/2 \rfloor - 1 的节点)开始,自底向上对每个节点调用 downh 即可。
    • 结合 downh(int d[], int n, int k) 的参数定义:(い) 代表数组指针 d(う) 代表堆大小 n(え) 代表当前要调整的节点下标 i

(5-2)#

  • 日本語 (Japanese): 変更後の T(n)T(n) の最悪計算量は O(n)O(n) である。 理由: 要素数を nn、二分木の高さを h=log2nh = \lfloor \log_2 n \rfloor とする。高さ jj にある節点の最大数は n/2j+1\lceil n / 2^{j+1} \rceil 個であり、それらの節点に対して downh を適用する際の swap 回数(調整の深さ)は最大で jj 回である。 したがって、全 swap 回数 T(n)T(n) は以下のように抑えられる: T(n)j=0hn2j+1×j=n2j=0hj2jT(n) \le \sum_{j=0}^{h} \frac{n}{2^{j+1}} \times j = \frac{n}{2} \sum_{j=0}^{h} \frac{j}{2^j} 与えられた和の公式 j=0hj2j=22+h2h\sum_{j=0}^{h} \frac{j}{2^j} = 2 - \frac{2+h}{2^h} を代入すると: T(n)n2(22+h2h)<n2×2=nT(n) \le \frac{n}{2} \left( 2 - \frac{2+h}{2^h} \right) < \frac{n}{2} \times 2 = n これにより、T(n)<nT(n) < n となり、その最悪時間計算量は O(n)O(n) となる。
  • 英語 (English): The worst-case time complexity of the modified T(n)T(n) is O(n)O(n). Reason: Let nn be the number of elements and h=log2nh = \lfloor \log_2 n \rfloor be the height of the tree. The maximum number of nodes at height jj (counting from the bottom leaves at height 0) is n/2j+1\lceil n / 2^{j+1} \rceil. For a node at height jj, the maximum number of swaps during downh is jj. Thus, the total number of swaps T(n)T(n) is bounded by: T(n)j=0hn2j+1×j=n2j=0hj2jT(n) \le \sum_{j=0}^{h} \frac{n}{2^{j+1}} \times j = \frac{n}{2} \sum_{j=0}^{h} \frac{j}{2^j} Substituting the given summation formula j=0hj2j=22+h2h\sum_{j=0}^{h} \frac{j}{2^j} = 2 - \frac{2+h}{2^h}, we get: T(n)n2(22+h2h)<nT(n) \le \frac{n}{2} \left( 2 - \frac{2+h}{2^h} \right) < n Therefore, T(n)=O(n)T(n) = O(n).
  • 中文解析 (Chinese Analysis): 优化后的建堆过程,其最坏时间复杂度(即最大交换次数 T(n)T(n))为 O(n)O(n)数学推导
    • 设完全二叉树高度为 hh。对于高度为 jj(叶子节点高度为 0,根节点高度为 hh)的节点,其向下调整所需要的最大交换次数为 jj
    • 在高度为 jj 的层,最多有 n/2j+1\lceil n/2^{j+1} \rceil 个节点。
    • 累加每层节点向下调整的最大开销: T(n)j=0hn2j+1j=n2j=0hj2jT(n) \le \sum_{j=0}^{h} \frac{n}{2^{j+1}} \cdot j = \frac{n}{2} \sum_{j=0}^{h} \frac{j}{2^j}
    • 代入题目给定的求和公式 j=0hj2j=22+h2h\sum_{j=0}^{h} \frac{j}{2^j} = 2 - \frac{2+h}{2^h}T(n)n2(22+h2h)<n22=nT(n) \le \frac{n}{2} \left( 2 - \frac{2+h}{2^h} \right) < \frac{n}{2} \cdot 2 = n
    • 因为 T(n)T(n)nn 线性上界锁死,所以其时间复杂度为 O(n)O(n)

(6)#

  • 日本語 (Japanese):
    • (ア): child + 1 < n (変更なし)
    • (イ): d[child] > d[child + 1] (または d[child + 1] < d[child])
    • (ウ): d[current] > d[child]
    • (エ): d[parent] > d[current]
  • 英語 (English):
    • (ア): child + 1 < n (Unchanged)
    • (イ): d[child] > d[child + 1] (or d[child + 1] < d[child])
    • (ウ): d[current] > d[child]
    • (エ): d[parent] > d[current]
  • 中文解析 (Chinese Analysis): 要通过堆排序输出降序(Descending order)的序列,我们需要使用小顶堆(Min-heap)。 在小顶堆的维护过程中,父节点的值必须小于或等于左右子节点的值。因此:
    • (ア):判定右子节点是否存在,这只与边界 nn 有关,故保持 child + 1 < n 变。
    • (イ):在左右子节点中选择较小的那个,所以当右子节点的值比左子节点小时进行自增操作,条件改为 d[child] > d[child + 1]
    • (ウ):向下调整时,如果父节点的值大于较小儿子节点的值,则进行交换,条件改为 d[current] > d[child]
    • (エ):向上调整时,如果父节点的值大于当前子节点的值,则进行交换,条件改为 d[parent] > d[current]

2 【必須問題】計算機システムとシステムプログラム#

Description#

配点: (1-1) 10点, (1-2-1) 15点, (1-2-2) 15点, (1-2-3) 15点, (1-2-4) 10点, (2-1) 18点, (2-2) 20点, (2-3) 12点, (2-4) 10点

(1) 計算機 (computer) における数の表現に関する以下の各問に答えよ。#

(1-1) 以下の文章の空欄 (a) 〜 (e) に当てはまる最も適切な語句または数値を、下記の選択肢から選び、記号で答えよ。

数の表現形式として固定小数点 (fixed point number) 表現と浮動小数点 (floating point number) 表現がある。科学技術計算の分野では、 (a) 等の理由から (b) 表現多く用いられ、小型機器の制御等の分野では、 (c) 等の理由から (d) 表現が多く用いられる。いずれの表現形式においても、指数の底 (base of exponent) が 2 の場合、10 進数 (decimal number) の (e) を誤差 (error) 無く表現することはできない。 [選択肢] (ア) 固定小数点 (イ) 浮動小数点 (ウ) 演算回路 (arithmetic circuit) が簡素になる (エ) 表現できる数の範囲が広い (オ) 小数を誤差無く表現できる (カ) 0.5 (キ) 0.25 (ク) 0.1

(1-2) 以下の浮動小数点表現に関し、(1-2-1)〜(1-2-4) に答えよ。(1-2-1)〜(1-2-3) については導出過程も示すこと。

  • 浮動小数点数 A を A=(1)s×2e7×(1+m)A = (-1)^s \times 2^{e-7} \times (1 + m) と表し,符号部 ss (sign),指数部 ee (exponent),仮数部 mm (significand, mantissa) を最上位ビットから順にメモリに格納する.
  • 符号部 ss は 1 ビットである.s{0,1}s \in \{0,1\} をメモリに格納する.
  • 指数部 ee は 4 ビットである.7 余り表現とし,ee を 4 ビットの符号無し 2 進整数 (unsigned binary integer) で表したビット列をメモリに格納する.e=0e = 0 および e=15e = 15±\pm\infty などの特殊な数を表現するのに用いる.
  • 仮数部 mm は 9 ビットである.正規化 (normalization) し,整数部分の 1 は記録しない(隠しビット).小数部分の mm を 2 進数の小数で表し,小数点以下の 9 ビットをメモリに格納する.丸め (rounding) 処理は切り捨て (rounding down) とする.非正規化 (denormalization) 表現は用いない.

(1-2-1) この表現形式で表すことのできる,正の最大値を 10 進数の小数で示せ.但し,無限大 (infinity) は除く.

(1-2-2) この表現形式で表すことのできる,正の最小値を 10 進数の小数で示せ.

(1-2-3) 10 進数 36.66-36.66 をこの形式で表現し,そのビット列を示せ.

(1-2-4) 繰り返し計算を行う際,丸め処理として切り捨てを用いると,問題が生じる場合がある.どの様な問題か,理由も含めて示せ.

(2) 仮想記憶 (仮想メモリ; virtual memory) に関して以下の各小問に答えよ.#

(2-1) 次の説明文を読み,空欄 (a) 〜 (i) にあてはまる最も適切な語句を下の (ア) 〜 (ソ) の選択肢から選んで記号で答えよ.一つの選択肢を複数回用いてはならない. 仮想記憶は,主記憶 (primary storage, main memory) と補助記憶 (secondary storage, auxiliary memory) を用いて,主記憶の容量よりも大きい (a) を提供する.プロセスが指すアドレスは (b) と呼ばれる.プロセスの実行においてメモリアクセスのたびに,アドレス変換テーブル (mapping table) に基づいて (b) を (c) に変換する.一般的に,アドレス変換テーブルは (d) 上に構成する. アドレス変換を固定長 (fixed length) のブロック単位で行う方式を (e) と呼び,可変長 (variable length) のブロック単位で行う方式を (f) と呼ぶ.主記憶の利用効率 (memory efficiency) の観点からこれらの方式を比較すると, (e) 方式の利点は,主記憶領域の割り当てと解放を繰り返しても (g) がほとんど発生しない点である.一方,欠点は,固定長のページ単位で領域を割り付けるために (h) が発生しやすい点である. (h) は, (i) の大きさと比較して使用領域が小さいプロセスを実行する場合に顕著である. [選択肢] (ア) 主記憶 (イ) ページ (page) (ウ) 内部断片化 (internal fragmentation) (エ) スラッシング (thrashing) (オ) 実アドレス (real address) (カ) 仮想アドレス (virtual address) (キ) アドレス空間 (address space) (ク) 補助記憶 (ケ) メモリ階層 (memory hierarchy) (コ) ページング (paging) (サ) セグメント (segment) (シ) 外部断片化 (external fragmentation) (ス) ページフォールト (page fault) (セ) レジスタ (regsiter) (ソ) セグメンテーション (segmentation)

(2-2) プロセスが次に示すページ参照列 SS で処理を行う場合を想定する.ページ枠 (page frame) の数が 3 のページング方式を採用した場合に,ページフォールトが発生するページ参照に◯を記入せよ.ページ置換アルゴリズムに LRU (least recently used) および FIFO (first in first out) を用いる場合についてそれぞれ回答せよ.但し,初期状態では全てのページ枠は空である. ページ参照列 SS: $0, 1, 2, 0, 3, 1, 4, 3, 2, 3, 1, 2, 4

(2-3) ページング方式を採用したシステムを想定する.このシステムでは,1回の主記憶へのアクセスに 2 [マイクロ秒] を要し,ページフォールトが発生するとそれに加えて 8 [ミリ秒] のオーバヘッド (overhead) が発生する.1命令あたり平均 2 回のメモリアクセスを行うとき,ページフォールトによる性能低下をページフォールトの無い状態と比較して平均 10% 以下に抑えるために,許容できるページフォールトの確率 PP の上限を求めよ.導出過程も示せ.なお,ページフォールトが発生しない場合のメモリアクセス時間は主記憶へのアクセス時間に等しく,演算時間および他のオーバヘッドは無視できるものとする.

(2-4) ページング方式を採用し,ページ置換アルゴリズムに LRU を用いたシステムにおいて,ページフォールトを削減する方法を具体的かつ簡潔に記述せよ.但し,実行する各プロセスのページ参照列は変更しないものとする.


Kai#

(1-1)#

  • 解答: (a) エ, (b) イ, (c) ウ, (d) ア, (e) ク
  • 中文解析:
    • 科学计算需要很大的数值表达范围,因此常用 (b) 浮动小数点(),对应原因是 (a) 表现范围广()。
    • 嵌入式微型设备控制中,常用 (d) 固定小数点(),因为其不需要昂贵的浮点协处理器,对应原因 (c) 运算电路简单()。
    • 以 2 为底数的浮点数系统无法精确表示 (e) 0.1(),因为 0.1 在二进制中是一个无限循环小数 0.0001100110011...20.0001100110011..._2,在有限位宽存储时必然产生截断误差。

(1-2-1)#

  • 解答: 255.75255.75
  • 導出過程: 正の数であるため,符号部 s=0s = 0 である. 無限大を除く正の最大値を得るためには,指数部 ee と仮数部 mm を最大にすればよい. e=0e = 0 および e=15e = 15 は特殊な数の表現として除外されるため,正規化数における ee の最大値は 1414 である. 仮数部 mm は 9 ビットであり,その最大値はすべてのビットが 11 のときである: m=i=192i=129=11512=511512m = \sum_{i=1}^{9} 2^{-i} = 1 - 2^{-9} = 1 - \frac{1}{512} = \frac{511}{512} したがって,正の最大値 AmaxA_{\max} は: Amax=(1)0×2147×(1+511512)=27×(229)=25622=2560.25=255.75A_{\max} = (-1)^0 \times 2^{14-7} \times \left(1 + \frac{511}{512}\right) = 2^7 \times \left(2 - 2^{-9}\right) = 256 - 2^{-2} = 256 - 0.25 = 255.75
  • 中文解析: 符号位 s=0s=0。指数部除去保留值 0 和 15,最大正规化指数 e=14e=14。 尾数部 mm 在 9 位全 1 时取得最大值 129=5115121 - 2^{-9} = \frac{511}{512}。 代入公式:Amax=2147×(1+511512)=128×1023512=10234=255.75A_{\max} = 2^{14-7} \times (1 + \frac{511}{512}) = 128 \times \frac{1023}{512} = \frac{1023}{4} = 255.75

(1-2-2)#

  • 解答: 0.0156250.015625
  • 導出過程: 正の数であるため,符号部 s=0s = 0 である. 正の最小値(正規化数)を得るためには,指数部 ee と仮数部 mm を最小にすればよい. 非正規化数(denormalization)は用いないため,最小の指数部 e=1e = 1 である. 仮数部 mm の最小値はすべてのビットが 00 のときであり,m=0m = 0 である. したがって,正の最小の正規化数 AminA_{\min} は: Amin=(1)0×217×(1+0)=26=164=0.015625A_{\min} = (-1)^0 \times 2^{1-7} \times (1 + 0) = 2^{-6} = \frac{1}{64} = 0.015625
  • 中文解析: 正的最小正规化数在 e=1e=1m=0m=0 时取得。 代入公式:Amin=217×(1+0)=26=164=0.015625A_{\min} = 2^{1-7} \times (1 + 0) = 2^{-6} = \frac{1}{64} = 0.015625

(1-2-3)#

  • 解答: 11100001001010 (または 1 1100 001001010)
  • 導出過程: 値が負数であるため,符号部 s=1s = 1 である. 次に,絶対値 36.6636.66 の指数部 ee を求める. 3236.66<6432 \le 36.66 < 64 であるため,2536.66<262^5 \le 36.66 < 2^6 となり,指数部分は 252^5 すなわち e7=5e - 7 = 5 となる. よって,e=12e = 12 であり,これを 4 ビットの 2 進数で表すと 1100 となる. 仮数部 mm は次のように求められる: 1+m=36.6625=36.6632=1.145625    m=0.1456251 + m = \frac{36.66}{2^5} = \frac{36.66}{32} = 1.145625 \implies m = 0.145625 m=0.145625m = 0.145625 を 2 進数の小数に展開し,切り捨てを適用して小数点以下 9 ビットを抽出する:
    • 0.145625×2=0.2912500.145625 \times 2 = 0.29125 \to 0
    • 0.29125×2=0.582500.29125 \times 2 = 0.5825 \to 0
    • 0.5825×2=1.16510.5825 \times 2 = 1.165 \to 1
    • 0.165×2=0.3300.165 \times 2 = 0.33 \to 0
    • 0.33×2=0.6600.33 \times 2 = 0.66 \to 0
    • 0.66×2=1.3210.66 \times 2 = 1.32 \to 1
    • 0.32×2=0.6400.32 \times 2 = 0.64 \to 0
    • 0.64×2=1.2810.64 \times 2 = 1.28 \to 1
    • 0.28×2=0.5600.28 \times 2 = 0.56 \to 0
    • (以降は切り捨て) これより,仮数部 mm の 9 ビット列は 001001010 となる. 以上を統合すると,ビット列は 1 (符号部) + 1100 (指数部) + 001001010 (仮数部) = 11100001001010 となる.
  • 中文解析:
    • 负数,所以符号位 s=1s=1
    • 36.6636.66 处于区间 [32,64)[32, 64),因此对应阶数为 252^5。由 e7=5e - 7 = 5 得到 e=12e = 12,二进制位为 1100
    • 尾数部分 1+m=36.66/32=1.145625    m=0.1456251 + m = 36.66 / 32 = 1.145625 \implies m = 0.145625
    • 通过乘2取整法将 0.1456250.145625 转换为9位二进制小数。由于舍入规则是“切り捨て”(截断/向下舍入),直接取前 9 位得 001001010
    • 最终拼接得:11100001001010

(1-2-4)#

  • 日本語 (Japanese): 丸め処理に切り捨てを使用すると、発生する誤差が常に同一方向(絶対値を減少させる方向)に蓄積するため、繰り返し計算によって「累積誤差」が一方通行に増大し、最終的な計算精度が著しく低下する。また、大小の差が極端に大きい数値同士の加算において、小さい方の有効桁数が全て切り捨てられて加算結果に反映されない「情報落ち」が発生する。
  • 英語 (English): When truncation (rounding down) is used, the rounding errors occur consistently in the same direction (underestimating the absolute values). During iterative calculations, these errors accumulate unidirectionally, leading to significant cumulative errors. Additionally, when adding values of vastly different magnitudes, the significant bits of the smaller value may be shifted out completely and discarded, resulting in a “loss of significance” where the addition of the smaller value has no effect.
  • 中文解析 (Chinese Analysis): 主要存在两个问题:
    1. 累计误差(Error Accumulation):截断舍入每次都向绝对值缩小的方向舍入,舍入误差是同向的。在成千上万次迭代后,误差单向累加,导致严重的数值漂移。
    2. 信息流失(Loss of Significance / Absorption):在大小悬殊的数相加时,较小数对齐阶数后其有效位全部溢出假数部被截断,使得加法等于没加,数值信息丢失。

(2-1)#

  • 解答: (a) キ, (b) カ, (c) オ, (d) ア, (e) コ, (f) ソ, (g) シ, (h) ウ, (i) イ
  • 中文解析:
    • 虚拟内存提供比物理主存空间更大的 (a) アドレス空間()。
    • 进程产生的是 (b) 仮想アドレス(),每次访问都要转换成 (c) 実アドレス()。
    • 页表一般配置在 (d) 主記憶()上。
    • 固定长度划分为 (e) ページング(),可变长度为 (f) セグメンテーション()。
    • 页面分配机制的优点是没有 (g) 外部断片化(),但是有 (h) 内部断片化()。
    • 当分配的 (i) ページ()尺寸远大于进程需要的实际空间时,内部碎片化最明显。

(2-2)#

  • 解答:
    • LRU:
      参照0120314323124
      LRU
    • FIFO:
      参照0120314323124
      FIFO
  • 中文解析:
    • 缺页标记为
    • LRU 缺页 9 次,第4项、第8项、第10项、第12项命中了缓冲,其余换入。
    • FIFO 缺页 7 次,在命中后队列顺序不发生更新。

(2-3)#

  • 解答: P2.5×105P \le 2.5 \times 10^{-5} (または 2.5×103%2.5 \times 10^{-3} \% 以下)
  • 導出過程: 主記憶への 1 回のアクセス時間を Tm=2 μsT_m = 2 \ \mu\text{s} とする. ページフォールトのオーバヘッドを Tpf=8 ms=8000 μsT_{pf} = 8 \ \text{ms} = 8000 \ \mu\text{s} とする. ページフォールトの発生確率を PP としたとき,実効メモリアクセス時間 TeffT_{eff} は以下のように表される: Teff=(1P)Tm+P(Tm+Tpf)=Tm+PTpfT_{eff} = (1 - P) T_m + P (T_m + T_{pf}) = T_m + P \cdot T_{pf} 1命令あたり平均 2 回のメモリアクセスを行うため,1命令の実効アクセス時間は 2Teff2 T_{eff},ページフォールトが無い状態のアクセス時間は 2Tm2 T_m である. 性能低下を 10% 以下に抑える条件は: 2Teff2Tm2Tm0.1    TeffTmTm0.1\frac{2 T_{eff} - 2 T_m}{2 T_m} \le 0.1 \implies \frac{T_{eff} - T_m}{T_m} \le 0.1 PTpfTm0.1    P0.1×TmTpf\frac{P \cdot T_{pf}}{T_m} \le 0.1 \implies P \le 0.1 \times \frac{T_m}{T_{pf}} 数値を代入すると: P0.1×2 μs8000 μs=0.28000=0.000025=2.5×105P \le 0.1 \times \frac{2 \ \mu\text{s}}{8000 \ \mu\text{s}} = \frac{0.2}{8000} = 0.000025 = 2.5 \times 10^{-5} したがって,許容できるページフォールトの確率 PP の上限は 2.5×1052.5 \times 10^{-5} である. (注: もし確率 PP が「1命令あたり」に発生する確率と解釈される場合,上限は Pinst=2P=5.0×105P_{inst} = 2 P = 5.0 \times 10^{-5} となる)
  • 中文解析:
    • 正常主存访问时间 Tm=2 μsT_m = 2\ \mu\text{s}。缺页开销为 Tpf=8000 μsT_{pf} = 8000\ \mu\text{s}
    • 包含缺页概率 PP 的等效单次访存时间为 Teff=Tm+P×TpfT_{eff} = T_m + P \times T_{pf}
    • 性能下降率可以通过单次访存时间的相对增加值来计算(因为每条指令的平均访存次数 2 可以约掉): 性能降低=P×TpfTm10%\text{性能降低} = \frac{P \times T_{pf}}{T_m} \le 10\%
    • 代入数字:P×8000/20.1    P2.5×105P \times 8000 / 2 \le 0.1 \implies P \le 2.5 \times 10^{-5}
    • 这意味着缺页率必须控制在 0.0025%0.0025\% 以内。

(2-4)#

  • 日本語 (Japanese):
    1. プロセスに割り当てるページ枠数を増やす。LRU はスタックアルゴリズムの特性(包含特性)を満たすため、ページ枠数を増やすことで缺页率を確実に低減(または維持)できる。
    2. ページサイズを拡張する。空間的局所性を生かして、参照ページ数を減少させることができる。
    3. ページバッファリング(Page Buffering)を導入し、置換対象となったページを即時に破棄せずフリーリストに保持しておくことで、再参照時の物理ディスクアクセスを回避する。
  • 英語 (English):
    1. Increase the number of page frames allocated to the process. Since LRU is a stack algorithm, increasing the number of allocated frames is mathematically guaranteed to decrease (or keep constant) the page fault frequency.
    2. Increase the page size to leverage spatial locality, which reduces the total number of unique page faults during execution.
    3. Employ page buffering, keeping replaced pages in a pool of free frames temporarily so they can be immediately reclaimed without disk I/O if accessed again shortly.
  • 中文解析 (Chinese Analysis): 在页面访问序列不变的前提下,降低 LRU 缺页中断的方法有:
    1. 增加分配给进程的物理页框数:LRU 属于栈式算法(满足包含性质,不发生贝雷迪异常),因此多给页框一定会减少或维持缺页数。
    2. 增大页面尺寸:利用空间局部性(Spatial Locality),单次换入载入更多邻近数据,减少页面总数。
    3. 页面缓冲机制(Page Buffering):被淘汰的页面不立即清空,而是挂在空闲页面链表尾部,若短期内再次被访问则可以直接回收,免去昂贵的磁盘I/O。

4 【選択問題】計算理論#

Description#

配点: (1-1) 15点, (1-2-1) 10点, (1-2-2) 25点, (1-3) 10点, (2-1) 40点, (2-2) 25点

(1) アルファベット (alphabet) Σab={a,b}\Sigma_{ab} = \{a, b\} で構成される言語 Lab={anbnn is a positive integer}L_{ab} = \{a^n b^n \mid n \text{ is a positive integer} \} を考える.なお,ana^naann 個連結した文字列 (string) を表す.例えば,a3=aaaa^3 = aaa である.また,ε\varepsilon は空文字列 (empty string) を表す.言語 LabL_{ab} を認識(受理)するオートマトン (automaton) に関する以下の各問に答えよ.#

(1-1) プッシュダウンオートマトン (pushdown automaton) は (Q,Σ,Γ,δ,q0,Z,F)(Q, \Sigma, \Gamma, \delta, q_0, Z, F) で表される.QQ は状態 (state) の有限集合,Σ\Sigma は入力アルファベット (input alphabet),Γ\Gamma はスタックアルファベット (stack alphabet),δ\delta は遷移関数 (transition function),q0q_0 は開始状態 (start state),ZZ はスタックの開始記号,FF は最終状態 (final state) の集合である.最終状態による受理 (acceptance by final state) を行うプッシュダウンオートマトンを利用して,言語 LabL_{ab} を認識することを考える.

下図は言語 LabL_{ab} を認識する非決定性 (non-deterministic) プッシュダウンオートマトンの状態遷移図 (state transition diagram) であり,開始状態は q0q_0,最終状態は q2q_2 である.状態遷移図の空欄 [(A)], [(B)], [(C)] に必要な動作を,(r,s)/t(r, s) / t の形式で答えよ.ただし,(r,s)/t(r, s) / t (rΣ{ε},sΓ,tΓr \in \Sigma \cup \{\varepsilon\}, s \in \Gamma, t \in \Gamma^*) は,入力から読み出す記号が rr でスタックから取り出す記号が ss のときに,スタックからその ss を取り去り,tt をスタックに押し込むことを意味する.tt が複数の記号の場合は右側の記号から順にスタックに押し込む.(a,Z)/0Z(a, Z) / 0Z は,aa を読み出すときにスタックから ZZ を取り去り,スタックに ZZ00 をこの順で押し込むことを意味する.ttε\varepsilon の場合は,スタックに記号を押し込まない.rrε\varepsilon の場合は,入力から記号を読み出さないで遷移を行う.入力アルファベットは Σ=Σab\Sigma = \Sigma_{ab},スタックアルファベットは Γ={Z,0}\Gamma = \{Z, 0\} とする.

(a, Z) / 0Z
+-----+
| (A) |
| v
+---- q0 ----+ (e, Z) / e
---> | | --------------> (( q2 ))
+------------+
| ^
| (B) |
| |
v |
+---- q1 ----+
| |
+------------+
| (C) |
+-----+

(1-2) 決定性有限オートマトン (deterministic finite automaton) は (Q,Σ,δ,q0,F)(Q, \Sigma, \delta, q_0, F) で表される.QQ は状態の有限集合,Σ\Sigma は入力アルファベット,δ\delta は遷移関数,q0q_0 は開始状態,FF は最終状態の集合である.入力アルファベットは Σ=Σab\Sigma = \Sigma_{ab} とする.このとき,(1-2-1) および (1-2-2) に答えよ.

(1-2-1) 言語 L2={anbnn=2}L_2 = \{ a^n b^n \mid n = 2 \} を認識する決定性有限オートマトン,および,言語 L3={anbnn=3}L_3 = \{ a^n b^n \mid n = 3 \} を認識する決定性有限オートマトンの状態遷移図をそれぞれ書け.なお,上図に示すように開始状態には太い矢印 (thick arrow) を付与し,最終状態は二重丸 (double circle) で表現すること.また,全ての状態において,全ての入力記号に対する遷移を表記すること.

(1-2-2) 言語 LabL_{ab} を認識する決定性有限オートマトンは存在しないことを背理法 (proof by contradiction) により証明したい.以下の空欄 (D) に適切な文章を記述し,証明を完成させよ.

証明: 言語 LabL_{ab} を認識する決定性有限オートマトンが存在すると仮定し,そのオートマトンの状態数を kk とする.文字列 akbka^k b^k が与えられたとき,aaii 個 (0ik0 \le i \le k) 読み終えた時点での状態を pip_i とすると,

(D)

よって仮定と矛盾するため,言語 LabL_{ab} を認識する決定性有限オートマトンは存在しない. (証明終)

(1-3) 言語 LabL_{ab} を認識する決定性有限オートマトンは存在しないが,言語 Lab={anbmn and m are positive integers}L'_{ab} = \{ a^n b^m \mid n \text{ and } m \text{ are positive integers} \} を認識する決定性有限オートマトンは存在する.言語 LabL'_{ab} を認識する決定性有限オートマトンの状態遷移図を書け.なお,上図に示すように開始状態には太い矢印を付与し,最終状態は二重丸で表現すること.また,すべての状態において,すべての入力記号に対する遷移を表記すること.

(2) 文脈自由文法 (context-free grammar) は,変数 (variable) の有限集合 VV,終端記号 (terminal symbol) の有限集合 TT,生成規則 (production rule) の有限集合 PP,および開始記号 (start symbol) SS の組により定められる.変数は非終端記号 (nonterminal symbol) と呼ぶこともある.Chomsky 標準形 (Chomsky normal form) とは,文脈自由文法のうち,生成規則が,(i) XYZX \to YZ, (ii) XaX \to a のいずれかの形をしたものである.ただし,X,Y,ZX, Y, Z は変数,aa は終端記号である.#

ここで,Chomsky 標準形で与えられる文脈自由文法 G=(V,T,P,S)G = (V, T, P, S) および文字列 w=a1a2anw = a_1 a_2 \dots a_n (ただし,各 aia_iTT に属する)に対し,wwGG によって生成されるか否かを,動的計画法 (dynamic programming) によって効率的に判定するアルゴリズムを考える.まず,整数 i,ji, j のうち 1ijn1 \le i \le j \le n であるものに対し,集合 M[i,j]={XV文法 G において,w の連続した部分文字列 aiai+1aj を変数 X から導出できる}M[i, j] = \{ X \in V \mid \text{文法 } G \text{ において,} w \text{ の連続した部分文字列 } a_i a_{i+1} \dots a_j \text{ を変数 } X \text{ から導出できる} \} を定める.以下に擬似コードで示したアルゴリズムでは各 M[i,j]M[i, j]M[1,1],M[2,2],,M[n,n],M[1,2],M[2,3],,M[n1,n],M[1,3],M[1, 1], M[2, 2], \dots, M[n, n], M[1, 2], M[2, 3], \dots, M[n-1, n], M[1, 3], \dots の順に M[1,n]M[1, n] まで計算している.最後の判定では,wwGG によって生成されるとき,かつそのときに限り SM[1,n]S \in M[1, n] という性質を利用している.

入力 w = a_1 a_2 ... a_n に対し,集合 M[i, j] (1 <= i <= j <= n) の初期値をすべて空集合 Ø とする.
for i = 1 to n do // 部分文字列の長さが 1 の場合の計算
(X -> a_i) in P であるすべての X in V を M[i, i] に追加.
end for
for l = 2 to n do // 他のすべての M[i, j] の計算.l は部分文字列の長さを表す.
for i = 1 to n - l + 1 do // i は部分文字列の先頭位置を表す.
j = i + l - 1 とする. // j は部分文字列の終了位置を表す.
for k = i to j - 1 do // k は部分文字列の分割位置の一つ前を表す.
ある Y in M[i, k], Z in M[k+1, j] に対し,(X -> YZ) in P であるすべての X in V を M[i, j] に追加.
end for
end for
end for
S in M[1, n] であれば Yes を,そうでなければ No を出力して終了. // 判定

文脈自由文法 G1=(V1,T1,P1,S1)G_1 = (V_1, T_1, P_1, S_1) を,V1={A,B,C,D,S},T1={a,b},S1=S,V_1 = \{A, B, C, D, S\}, T_1 = \{a, b\}, S_1 = S, P1={SAB,ACA,AAA,Aa,BDB,Bb,Ca,Db}P_1 = \{ S \to AB, A \to CA, A \to AA, A \to a, B \to DB, B \to b, C \to a, D \to b \} と定める.例えば,文法 G1G_1 と文字列 babbab に対し,上記のアルゴリズム実行した場合の計算は以下のように行われる.

  • まず,M[1,1],M[2,2],M[3,3]M[1, 1], M[2, 2], M[3, 3] が決まる.
  • 次に,部分文字列の長さが l=2l = 2 の場合,先頭位置は i=1,2i = 1, 2 の二つの場合があり,
    • i=1i = 1 ならば j=2j = 2 であり,k=1k = 1 として,YM[1,1],ZM[2,2]Y \in M[1, 1], Z \in M[2, 2] を調べることで M[1,2]M[1, 2] が決まる.
    • i=2i = 2 ならば j=3j = 3 であり,k=2k = 2 として,YM[2,2],ZM[3,3]Y \in M[2, 2], Z \in M[3, 3] を調べることで M[2,3]M[2, 3] が決まる.
  • 最後に,部分文字列の長さが l=3l = 3 の場合,先頭位置は i=1i = 1 の場合だけであり,
    • i=1i = 1 ならば j=3j = 3 である.このとき,k=1k = 1 として,YM[1,1],ZM[2,3]Y \in M[1, 1], Z \in M[2, 3] を調べ, k=2k = 2 として,YM[1,2],ZM[3,3]Y \in M[1, 2], Z \in M[3, 3] を調べることで,M[1,3]M[1, 3] が決まる.

終了時における M[i,j]M[i, j] の内容は以下の表のとおりである.この場合,SM[1,3]S \notin M[1, 3] であるため No が出力される.

M[i,j]M[i, j]j=1j = 1j=2j = 2j=3j = 3
i=1i = 1{B,D}\{B, D\}\emptyset\emptyset
i=2i = 2{A,C}\{A, C\}{S}\{S\}
i=3i = 3{B,D}\{B, D\}

以下の各小問に答えよ.

(2-1) 文法 G1G_1 および文字列 w1=aaabw_1 = aaab に対し,上記のアルゴリズムを実行した場合,終了時における M[i,j]M[i, j] の内容を,上記の例のように,表として示せ.

(2-2) 文脈自由文法 G2=(V2,T2,P2,S2),V2={A,B,S},T2={a,b},S2=S,G_2 = (V_2, T_2, P_2, S_2), V_2 = \{A, B, S\}, T_2 = \{a, b\}, S_2 = S, P2={SAB,SSA,SBS,Sε,Aa,Bb}P_2 = \{ S \to AB, S \to SA, S \to BS, S \to \varepsilon, A \to a, B \to b \} を考える.ここで,ε\varepsilon は空文字列 (empty string) である.文法 G2G_2 は,上で説明した Chomsky 標準形の制約を満たしていないため,上記のアルゴリズムに対して正しく動作しない場合がある.つまり,ある入力文字列に対しては間違った判定をする.その様な入力文字列として長さ 2 以上のものを具体的に示し,正しく動作しないことを説明せよ.


Kai#

(1-1)#

  • 解答:
    • [(A)]: (a, 0) / 00
    • [(B)]: (b, 0) / \varepsilon
    • [(C)]: (b, 0) / \varepsilon
  • 中文解析: 这是一个利用栈匹配 anbna^n b^n 的下推自动机(PDA)。
    • 状态 q0q_0 负责读取字符 aa。若栈顶为底座 ZZ,读入第一个 aa 后将 0 压入,变为 0Z0Z。如果是后续的 aa,此时栈顶为 00,应继续向栈中压入一个 00。因此 q0q_0 的自环 [(A)] 应为 (a, 0) / 00
    • 读到第一个 bb 时,跳转到状态 q1q_1,同时必须消耗一个栈中的 00(代表一次匹配)。因此 [(B)] 应为 (b, 0) / \varepsilon
    • 状态 q1q_1 负责读取后续的 bb,每读入一个 bb 必须消耗栈顶的一个 00。因此 q1q_1 的自环 [(C)] 也是 (b, 0) / \varepsilon
    • 最终栈为空(只剩底座 ZZ)且输入读取完毕时,通过 (\varepsilon, Z) / \varepsilon 迁移至接受状态 q2q_2

(1-2-1)#

  • 解答:
    • DFA for L2={aabb}L_2 = \{aabb\}: 状态集合 Q={q0,q1,q2,q3,q4,qdead}Q = \{q_0, q_1, q_2, q_3, q_4, q_{dead}\},其中 q0q_0 为开始状态,q4q_4 为最终(接受)状态,qdeadq_{dead} 为死状态。
stateDiagram-v2
[*] --> q0
q0 --> q1 : a
q0 --> q_dead : b
q1 --> q2 : a
q1 --> q_dead : b
q2 --> q3 : b
q2 --> q_dead : a
q3 --> q4 : b
q3 --> q_dead : a
q4 --> q_dead : a, b
q_dead --> q_dead : a, b
classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
class q4 accept;
- **DFA for $L_3 = \{aaabbb\}$**:
状态集合 $Q = \{q_0, q_1, q_2, q_3, q_4, q_5, q_6, q_{dead}\}$,其中 $q_0$ 为开始状态,$q_6$ 为最终状态。
stateDiagram-v2
[*] --> q0
q0 --> q1 : a
q0 --> q_dead : b
q1 --> q2 : a
q1 --> q_dead : b
q2 --> q3 : a
q2 --> q_dead : b
q3 --> q4 : b
q3 --> q_dead : a
q4 --> q5 : b
q4 --> q_dead : a
q5 --> q6 : b
q5 --> q_dead : a
q6 --> q_dead : a, b
q_dead --> q_dead : a, b
classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
class q6 accept;
  • 中文解析: 由于 L2L_2L3L_3 是有限语言,DFA 只需要依次严格匹配特定长度的 aabb。因为题目要求**“在所有状态中,必须标明对所有输入符号的迁移”**,所以必须显式引入死状态 qdeadq_{dead}。任何不合规的输入都会直接掉入死状态,且无法逃离。

(1-2-2)#

  • 解答 (Dに入力する文章):
    • 日本語 (Japanese): 鳩の巣原理(Pigeonhole Principle)より,pg=php_g = p_h となるような異なる二つの整数 g,hg, h (0g<hk0 \le g < h \le k) が存在する. ここで,文字列 agbga^g b^gahbga^h b^g に対するオートマトンの遷移を考える. agbgLaba^g b^g \in L_{ab} であるため,初期状態から agbga^g b^g を読み終えた時点での状態は最終状態(受け入れ状態)である. 一方,初期状態から aha^h を読み終えた状態は ph=pgp_h = p_g となる.ここからさらに残り部分の bgb^g を読み終えたときの状態は,aga^g の後に bgb^g を読み終えたときの状態と同一になり,これも最終状態となる. これは,このオートマトンが ahbga^h b^g を受け入れることを意味するが,ghg \neq h より ahbgLaba^h b^g \notin L_{ab} であるため,このオートマトンが LabL_{ab} を認識するという仮定に矛盾する.
  • 英語 (English): By the Pigeonhole Principle, since there are k+1k+1 states in the sequence p0,p1,,pkp_0, p_1, \dots, p_k and the DFA has only kk states, there must exist two distinct integers gg and hh (0g<hk0 \le g < h \le k) such that pg=php_g = p_h. Now, consider the transitions of the automaton for the strings agbga^g b^g and ahbga^h b^g. Since agbgLaba^g b^g \in L_{ab}, the state reached after reading agbga^g b^g from the initial state must be an accepting state. On the other hand, the state reached after reading aha^h from the initial state is ph=pgp_h = p_g. Thus, starting from php_h and reading the remaining bgb^g must lead to the exact same accepting state. This implies that the automaton accepts ahbga^h b^g. However, since ghg \neq h, ahbgLaba^h b^g \notin L_{ab}, which contradicts the assumption that the automaton recognizes LabL_{ab}.
  • 中文解析: 本题是正则语言不可判定性的经典证明(利用鸽巢原理证明,本质上也是泵引理的内核)。
    • 输入 aka^k 在读入每个字符时会经历 k+1k+1 个状态。而有限自动机状态数仅为 kk,所以在前 kk 步中必定有两个不同的步数 g,hg, h 停留在了相同的状态 pg=php_g = p_h
    • 一旦在此处发生状态重合,由于自动机是决定性的(DFA),当后面拼上相同的后缀 bgb^g 时,它们所抵达的最终状态也必定完全相同。
    • 由于 agbgLaba^g b^g \in L_{ab} 是合法串,最终状态必为接受状态,这导致 ahbga^h b^g 也会被误接受,然而 hgh \neq g,该串在数量上并不相等,不属于语言,因而产生矛盾。

(1-3)#

  • 解答: 言語 Lab={anbmn,m1}L'_{ab} = \{a^n b^m \mid n, m \ge 1\} は正規表現 aabba a^* b b^* で表される正規言語である.これを認識する DFA は以下のようになる.
stateDiagram-v2
[*] --> q0
q0 --> q1 : a
q0 --> q_dead : b
q1 --> q1 : a
q1 --> q2 : b
q2 --> q2 : b
q2 --> q_dead : a
q_dead --> q_dead : a, b
classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
class q2 accept;
  • 中文解析: 与 LabL_{ab} 不同,LabL'_{ab} 只要求 aabb 至少各出现一次且 aa 必须在 bb 之前,并不要求两者的数量相等。因此它不需要无限的记忆能力,是正则语言。可以使用 4 个状态的 DFA(包含死状态)来表示。

(2-1)#

  • 解答: 終了時における M[i,j]M[i, j] の内容は以下の表の通りである.SM[1,4]S \in M[1, 4] であるため,判定結果は Yes となる.
M[i,j]M[i, j]j=1j = 1j=2j = 2j=3j = 3j=4j = 4
i=1i = 1{A,C}\{A, C\}{A}\{A\}{A}\{A\}{S}\{S\}
i=2i = 2{A,C}\{A, C\}{A}\{A\}{S}\{S\}
i=3i = 3{A,C}\{A, C\}{S}\{S\}
i=4i = 4{B,D}\{B, D\}
  • 中文解析:
    • =1\ell=1 时,w1=aaabw_1 = aaab 对应的单个字符分别为 a,a,a,ba, a, a, b。由于 Aa,CaA \to a, C \to a,故 M[1,1]=M[2,2]=M[3,3]={A,C}M[1, 1] = M[2, 2] = M[3, 3] = \{A, C\}。同理 Bb,DbB \to b, D \to b,故 M[4,4]={B,D}M[4, 4] = \{B, D\}
    • =2\ell=2 时,计算相邻两两组合。例如对于 aaaa,利用 M[i,i]M[i, i]M[i+1,i+1]M[i+1, i+1] 交叉组合,规则 AAA,ACAA \to AA, A \to CA 将其规约为 AA。故 M[1,2]=M[2,3]={A}M[1, 2] = M[2, 3] = \{A\}。而对于末尾的 abab,通过 M[3,3]={A,C}M[3, 3] = \{A, C\}M[4,4]={B,D}M[4, 4] = \{B, D\} 交叉,由于 SABS \to AB,规约为 SS。故 M[3,4]={S}M[3, 4] = \{S\}
    • 依次类推完成动态规划填表,最后右上角的 M[1,4]M[1, 4] 包含开始符号 SS,表明该字符串可以被文法生成。

(2-2)#

  • 日本語 (Japanese): 正しく動作しない長さ 2 以上の入力文字列の具体例として aaaa (または bbbb, baba)が挙げられる. 文法 G2G_2 において,これらの文字列は SSASAAεAAaaS \Rightarrow SA \Rightarrow SAA \Rightarrow \varepsilon AA \Rightarrow aa という導出が可能であるため,言語 L(G2)L(G_2) に属する.したがって,正しい判定結果は Yes である. しかし,提示されたアルゴリズムを実行した場合: 初期化フェーズで M[1,1]={A}M[1, 1] = \{A\}M[2,2]={A}M[2, 2] = \{A\} となる. 長さ 2 の計算において,アルゴリズムは YM[1,1]Y \in M[1, 1], ZM[2,2]Z \in M[2, 2] から XYZX \to YZ(すなわち XAAX \to AA)の形式の生成規則を探索する.しかし,文法 G2G_2 の生成規則には右辺が AAAA である規則が存在しないため,M[1,2]=M[1, 2] = \emptyset のままとなる. 最終的に SM[1,2]S \notin M[1, 2] となり,アルゴリズムは誤って No を出力する. この問題が発生する理由は,提示されたアルゴリズムが ε\varepsilon(空列)を生成する規則(ε\varepsilon-プロダクション)を考慮しておらず,導出の過程で変数が消去される(空列になる)ケースを追跡できないためである.
  • 英語 (English): A concrete example of a string of length 2 or more for which the algorithm fails is aaaa (or bbbb, baba). In the grammar G2G_2, this string can be derived as SSASAAεAAaaS \Rightarrow SA \Rightarrow SAA \Rightarrow \varepsilon AA \Rightarrow aa, meaning it belongs to the language L(G2)L(G_2), and the correct output should be Yes. However, running the specified algorithm: In the initialization phase, we get M[1,1]={A}M[1, 1] = \{A\} and M[2,2]={A}M[2, 2] = \{A\}. During the computation for length 2, the algorithm searches for production rules of the form XYZX \to YZ where YM[1,1]Y \in M[1, 1] and ZM[2,2]Z \in M[2, 2] (i.e., XAAX \to AA). Since there are no production rules in G2G_2 with AAAA on the right-hand side, M[1,2]M[1, 2] remains \emptyset. Consequently, SM[1,2]S \notin M[1, 2], and the algorithm incorrectly outputs No. The reason for this failure is that the algorithm does not account for ε\varepsilon-productions (rules deriving the empty string). Thus, it cannot trace derivations where a variable is erased (becomes ε\varepsilon) during the derivation process.
  • 中文解析 (Chinese Analysis):
    • 反例:字符串 aaaa(或者 bbbb, baba 等)。
    • 逻辑漏洞说明:在文法 G2G_2 中,由于含有 SεS \to \varepsilon 规则,我们可以通过消去 SS 来实现 SSASAAεAAaaS \Rightarrow SA \Rightarrow SAA \Rightarrow \varepsilon AA \Rightarrow aa,因此 aaaa 是一个合法句子。
    • 然而,CYK 算法要求文法严格处于乔姆斯基范式中(即右侧只能是两个非终结符 YZYZ 或一个终结符 aa)。在计算 M[1,2]M[1, 2] 时,算法只寻找形如 XAAX \to AA 的产生式。由于 P2P_2 中没有右侧为 AAAA 的规则,计算出的 M[1,2]M[1, 2] 为空集,最终输出 No,发生了误判。
    • 其本质原因在于:CYK 算法的动态规划分治策略强行假定每次切分成的两部分都至少产生长度为1的字串,它无法追踪和处理推导中途某一部分坍缩为 ε\varepsilon(空串)的消去路径。

5 【選択問題】ネットワーク#

Description#

配点: (1-1) 10点, (1-2-1) 15点, (1-2-2) 25点, (1-3) 15点, (1-4) 15点, (2-1) 20点, (2-2-1) 10点, (2-2-2) 10点, (2-2-3) 10点

(1) ビット誤り (bit error) が発生することがある伝送路 (transmission line) を用いて,送信端末 (terminal) の応用プログラムがファイル (file) を受信端末の応用プログラムに転送するプロトコル (protocol) を考える.プロトコルでは,応用プログラムがファイルをデータ (data) に分割し,送信端末が分割されたデータをデータパケット (packet) を用いて転送する.以下の各小問に答えよ.なお,端末は受信したパケットのビット誤りを検出できるものとする.さらに,小問 (1-1) から (1-3) では,パケットは紛失 (loss) しないことを仮定する.#

(1-1) ビット誤りが発生したデータパケットを再送 (retransmit) するプロトコルを考える.このプロトコルをプロトコル 1 と呼び,その送信端末の状態遷移図 (state transition diagram) を図 1 に示す.状態遷移では,発生したイベント (event) に基づきアクション (action) が実行され,次の状態に遷移する.イベントとアクションの組は図 1 の破線の枠内に示す通りに記載する.使用するイベント,アクションとそれらに付随する変数 (variable) を図 2 に示す.プロトコル 1 では,送信端末はシーケンス番号 (sequence number) に 0 を設定してデータパケットを送信する.一方,受信端末は,データパケットを受信すると,ビット誤りが無い場合は確認応答 (positive acknowledgement) パケットを返送し,ビット誤りを検出すると否定確認応答 (negative acknowledgement) パケットを返送する.以降,これら二つのパケットを応答パケットと総称する.なお,プロトコル 1 では,応答パケットのシーケンス番号には 0 を設定し,応答パケットにはビット誤りが発生しないものとする.図 1 の状態遷移図の空欄 (あ),(い) に,それぞれ一つのアクションを埋めよ.

OnWriteData
------------
sendData(0, data)
/ \
/ v
(( state 1 )) (( state 2 ))
^ /
| OnRecvAck(0)
| ------------
| (い)
\ /

(注: state 2 から自身へのループイベントとして OnRecvNack(0) があり、その下のアクション部分が (あ) となっている)

(1-2) 次に,プロトコル 1 を改良し,応答パケットにビット誤りが発生したとき,データパケットを再送するプロトコルを考える.ここで,図 3 に示すイベントを追加する.(1-2-1) および (1-2-2) に答えよ.

(1-2-1) 送信端末の状態遷移図を図 4 とするプロトコルをプロトコル 2 と呼ぶ.しかし,プロトコル 2 では,送信端末の応用プログラムが転送したファイルの中身と,受信端末の応用プログラムが受領したファイルの中身が一致しないことがある.この問題が発生する条件を一つ示し,ファイルの中身が一致しない理由を説明せよ.

イベント OnRecvBiterr: ビット誤りがある応答パケットを受信.

図 4 の送信端末の状態遷移図では、図 1 に加え、state 2 から自身へのループ遷移として OnRecvBiterr / sendData(0, data) が追加されている。

(1-2-2) 応答パケットのビット誤りに対処できるように,送信端末がデータパケットに,0 と 1 のシーケンス番号を交互に設定し,最初のデータパケットには 0 を設定する方針でプロトコル 3 を設計する.受信端末は,データパケットを受信すると,ビット誤りの有無にかかわらず,確認応答パケットを返送する.データパケットにビット誤りが無いとき,次に受信することを期待するシーケンス番号 (next expected sequence number) を確認応答パケットに設定する.一方,ビット誤りを検出すると,受信することを期待していたシーケンス番号を確認応答パケットに設定する.図 5 の空欄 (う) 〜 (き) に,それぞれ一つのイベントあるいはアクションを埋めることで,プロトコル 3 の送信端末の状態遷移図を完成させよ.

図 5 では、4つの状態(state 1, state 2, state 3, state 4)を持つ。

  • state 1 (初期状態) OnWriteData/sendData(0,data)\xrightarrow{OnWriteData / sendData(0, data)} state 2
  • state 2 の自環遷移: (う) または (え) / (お)
  • state 2 OnRecvAck(1)/Λ\xrightarrow{OnRecvAck(1) / \Lambda} state 3
  • state 3 OnWriteData/sendData(1,data)\xrightarrow{OnWriteData / sendData(1, data)} state 4
  • state 4 の自環遷移: (う) または (か) / (き)
  • state 4 OnRecvAck(0)/Λ\xrightarrow{OnRecvAck(0) / \Lambda} state 1 (注: Λ\Lambda は「何もしない」を表すアクションである)

(1-3) 伝送路の帯域 (bandwidth) は 16001600 [ビット/秒],伝搬遅延 (propagation delay) は 1010 [ミリ秒],送信端末と受信端末のプロトコルの処理遅延 (processing delay) は 00 [ミリ秒],確認応答パケットは 8 ビット長と仮定する.このとき,24 ビット長のデータパケットを転送するプロトコル 3 の送信端末が,1 秒間に転送できる最大のデータパケット数を求めよ.あわせて,計算過程も示せ.

(1-4) 本小問では,伝送路でパケットが紛失することがあると仮定する.プロトコル 3 において,受信端末の動作を変えることなく,送信端末がデータパケットや確認応答パケットの紛失に対処する方法を一つ説明せよ.説明にあたっては,状態遷移図を示す必要はない.

(2) 伝送路における誤り検出 (error detection) に関する以下の各小問に答えよ.#

(2-1) 以下の文章の空欄 (あ) 〜 (お) を埋めよ.

ある情報が送信された後,伝送路上において電気的雑音 (noise) により受信された情報に誤りが発生する場合がある.これに対処するためには,誤り検出が必要となる. 誤り検出の例として, (あ) が挙げられる. (あ) とは,元の情報ビットに対し,1の総数が奇数または偶数となるようなチェックビット (check bit) を付与する方法である.例えば,272^7 個の文字や記号を 7 ビットで表現する符号の場合,符号語 (codeword) 間の最小ハミング距離 (minimum Hamming distance) は 1 であるが,チェックビットを付与することによって符号語間の最小ハミング距離は (い) になる.一般に,最小ハミング距離が (い) の符号は, (う) ビットの誤りをすべて検出できる. 2ビット以上の誤りや,あるいは符号語の連続したビットに発生する誤りである (え) にも対処できるように,巡回符号 (cyclic code) が広く用いられる.巡回符号は, (え) の検出に優れており,生成多項式 (generator polynomial) の次数が rr であるとき, (お) ビット以下の (え) を必ず検出できる.

(2-2) 2元巡回符号 (binary cyclic code) を用いた誤り検出について,(2-2-1)〜(2-2-3) に答えよ.

(2-2-1) 生成多項式 G(x)G(x) の2元巡回符号を考える.G(x)G(x) の次数を rr とし,符号長を nn とする.このとき,情報ビットの長さ mmnrn-r である.情報ビット “am1am2a1a0a_{m-1}a_{m-2}\dots a_1a_0” を多項式 M(x)=am1xm1+am2xm2++a1x+a0M(x) = a_{m-1}x^{m-1} + a_{m-2}x^{m-2} + \dots + a_1x + a_0 で表現するとき,M(x)M(x) から符号語多項式 (code polynomial) F(x)F(x) を生成する方法を説明せよ.

(2-2-2) 生成多項式 G(x)G(x) として G(x)=x4+x+1G(x) = x^4 + x + 1 を用いる.符号長 nn1515 とするとき,情報ビット “0001101001100011010011” を送信する場合の符号語多項式 F(x)F(x) を,(2-2-1) で説明した方法をもとに生成せよ.

(2-2-3) 受信側において,受信語 (received word) を表す多項式に基づいて誤りを検出する方法を一つ説明せよ.


Kai#

(1-1)#

  • 解答:
    • (あ): sendData(0, data)
    • (い): Λ\Lambda (または 何も行わない)
  • 中文解析:
    • 当发送方在 state 2(等待 ACK/NACK)时,如果收到 OnRecvNack(0)(即接收方检测到数据包0有错并返回否定应答),发送方需要重传该数据包。因此 (あ) 应执行 sendData(0, data)
    • 如果收到 OnRecvAck(0)(即成功接收确认),发送方转回 state 1 以等待上层应用写入新数据,在此过程中不需要发送任何新数据,因此 (い) 执行 \Lambda(无动作)。

(1-2-1)#

  • 日本語 (Japanese):
    • 発生条件: 受信端末から送信された確認応答パケット(ACK)が伝送路上で破損(ビット誤りが発生)し、送信端末が OnRecvBiterr イベントを検知した場合。
    • 理由: 送信端末は破損した ACK を受け取ると、データパケット(シーケンス番号 0)を再送する。しかし、プロトコル 2 ではシーケンス番号が 0 に固定されている(交互のシーケンス番号を持たない)ため、受信端末はこの再送パケットが「既に受け取ったパケットの重複」なのか「新しく送信された別のパケット」なのかを区別できない。その結果、受信端末は重複データを新しいデータとしてファイルに書き込んでしまい、ファイルの内容に不一致が生じる。
  • 英語 (English):
    • Condition: A positive acknowledgement (ACK) packet sent by the receiver is corrupted (bit error occurs) during transmission, triggering the OnRecvBiterr event at the sender.
    • Reason: Upon receiving a corrupted ACK, the sender retransmits the data packet (with sequence number 0). However, because Protocol 2 uses a static sequence number of 0 (no alternating numbers), the receiver cannot distinguish whether this incoming packet is a duplicate of the already accepted packet or a brand-new packet. As a result, the receiver accepts the duplicate packet as new data and writes it to the file, causing a mismatch in file contents.
  • 中文解析 (Chinese Analysis):
    • 触发条件:接收方发送的确认包(ACK)在回传途中受损,导致发送方收到并触发了 OnRecvBiterr 事件。
    • 不一致原因:发送方由于 ACK 损坏,无法确信接收方已成功收包,因而选择重传当前数据包(序号仍为0)。但由于协议没有交替序号(Alternating Sequence Number)设计,接收方在收到这个重传包时,无法辨别它是“上一个包的重复重传”还是“新发出的独立包”,进而直接将其作为新数据写入文件。这导致接收到的文件相比源文件多出了重复的数据块,内容不再一致。

(1-2-2)#

  • 解答:
    • (う): OnRecvBiterr
    • (え): OnRecvNack(0)
    • (お): sendData(0, data)
    • (か): OnRecvNack(1)
    • (き): sendData(1, data)
  • 【検証・注記】: 本問の図5(問題文の遷移図)には学術的な記載ミス(タイポ)が存在する。
    • state 2(データ0のACK待ち)から state 3 への遷移が OnRecvAck(1) とされており,
    • state 4(データ1のACK待ち)から state 1 への遷移が OnRecvAck(0) とされている。 これは順序が逆であり,本来は「データ0を送信した後は OnRecvAck(0) で遷移する」のが正しい(rdt2.1/3.0準拠)。 しかし,空欄 (う)~(き) の定義自体は再送処理ループ内であるため,このタイポの影響を受けずに以下のように一意に定まる。
    • (う):両方の待機状態で共通する再送トリガーである「応答パケットのビットエラー」\to OnRecvBiterr
    • (え)state 2 においてデータ0の否定応答を受け取ったイベント \to OnRecvNack(0)
    • (お)state 2 で行うべきデータ0の再送処理 \to sendData(0, data)
    • (か)state 4 においてデータ1の否定応答を受け取ったイベント \to OnRecvNack(1)
    • (き)state 4 で行うべきデータ1の再送処理 \to sendData(1, data)
  • 中文解析: 这是可靠数据传输协议 rdt2.1(交替发送协议)的发送端状态机实现。
    • 状态 2(等待对包0的确认)和状态 4(等待对包1的确认)中,引起包重传的共同原因都是“接收到的控制包受损”,因此公用空栏 (う)OnRecvBiterr
    • 状态 2 对应包 0 的传输,所以当接收到否定确认 OnRecvNack(0)(即 (え))时,重传数据包 0 sendData(0, data)(即 (お))。
    • 状态 4 对应包 1 的传输,所以当接收到否定确认 OnRecvNack(1)(即 (か))时,重传数据包 1 sendData(1, data)(即 (き))。 (注:原卷状态机中,去往下一个状态的判定条件 OnRecvAck(1)OnRecvAck(0) 存在反向拼写错误,但在不考虑此笔误的情况下,根据自环转移逻辑,(う)~(き) 的答案完全不变。)

(1-3)#

  • 解答: 2525
  • 計算過程: プロトコル 3 は Stop-and-Wait(送達確認)プロトコルである。 1パケットあたりの総伝送時間 TtotalT_{total} は、データパケットの送信遅延 TdataT_{data}、往復伝搬遅延 2Dp2 \cdot D_p、処理遅延 DprocD_{proc}、および確認応答パケットの送信遅延 TackT_{ack} の和となる。
    • データパケットの送信遅延: Tdata=24 [ビット]1600 [ビット/秒]=0.015 秒(15 ミリ秒)T_{data} = \frac{24 \text{ [ビット]}}{1600 \text{ [ビット/秒]}} = 0.015 \text{ 秒} \quad (15 \text{ ミリ秒})
    • 確認応答パケットの送信遅延: Tack=8 [ビット]1600 [ビット/秒]=0.005 秒(5 ミリ秒)T_{ack} = \frac{8 \text{ [ビット]}}{1600 \text{ [ビット/秒]}} = 0.005 \text{ 秒} \quad (5 \text{ ミリ秒})
    • 往復の伝搬遅延: 2Dp=2×10 ミリ秒=20 ミリ秒(0.020 秒)2 \cdot D_p = 2 \times 10 \text{ ミリ秒} = 20 \text{ ミリ秒} \quad (0.020 \text{ 秒})
    • 処理遅延: Dproc=0 秒D_{proc} = 0 \text{ 秒} したがって,データパケット 1 個を送信して確認応答を受け取るまでの総時間 TtotalT_{total} は: Ttotal=Tdata+2Dp+Tack+Dproc=15+20+5+0=40 ミリ秒(0.040 秒)T_{total} = T_{data} + 2 \cdot D_p + T_{ack} + D_{proc} = 15 + 20 + 5 + 0 = 40 \text{ ミリ秒} \quad (0.040 \text{ 秒}) これより,1秒間(1000ミリ秒)に転送できる最大のデータパケット数 NmaxN_{\max} は: Nmax=1 秒Ttotal=1.0 秒0.040 秒=25 個N_{\max} = \frac{1 \text{ 秒}}{T_{total}} = \frac{1.0 \text{ 秒}}{0.040 \text{ 秒}} = 25 \text{ 個}
  • 中文解析:
    • 停止等待协议中,发送一个数据包从开始到收到 ACK 确认的总时间(不含排队和丢包重传)为: Ttotal=tdata_transmission+RTT+tack_transmission+tprocessingT_{total} = t_{data\_transmission} + RTT + t_{ack\_transmission} + t_{processing}
    • 数据包传输延迟:24 bits/1600 bps=0.015 s=15 ms24\text{ bits} / 1600\text{ bps} = 0.015\text{ s} = 15\text{ ms}
    • ACK包传输延迟:8 bits/1600 bps=0.005 s=5 ms8\text{ bits} / 1600\text{ bps} = 0.005\text{ s} = 5\text{ ms}
    • 信号双程传播延迟:RTT=2×10 ms=20 msRTT = 2 \times 10\text{ ms} = 20\text{ ms}
    • 处理延迟为 0。
    • 故单次循环时间 Ttotal=15+20+5=40 ms=0.04 sT_{total} = 15 + 20 + 5 = 40\text{ ms} = 0.04\text{ s}
    • 1秒钟内能发送的最大分组数为:1/0.04=251 / 0.04 = 25 个。

(1-4)#

  • 日本語 (Japanese): 送信端末にタイムアウトタイマー(timeout timer)を導入する。 送信端末はデータパケットを送信する際にタイマーをスタートさせ、あらかじめ設定した一定時間内(タイムアウト時間)に応答パケットが返ってこない場合、データパケットまたは応答パケットが途中で紛失したとみなして、該当するデータパケットを自動的に再送する。これにより、受信側の動作を変更することなく紛失に対処できる。
  • 英語 (English): Introduce a timeout timer at the sender. Upon transmitting a data packet, the sender starts a timer. If no corresponding acknowledgement packet is received within a predefined time interval (timeout period), the sender assumes that either the data packet or its ACK was lost, and automatically retransmits the same data packet. This resolves the packet loss issue without requiring any modification to the receiver’s logic.
  • 中文解析 (Chinese Analysis): 引入**超时重传定时器(Timeout Timer)**机制。 发送方在每次发送数据包的同时启动一个定时器。如果在预设的超时时间内没有收到来自接收方的任何确认包(ACK),则认为传输路径上发生了丢包(可能是数据包丢失,也可能是返回的确认包丢失)。此时,发送方将自动重新发送该数据包,从而在不需要改动接收方的情况下实现丢包修复。

(2-1)#

  • 解答: (あ) 奇偶検査 (または パリティ検査), (い) 2, (c) 1, (d) バースト誤り, (e) rr
  • 中文解析:
    • 简单的校验位添加方法是 (あ) 奇偶校验(パリティ検査 / parity check)。
    • 加入1位校验位后,原本为1的最小哈明距离变为了 (い) 2。
    • 最小哈明距离为 2 的编码可以完全检测出 (う) 1 位错误。
    • 对于连续发生的密集型错误,称为 (え) 突发错误(バースト誤り / burst error)。
    • 在循环冗余校验(CRC)中,若生成多项式次数为 rr,则可以 100%100\% 保证检出长度不大于 (お) rr 位的突发错误。

(2-2-1)#

  • 日本語 (Japanese):
    1. 情報多項式 M(x)M(x)xrx^r を乗じて,rr 次だけ左シフトした多項式 xrM(x)x^r M(x) を作成する.
    2. xrM(x)x^r M(x) を生成多項式 G(x)G(x) で除算(GF(2) 上の排他的論理和を用いたモジュロ2除算)し,余り多項式 R(x)R(x) (次数は r1r-1 以下)を求める.すなわち,商を Q(x)Q(x) としたとき,次式が成立する: xrM(x)=Q(x)G(x)R(x)x^r M(x) = Q(x) G(x) \oplus R(x)
    3. 符号語多項式 F(x)F(x) は,xrM(x)x^r M(x) に余り多項式 R(x)R(x) を加算(GF(2) 上では加算と減算が等価であるため,XOR演算)することで得られる: F(x)=xrM(x)R(x)F(x) = x^r M(x) \oplus R(x)
  • 英語 (English):
    1. Multiply the information polynomial M(x)M(x) by xrx^r to obtain xrM(x)x^r M(x), shifting the message bits by rr positions to the left.
    2. Divide xrM(x)x^r M(x) by the generator polynomial G(x)G(x) using modulo-2 polynomial division (arithmetic over Galois Field 2, GF(2)), yielding a remainder polynomial R(x)R(x) of degree at most r1r-1. This relationship is represented as: xrM(x)=Q(x)G(x)R(x)x^r M(x) = Q(x) G(x) \oplus R(x)
    3. The code polynomial F(x)F(x) is constructed by adding (using XOR, which is equivalent to subtraction in GF(2)) the remainder polynomial R(x)R(x) to xrM(x)x^r M(x): F(x)=xrM(x)R(x)F(x) = x^r M(x) \oplus R(x)
  • 中文解析 (Chinese Analysis): 系统CRC循环冗余校验码生成的多项式表示方法如下:
    1. 升幂移动:将信息多项式 M(x)M(x) 乘以 xrx^r,使信息位向高位移动 rr 位,预留低位的校验位空间。
    2. 模二除法求余:在有限域 GF(2) 上,将 xrM(x)x^r M(x) 除以生成多项式 G(x)G(x),得到商为 Q(x)Q(x) 和余数为 R(x)R(x)。余数多项式的最高次数小于 rr
    3. 拼接生成码字:将余数 R(x)R(x) 加到 xrM(x)x^r M(x) 的末尾(由于GF(2)中加减法等价于异或,所以直接加即是拼接)。得到的符号多项式为 F(x)=xrM(x)R(x)F(x) = x^r M(x) \oplus R(x),它必能被 G(x)G(x) 整除。

(2-2-2)#

  • 解答: F(x)=x11+x10+x8+x5+x4+x3+1F(x) = x^{11} + x^{10} + x^8 + x^5 + x^4 + x^3 + 1 (符号語ビット列は 000110100111001)
  • 導出過程: 情報ビット “0001101001100011010011” から情報多項式 M(x)M(x) を作成する.ビット長 m=11m = 11 より: M(x)=0x10+0x9+0x8+1x7+1x6+0x5+1x4+0x3+0x2+1x1+1x0M(x) = 0 \cdot x^{10} + 0 \cdot x^9 + 0 \cdot x^8 + 1 \cdot x^7 + 1 \cdot x^6 + 0 \cdot x^5 + 1 \cdot x^4 + 0 \cdot x^3 + 0 \cdot x^2 + 1 \cdot x^1 + 1 \cdot x^0 M(x)=x7+x6+x4+x+1M(x) = x^7 + x^6 + x^4 + x + 1 生成多項式 G(x)=x4+x+1G(x) = x^4 + x + 1 の次数は r=4r = 4 である. M(x)M(x)x4x^4 を乗ずると: x4M(x)=x11+x10+x8+x5+x4x^4 M(x) = x^{11} + x^{10} + x^8 + x^5 + x^4 これをビット列表記(x11x^{11} から x0x^0 まで)すると,[1,1,0,1,0,0,1,1,0,0,0,0][1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0] となる. 生成多項式 G(x)=x4+x+1G(x) = x^4 + x + 1 (ビット列表記は [1,0,0,1,1][1, 0, 0, 1, 1])を用いて,GF(2) 上の多項式除算を行う. x11+x10+x8+x5+x4=(x7+x6+x2+x+1)(x4+x+1)(x3+1)x^{11} + x^{10} + x^8 + x^5 + x^4 = (x^7 + x^6 + x^2 + x + 1)(x^4 + x + 1) \oplus (x^3 + 1) よって,余り多項式 R(x)R(x) は: R(x)=x3+1R(x) = x^3 + 1 (ビット列は 1001)となる. したがって,生成される符号語多項式 F(x)F(x) は: F(x)=x4M(x)R(x)=x11+x10+x8+x5+x4+x3+1F(x) = x^4 M(x) \oplus R(x) = x^{11} + x^{10} + x^8 + x^5 + x^4 + x^3 + 1 であり,これを 15 ビット(x14x^{14} から x0x^0 まで)の符号語ビット列で表すと 000110100111001 となる.
  • 中文解析:
    • 输入信息位有 11 位,对应多项式为 M(x)=x7+x6+x4+x+1M(x) = x^7 + x^6 + x^4 + x + 1
    • 生成多项式 G(x)=x4+x+1G(x) = x^4 + x + 1 次数 r=4r=4
    • 升幂项 x4M(x)=x11+x10+x8+x5+x4x^4 M(x) = x^{11} + x^{10} + x^8 + x^5 + x^4
    • 进行模二除法: x11+x10+x8+x5+x4x4+x+1\frac{x^{11} + x^{10} + x^8 + x^5 + x^4}{x^4 + x + 1} 利用异或模拟手算,求出余数 R(x)=x3+1R(x) = x^3 + 1,对应二进制校验位为 1001
    • 组合得最终发送的多项式:F(x)=x11+x10+x8+x5+x4+x3+1F(x) = x^{11} + x^{10} + x^8 + x^5 + x^4 + x^3 + 1
    • 写成 15 位完整码字(前 11 位信息位 + 后 4 位校验位):000110100111001

(2-2-3)#

  • 日本語 (Japanese): 受信したビット列に対応する多項式を Y(x)Y(x) とする。受信側では、Y(x)Y(x) を生成多項式 G(x)G(x) でモジュロ2除算し、その余り多項式(シンドローム) S(x)S(x) を算出する。
    • S(x)=0S(x) = 0 (余りがゼロ)であれば、伝送路中でビット誤りは発生しなかったと判定してデータを受理する。
    • S(x)0S(x) \neq 0 (余りがゼロでない)であれば、誤りが発生したと判定してデータを破棄(または再送を要求)する。
  • 英語 (English): Let Y(x)Y(x) be the polynomial representing the received bit stream. The receiver divides Y(x)Y(x) by the generator polynomial G(x)G(x) using modulo-2 division to compute the remainder polynomial (syndrome) S(x)S(x).
    • If S(x)=0S(x) = 0 (the remainder is zero), the receiver determines that no bit error occurred during transmission and accepts the data.
    • If S(x)0S(x) \neq 0 (the remainder is non-zero), the receiver detects that transmission errors occurred and rejects the data (or requests retransmission).
  • 中文解析 (Chinese Analysis): 接收端检错的方法是计算余数校验(Syndrome/余式)
    1. 设接收到的 15 位比特流对应的多项式为 Y(x)Y(x)
    2. 接收端将其除以生成多项式 G(x)G(x)(模二除法),计算余数多项式 S(x)S(x)
    3. 判定依据
      • S(x)=0S(x) = 0,说明能被整除,判定传输中无差错,正常接收。
      • S(x)0S(x) \neq 0,说明产生了差错,判定数据损坏,进行丢弃或要求重传。
Osaka University IST Graduate Entrance Exam (2020)
https://blog.yirong.site/posts/0077/
Author
Kuchina
Published at
2026-07-15
License
CC BY-NC-SA 4.0
ページ閲覧数: 読み込み中…
サイト閲覧数: 読み込み中…