はじめに
RS符号(リード・ソロモン符号)は、データの転送や記録時に発生するミスを検出し自動で修正するための誤り訂正符号の一種です。
計算の仕組みを下記にまとめます。
1. 送信側の準備(符号化)
まず2つの根(例:α1と α2)で割り切れる式を作ります。
- 生成多項式 G(x) の作成:
G(x)=(x+α1)(x+α2)=x2+α4x+α3
- 割り算で余りを出す:
データ M(x) を G(x) で割り、余りをくっつけて送信データ W(x) を作ります。
- 完成した W(x) の特徴:
W(α1)=0 かつ W(α2)=0 になる。(これが検証時の合格基準)
1. 準備:スペースを空ける
送りたいデータ M(x)=α1に検査列(余り)を入れるための2次分の空席を作ります。
- 計算: M(x)⋅x2=α1x2
- これを「中身がまだ空っぽの送信データ案」と呼びましょう。
2. 実行:生成多項式 G(x) で割る
この案をG(x)=(x+α1)(x+α2)=x2+α4x+α3で割ります。
目的は「あとどれだけ足りないか(余り)」を調べることです。
【筆算のプロセス】
-
商を立てる: 先頭の α1x2を消すために商に α1を立てます。
-
引き算用の式を作る: 商 α1と G(x)を掛けます。
- α1⋅(x2+α4x+α3)=α1x2+α5x+α4
-
余りを出す: 元の案から今の式を引き(足し)ます。
- (α1x2)+(α1x2+α5x+α4)=α5x+α4
- これが 余り R(x) です。
3. 合体:完成した W(x) の正体
元の案に今出した余りをくっつけます。
- W(x)=α1x2+(α5x+α4)
ここで数学的なマジックが起きています。この式をよく見るとステップ2で作った「引き算用の式」そのものになっていますよね?
つまりW(x)=α1⋅G(x)という形になっているのです。
4. 特徴:なぜ 0 になるのか?
完成した W(x)は 「G(x)の倍数」 です。
中身を分解するとこうなっています:
W(x)=α1⋅(x+α1)(x+α2)
この式に x=α1や x=α2を代入するとどうなるでしょうか?
- x=α1 を代入:
W(α1)=α1⋅(α1+α1)⋅(α1+α2)=α1⋅(0)⋅(α1+α2)=0
- x=α2 を代入:
W(α2)=α1⋅(α2+α1)⋅(α2+α2)=α1⋅(α2+α1)⋅(0)=0
「G(x)で割って余りを出す」という作業は言い換えれば 「データを G(x)の倍数に無理やり整形する作業」 です。
- わざと割る ことで足りないパーツ(余り)を特定する。
- そのパーツを くっつける ことで全体を G(x) で割り切れる形にする。
- G(x) は最初から (x+α1) と (x+α2) を持っているのでそれら(根)を代入すれば必ず 0 になる。
2. 受信側での異常検知(シンドローム計算)
受信したデータを R(x)とします。もし途中でエラー E(x)が混じるとR(x)=W(x)+E(x)となります。
受信側は2つの根を代入して、シンドローム(S1,S2)を出します。
- S1=R(α1)=W(α1)+E(α1)=E(α1)
- S2=R(α2)=W(α2)+E(α2)=E(α2)
- もし両方 0 なら: エラーなし(合格!)。
- もし 0 でなければ: その値(S1,S2)の中にエラーの場所と大きさの情報が閉じ込められています。
3. エラーの特定(方程式を解く)
ここが一番のポイントです。
仮に「xjという場所にYという大きさのエラー」が起きたとするとシンドロームは以下のようになります。
- S1=Y⋅(α1)j
- S2=Y⋅(α2)j
この2つの式はいわば「犯人が残した2つの足跡」です。これを連立方程式として解くことで未知数である j(場所) と Y(大きさ) を特定します。
具体例:
S2を S1で割ってみると…
S1S2=Y⋅αjY⋅α2j=αj
この結果を見れば αが何乗されているか=「どの場所(j)が化けたか」が一発でわかります!場所がわかれば、大きさ Yもすぐに逆算できます。
4. 修正(訂正)
場所 jと 大きさ Yが判明したら最後に修理をします。
- 修正: 受信データ R(x) の該当箇所に算出したエラー Y を足します。
- 結果: 化けていたビットが反転し、元の正しい W(x) に戻ります。
具体的な計算
- 生成多項式の根: x=α1 と x=α2
- 正しい送信データ W(x): α1x2+α5x+α4
- ルール: α7=1、また足し算は「同じものを足すと 0」になる世界です。
1. エラー発生!
通信中に x1の項(α5x) がノイズで α2xに化けて届いたとします。
- 受信データ R(x)=α1x2+α2x+α4
受信側はどこが化けたかまだ知りません。
2. シンドローム(足跡)を計算する
受信した R(x)に根を代入して計算します。
① S1の計算 (x=α1を代入)
S1=α1(α1)2+α2(α1)+α4
=α3+α3+α4
=0+α4=α4
② S2の計算 (x=α2を代入)
S2=α1(α2)2+α2(α2)+α4
=α5+α4+α4
=α5+0=α5
3. 犯人(場所と大きさ)を特定する
出揃ったシンドローム S1=α4,S2=α5を使って分析します。
【ステップA:場所 jを出す】
比率を計算します。
S1S2=α4α5=α1
公式 S1S2=αjに当てはめると、αj=α1なので、場所は j=1(x1の項) だと判明しました!
【ステップB:大きさ Yを出す】
S1=Y⋅(α1)jに、いま分かった j=1を入れます。
α4=Y⋅α1
Y=α1α4=α3
これで「x1の場所に α3というエラーが足された」ことが特定できました。
4. データを修正する
受信したデータの x1の項(α2)に、特定したエラー(α3)を足して打ち消します。
- 修正計算: α2+α3
(ビットで見ると 100+011=111)
α2+α3 の結果は α5 になります。
- 復活したデータ: α1x2+α5x+α4
見送信側が送った元のデータに戻りました。
- S2÷S1 で「場所」を特定
- 逆算で「大きさ」を特定
- 足し算で「エラーを消去」
まとめ
- 送信側: 2つの根で割り切れるように「余り」を仕込む。
- 受信側: 2つの根を代入して「2つのシンドローム」を出す。
- 特定: 2つのシンドロームを比較して「場所」と「大きさ」を割り出す。
- 修正: 特定したエラーを上書きして消去する。
根が2つあるおかげで、「どこが」「どう」間違ったのかを計算できます。