CRC(巡回冗長検査)

送信データを生成多項式で多項式の割り算(XOR)し、その余りを CRC として付ける。割り算を 1 段ずつ動かして、なぜ誤りが検出でき、なぜ一部のパターンはすり抜けるのかを体感します。

送信データ
生成多項式 G
データ M(ビット数 k)
CRC ビット数 r
CRC(=余り)
多項式の割り算(mod-2 = 桁上がりなしの XOR 引き算)— G の最上位が立つ桁で XOR、1 段ずつ右へ

受信側:ビットを反転させて誤りを起こす

送信される符号語(データ+CRC)。クリックで通信路ノイズを再現=そのビットを反転
CRC はデータビット列を 1 つの多項式とみなします(各ビットが x の係数)。 データの後ろに r 個の 0 を付けてから、あらかじめ決めた生成多項式 Gmod-2 の割り算(引き算が XOR になる割り算)を行い、その余りを CRC として末尾に書き込みます。
こうして作った符号語は必ず G で割り切れます。受信側はもう一度 G で割り、余りが 0 なら誤りなし0 でなければ誤りありと判定します。
ただし、化けたビットの「誤りパターン」がたまたま G の倍数になると、余りが 0 のまま=すり抜け(検出漏れ)が起きます。

いま何が起きている?

ここが CRC の核心