fc2ブログ

誤り訂正符号Blog

誤り訂正符号に関してなんでも

かぼちゃおしマイケル

前回までで、リードソロモン符号の符号化・復号の方法を一通り示すことができました。

”「ちょっと誤り訂正符号を使ってみたいな」という実務家の皆さん向けに、非常に簡易に誤り訂正符号の原理・アルゴリズムについて説明する”ということを目的に作成された本ブログですが、いかがだったでしょうか。
多分に説明不足な点がありますが、「多項式の符号化・復号→多項式の係数を有限に制限したものとしてのリードソロモン符号」という流れは、自然で原理を理解しやすくて、もう少し肉付けして書けばなかなか良いのではないかと勝手に思っています。

しかし説明不足感は否めません。
何も知らずにこれを読んでリードソロモン符号をコーディングすることができた方がいましたら、すばらしい読解力&工学センスです。
何しろ、二重以上の誤りを訂正する方法を示していませんから…(方程式を示したんですが、解法は「結構技巧を要する」とだけ書いただけでした。実は恐ろしいほどの技巧を要します。)

ということで、このまま終わるのも無責任なので、最後にお勧め文献を示しておきます。(あれ、始めっからそうしておけばよかった?)

[1] 今井 秀樹, "符号理論," 電子情報通信学会, 1990.
[2] 情報理論とその応用学会, "符号理論とその応用," 培風館, 2003.

[1]は入門用としては難解かもしれませんが、「本ブログの内容を読んで誤り訂正のイメージをつかんでおけば」、丁寧に書かれているので理解できるのではないかと思います。また、このブログで示さなかった多重誤りの訂正法で、計算量の面で定評のある”ユークリッド法”が例を交えて具体的に書かれているのもグッドです。

[2]は応用事例が豊富であり、誤り訂正符号は分かったけど実際にどう使えばいいの?という疑問に答えてくれると期待します。

とりあえず、本ブログでは誤り訂正符号を実際に使うことを目的に書きましたが、”手法の数学的なおもしろさ”は残念ながら伝えられなかったと思います。
ぜひ、上の書籍でそれを堪能されることを望んでやみません。
なお、私はこれらの本の関係者ではまったくもってありません。

では、ごきげんよう。
また、会う日まで。
スポンサーサイト





かぼちゃ具体的に計算してみる

前回、リードソロモン符号の生成多項式の作り方について述べましたが、この説明だけで本当にリードソロモン符号を使える方がどれだけいるのかというのは、はなはだ疑問であるので、もうちょっと具体的に計算をしてみます。

5進数をリードソロモン符号化する際の生成多項式は

G(x) = x2 + 4x + 3

であることを前回導きました。
これをつかって5進数で 31 という数字を符号化してみましょう。

以前の記事によると、情報多項式I(x)に情報点数(ケタ数) k = 2 の次数をかけた多項式をG(x)で割った余りR(x)を求めることが、第一ステップです。
31 を符号化するので

I(x) = 3x + 1

であり、

I(x)x2 = 3x3 + x2

ですので、これをG(x)で割って余りを求めると

R(x) = 35x + 33

となります。
第二ステップで

W(x) = I(x)x2 - R(x) = 3x3 + x2 - 35x - 33

と符号多項式を算出できます。
ここで係数を5で割って余りを取って

W(x) = 3x3 + x2 + 0x + 2

となります。
(-33 を 5 で割った余りは 2 です。数直線で考えるとすぐにご理解いただけます。)
ちなみに、この余りを取るという操作は生成多項式を作るときにもやりましたが、途中計算は通常の整数の演算で行って、 W(x) を求めた後に一度行うだけで問題ありません。
四則演算の前後で余りは変わらないので。

というわけでめでたくW(x)が求まったので、その係数を並べて 3102 という5進4桁の数を送ります。
(言うまでもないですが、上位2桁の 31 が情報部分、下位2桁の 02 がパリティ部分となっています)

そしてこれに誤りが加わって受信者が 3402 という数を受信したとして、誤りを訂正してみましょう。
受信多項式 Y(x) は

Y(x) = 3x3 + 4x2 + 0x + 2

となるので、これに生成多項式 G(x) の根である 2 と 4 を代入してみます。

Y(2) = 3×23 + 4×22 + 0×2 + 2 = 42
Y(4) = 3×43 + 4×42 + 0×4 + 2 = 258

また、誤りの数が1つであるという仮定のもと、

Y(x) = W(x) + exi     ...(1)

と置くと、

Y(2) = e×2i = 42     ...(2)
Y(4) = e×4i = 258

であり(W(2) = 0, W(4) = 0であることを利用)、

Y(4)/Y(2) = 2i = 258/42 = 4 (*注)

なので i = 2 と分かり、式(2)にこれを代入して e = 42/4 = 3 (*注) と分かります。

これを式(1)に代入してW(x)について解くと

W(x) = Y(x) - 3x2
      = 3x3 + 4x2 - 3x2 + 0x +2
      = 3x3 + x2 + 0x + 2

となり、もとの符号多項式を得られました。

めでたし!めでたし!

(*注)258/42 = 4, 42/4 = 3 に "?" と思われた方へ。
素晴らしい洞察力です!よく読み飛ばしませんでしたね!
ここでは ”5 で割った余りを取る世界”を考えているため、ちょっと特殊な計算が必要になります。
258/42 というのは分子分母それぞれの数字を5で割った余りを取り、3/2を計算していることと同じです。
普通に考えれば3/2 = 1.5 ですが、小数が出てくると計算が破綻してしまいます。
これは困った。
ところで割り算とは掛け算の逆演算、すなわち 3/2 を求めるということは

2x = 3

という方程式で x を求めることと同じです。
x = 4 のとき、左辺は 8 になり、5 で割った余りを取ると 3 なので、x = 4 は ”5 で割った余りを取る世界において”上記方程式の解となります。
よって、3/2 = 4 です。
(3/2 = 8/2 = 4 と考えても良いでしょう)

どうですか。
いよいよ騙されてる気がしてきましたね。
でもこれで良いのです。
この裏には興味深い代数学の世界があります。
が、それは追々と…。


かぼちゃ素数進数のリードソロモン符号

さて、手筈はそろいました!
今回は「素数進数のリードソロモン符号」を紹介します。
*通常「素数進数の~」などと呼ばないのですが、ここではイメージしやすいように、あえてそう呼びました。

では、うだうだ言わずにその符号化法をさっさとお教えしましょう。

q を素数とします。
n 乗して q で割った余りを算出したとき、n = 1, 2, ..., q - 2では 1 以外で、n = q - 1 のとき 1 となる数を α とします。
誤り訂正可能数をt、符号長を q - 1 として、生成多項式 G(x) を以下のように構成したものをリードソロモン符号と呼びます。

G(x) = ( x - α ) ( x - α2 ) … ( x - α2t )

なお、符号化・復号で使用するすべての多項式の係数値は q で割った余りを取ることにします。

これだけだとなんのこっちゃ分からないと思うので、実例を示します。

ここでは q = 5 とします。
このとき、 22 mod 5 = 4,  23 mod 5 = 3,  24 mod 5 = 1であるので、 α = 2 です。
誤り訂正数 t = 1 とすると、結局生成多項式 G(x) は

G(x) = ( x - 2 )( x - 4 )

となります。
これを展開すると

G(x) = x2 - 6x + 8

で、各係数を5で割って余りを取ると

G(x) = x2 + 4x + 3

を使うことになります。
符号化・復号の計算方法は係数値を5で割った余りを取ること以外、前回までに述べた多項式の符号化・復号方法とまったく同じです。

多項式の係数はすべて5で割って余りを取ることになるので、結局多項式の係数を並べたものは5進数となり、それを送受信することになるわけですね。

【追記】
より一般的にはリードソロモン符号の生成多項式は任意の整数 r を用いて

G(x) = ( x - αr ) ( x - αr + 1 ) … ( x - α2t + r - 1 )

と書くことができます。
上で述べたのは r = 1 としたものです。
なお世間一般では、計算の簡単さから r = 0 とすることが多いようです。


かぼちゃリードソロモン符号への道

前回まで紹介した多項式の符号化/復号法を実装しようとしたとき、

「さて、多項式の係数を何bitの変数にしようかな」

と考え始めると

「だまされた!送りたい情報に対して、符号多項式の係数の情報量が大きすぎて通信効率が悪すぎる!」

と思われるかもしれません。

いえいえ、だましたわけではありません!!

別途、符号多項式の係数をある特定区間の値にする方法があります。
とりあえずは多項式での誤り訂正の仕組みを説明するのに、整数係数の多項式を用いた方がわかりやすいのでそれを使っただけです。

それで、「符号多項式の係数をある特定区間の値にする」方法ですが、それを実現する符号の一つにリードソロモン符号があります。

リードソロモン符号では、q-2 次の符号多項式を用い、その係数を0からq-1の整数値にすることができます。
一つの係数の情報量は log2q なので、一つの符号多項式の情報量は (q-1)×log2q になります。
多項式の係数のうち、前回までと同じ議論で q-1-2t 個の係数を”送りたい情報”に割り当てることができ、受信多項式の t 個の係数の誤りを
訂正することができるのです。

この魅惑のリードソロモン符号の解説はまた次回!


かぼちゃ多項式の符号化/復号のまとめ

いろいろと出てきて混乱されているかもしれないので、多項式の符号化/復号に関してまとめます。

送りたい情報を I(x)、生成多項式をG(x)、生成多項式G(x)の次数を k とします。

【符号化】
E1   I(x)xk を G(x)で割った余りR(x)を求める。
E2   W(x) = I(x)xk - R(x)   とする。

【通信過程】
W(x)に誤りが加わりY(x)となって受信側に到達する。

【復号】
D1   G(x)の根をa1, a2, …, akとし、Y(a1), Y(a2), …, Y(ak)を求める。
D2   Y(x) = W(x) + e1xi1 + … + ehxih とY(a1), Y(a2), …, Y(ak)から k 個の連立方程式を作り、e1, …, eh, i1, …, ih を求める。ただし h = k/2 。
D3   求まった e1, …, eh, i1, …, ih を用いて W(x) = Y(x) - (e1xi1 + … + ehxih) を計算する。

どうですか?
まとめてみると、結構すっきりしてますでしょう!?
簡単に書きましたが、実はD2の部分で連立方程式を解くのに結構技巧を要するのですが、またそれは後で。


 | HOME |  »