Welch-Berlekampアルゴリズムのエラー数をどのように決定しますか?


9

リードソロモンコードをデコードするウェルチベルレカンプアルゴリズムでは、不明な場所のb ieエラーがあるメッセージを表す点のリストが与えられます(eはアルゴリズムに与えられます)。出力は、エラーが発生した点を除く、指定されたすべての点を通過する多項式です。(ai,bi)ebie

この方法には、次の形式の線形方程式系を解くことが含まれます。

biE(ai)=Q(ai)

Eの次数がeQの次数が最大でe + kであるすべてのiについて。変数はEおよびQの係数です。EeQe+kEQ

E次数があることを確認するにeは、通常、の係数xeが1 であるという制約を上記の線形システムに追加します。ただし、実際にはは必ずしもわかりませんe。これに対処する1つの非効率的な(ただし多項式時間の)方法は、解が見つかるまでn + k 1 / 2 1で始まるすべての値に対してを試すことです。e(n+k1)/21

私の質問は:eを決定するより効率的な方法はありますか?eまたは、正確な値の代わりに上限を使用できるようにする線形システムに変更はありますか?e

特に、この特定のデコーダーをリードソロモンコードに使用したいのですが、他の手法に基づく完全に異なるアルゴリズムではありません。


DWの答えに応えて、これが私の実際の例です。すべてが7を法として行われます。

plain message is: [2, 3, 2]
polynomial is: 2 + 3 t^1 + 2 t^2
encoded message is: [[0, 2], [1, 0], [2, 2], [3, 1], [4, 4]]
corrupted message is: [[0, 2], [1, 0], [2, 3], [3, 1], [4, 4]]

したがって、エラーは3番目のポイントにあります。

とき問題の多項式でありますe=2

bi(e0+e1x+e2x2)q0q1xq2x2q3x3q4x4=0

とを接続マトリクス状にシステムを与えます。x=0,1,2,3,4

[2, 0, 0, 6, 0, 0, 0, 0, 0]
[0, 0, 0, 6, 6, 6, 6, 6, 0]
[3, 6, 5, 6, 5, 3, 6, 5, 0]
[1, 3, 2, 6, 4, 5, 1, 3, 0]
[4, 2, 1, 6, 3, 5, 6, 3, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 1]

最後の行は制約です。取得したガウス消去法を適用するe2=1

[1, 0, 0, 0, 0, 0, 1, 4, 0]
[0, 1, 0, 0, 0, 0, 3, 3, 1]
[0, 0, 1, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 1, 0, 0, 2, 1, 0]
[0, 0, 0, 0, 1, 0, 2, 2, 5]
[0, 0, 0, 0, 0, 1, 4, 5, 2]

そして、両方の自由変数に1を選ぶと、次の解ベクトルが得られます。

[2, 2, 1, 4, 1, 0, 1, 1]

に変換します

E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4

また、Qを除算しません。なお、Qは、のような要因T + 6 T 3 + 2 、T 2 + 2 、T + 3 EQQ(t+6)(t3+2t2+2t+3)mod7

場合、良い解決策が得られます。e=1

system is:    
[2, 0, 6, 0, 0, 0, 0]
[0, 0, 6, 6, 6, 6, 0]
[3, 6, 6, 5, 3, 6, 0]
[1, 3, 6, 4, 5, 1, 0]
[4, 2, 6, 3, 5, 6, 0] 
[0, 1, 0, 0, 0, 0, 1]

reduced system is:

[1, 0, 0, 0, 0, 0, 5]
[0, 1, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0, 3]
[0, 0, 0, 1, 0, 0, 3]
[0, 0, 0, 0, 1, 0, 6]
[0, 0, 0, 0, 0, 1, 2]

solution is [5, 1, 3, 3, 6, 2]
Q is 3 + 3 t^1 + 6 t^2 + 2 t^3
E is 5 + 1 t^1
P(x) = 2 + 3 t^1 + 2 t^2 # this is correct!
r(x) = 0

上記の反例は私が最初から書いたコードによって生成されたものですが(基本的に私が最初に試したものです)、ソリューションが手動で有効であることを確認できるため、私のコードにバグがある場合でも、クレームに対する有効な反例です。を使用すると機能します。e=2


@DW解ベクトルは有効です。これは実際には1 * 2 + 1 * 1 + 4 * 1です(解のベクトルの次元は、行列の最後の列が省略されているため、1オフです)。私がを除外することは、ここでの記述のタイプミスですが、私の実装では正しいです。たとえば、ポイント[1、0]を使用するシステムの2行目でその効果を確認できます。最初の3つの全体は0で乗算されているため、すべてゼロです。私の例が不明確な場合は、投稿できますgithub上の私のコード。私のコードはクリーンだと思いますが、その一般性のために面倒です。bi
JeremyKun

回答:


3

同じ手順で、までの任意の数のエラーを修正できます。e

要件は、エラーがあったすべての点a iでエラー多項式がゼロでなければならないことです。それらの点でのみゼロでなければならないということはありません。E x は他の点でもゼロにすることができますが、次数がeである限り問題ありません。E(x)aiE(x)e

したがって、がエラー数の上限である場合、多項式E x が存在し、必要なすべてのプロパティが存在します(つまり、次数が正確にeで、エラーがあるすべての点でゼロです)。たとえば、エラーがeより少ない場合、すべてのエラーでゼロであり、正確にeまでのゼロの数を取得するためにさらに数ポイントでゼロである多項式E x が存在します。eE(x)eeE(x)e

E(x)eE(x)E(x)ne


質問の「反例」についての会話の結果を文書化するには:

nk+1(nk)/2n=5k=3(nk)/2=1e=1e=2

したがって、反例は実際には反例ではなく、上記の私の答えと矛盾しません。


1
nk+1(nk)/2

E(x)E(x)

n=7e=2

さて、これは私が試している例で動作します。優秀な!
JeremyKun
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.