一、参数简要介绍
当我们要传输 k k k比特数据的时候,我们编码后的码字长为 n = k + 2 s n=k+2s n=k+2s,该码可纠 s s s位错。最常用的参数设置为: k = 223 , s = 16 , n = k + 2 s = 255 k=223,s=16,n=k+2s=255 k=223,s=16,n=k+2s=255。
二、思路
对于
k
k
k位数据
m
0
,
.
.
.
,
m
k
−
1
m_0,...,m_{k-1}
m0,...,mk−1,我们可以将其表示为多项式的形式
m
(
x
)
=
m
0
+
m
1
x
+
.
.
.
+
m
k
−
1
x
k
−
1
m(x)=m_0+m_1x+...+m_{k-1}x^{k-1}
m(x)=m0+m1x+...+mk−1xk−1。然后我们可以找
n
n
n个不同的
x
i
x_i
xi,分别带入
m
(
x
)
m(x)
m(x)中,计算得到
(
x
0
,
y
0
)
,
.
.
.
(
x
n
−
1
,
y
n
−
1
)
(x_0,y_0),...(x_{n-1},y_{n-1})
(x0,y0),...(xn−1,yn−1)。
在所有
(
y
0
,
.
.
.
y
n
−
1
)
(y_0,...y_{n-1})
(y0,...yn−1)中最多有
s
s
s个错误。因此我们找一个
k
+
s
k+s
k+s多的子集。这个子集能够包含
k
k
k个正确的点。然后求出一条符合这些点的多项式。后面我们将考虑如何求这个子集的问题。
假设我们拿到了
k
k
k个正确的值,我们怎么回复这个多项式呢?拉格朗日插值或者解方程组!下图给出了解方程组的方法:
三、具体算法
在具体实现中,取
G
F
(
2
r
)
GF(2^r)
GF(2r)的本原元
α
\alpha
α,然后定义一个生成多项式:
g
(
x
)
=
(
x
−
α
)
(
x
−
α
2
)
.
.
.
(
x
−
α
2
s
−
1
)
g(x)=(x-\alpha)(x-\alpha^2)...(x-\alpha^{2s-1})
g(x)=(x−α)(x−α2)...(x−α2s−1)
然后我们将我们的消息
m
(
x
)
=
m
0
+
m
1
x
+
.
.
.
+
m
k
−
1
x
k
−
1
m(x)=m_0+m_1x+...+m_{k-1}x^{k-1}
m(x)=m0+m1x+...+mk−1xk−1做下面的运算:
b
(
x
)
=
x
2
s
m
(
x
)
(
m
o
d
g
(
x
)
)
(
式
1
)
b(x)=x^{2s}m(x)~(modg(x))~(式1)
b(x)=x2sm(x) (modg(x)) (式1)
(式1)就表示了
x
2
s
m
(
x
)
=
q
(
x
)
g
(
x
)
+
b
(
x
)
x^{2s}m(x)=q(x)g(x)+b(x)
x2sm(x)=q(x)g(x)+b(x)的关系。我们最后的码字就是:
c
(
x
)
=
x
2
s
m
(
x
)
−
b
(
x
)
c(x)=x^{2s}m(x)-b(x)
c(x)=x2sm(x)−b(x)
c
(
x
)
=
x
2
s
m
(
x
)
−
b
(
x
)
c(x)=x^{2s}m(x)-b(x)
c(x)=x2sm(x)−b(x)
=
q
(
x
)
g
(
x
)
+
b
(
x
)
−
b
(
x
)
=q(x)g(x)+b(x)-b(x)
=q(x)g(x)+b(x)−b(x)
=
q
(
x
)
g
(
x
)
=q(x)g(x)
=q(x)g(x)
下面我们来具体看一下上面的变化是如何形成码字:
首先消息为
(
m
k
−
1
,
.
.
.
.
,
m
0
)
(m_{k-1},....,m_{0})
(mk−1,....,m0)
x
2
s
m
(
x
)
x^{2s}m(x)
x2sm(x)就是将嘻嘻移位
2
s
2s
2s位:
(
m
k
−
1
,
.
.
.
.
,
m
0
,
0
,
.
.
.
,
0
)
(m_{k-1},....,m_{0},0,...,0)
(mk−1,....,m0,0,...,0)(2s个0)
c
(
x
)
=
x
2
s
m
(
x
)
−
b
(
x
)
c(x)=x^{2s}m(x)-b(x)
c(x)=x2sm(x)−b(x)的操作就得到了码字
c
(
x
)
c(x)
c(x):
(
m
k
−
1
,
.
.
.
.
,
m
0
,
−
b
2
s
−
1
,
.
.
.
,
−
b
0
)
(m_{k-1},....,m_{0},-b_{2s-1},...,-b_0)
(mk−1,....,m0,−b2s−1,...,−b0)
当我们想检查码字是不是正确的,就将他 m o d ( g ( x ) ) mod(g(x)) mod(g(x))。如果正确,我们取码字前 k k k位即可。
四、引理证明
1.对任意 g ( x ) g(x) g(x)的根 β \beta β, β 2 s m ( β ) = b ( β ) \beta^{2s}m(\beta)=b(\beta) β2sm(β)=b(β)。
因为
x
2
s
m
(
x
)
=
q
(
x
)
g
(
x
)
+
b
(
x
)
x^{2s}m(x)=q(x)g(x)+b(x)
x2sm(x)=q(x)g(x)+b(x),所以
β
2
s
m
(
β
)
=
q
(
β
)
g
(
β
)
+
b
(
β
)
=
b
(
β
)
\beta^{2s}m(\beta)=q(\beta)g(\beta)+b(\beta)=b(\beta)
β2sm(β)=q(β)g(β)+b(β)=b(β)。
因为
g
(
x
)
=
(
x
−
α
)
(
x
−
α
2
)
.
.
.
(
x
−
α
2
s
−
1
)
g(x)=(x-\alpha)(x-\alpha^2)...(x-\alpha^{2s-1})
g(x)=(x−α)(x−α2)...(x−α2s−1),所以有
α
j
⋅
2
s
m
(
α
j
)
=
b
(
α
j
)
,
1
≤
j
≤
2
s
\alpha^{j\cdot 2s}m(\alpha^j)=b(\alpha^j),1\le j\le 2s
αj⋅2sm(αj)=b(αj),1≤j≤2s。
2.任意给定总共
k
k
k位
m
(
x
)
m(x)
m(x)和
b
(
x
)
b(x)
b(x)的系数。我们可以正确恢复
m
(
x
)
m(x)
m(x)和
b
(
x
)
b(x)
b(x)所有系数。
g
(
x
)
g(x)
g(x)度数为
2
s
2s
2s,所以
b
(
x
)
b(x)
b(x)有
2
s
=
n
−
k
2s=n-k
2s=n−k个系数。
m
(
x
)
m(x)
m(x)有k个系数,所以
c
(
x
)
c(x)
c(x)有
n
n
n个系数。给定其中k个后,还剩
n
−
k
=
2
s
n-k=2s
n−k=2s个位置参数,利用引理1构建以下方程组:
2
s
2s
2s个方程组解
2
s
2s
2s个未知数,成功恢复所有参数。
3.假设 m ( x ) , b ( x ) m(x),b(x) m(x),b(x)存在 s s s位错误系数,那么我们可以正确恢复 m ( x ) m(x) m(x)所有系数。
正如前面我们讲的,最多 s s s为错误,那么至少有 k + s k+s k+s正确。假设我们找到包含 k + s k+s k+s个点的子集,那么至少有 k k k个点正确,就可以利用前面的引理正确恢复所有参数。
五、译码
假设收到了 r ( x ) = c ( x ) + e ( x ) r(x)=c(x)+e(x) r(x)=c(x)+e(x):
- 计算 s i = r ( α i ) , 1 ≤ i ≤ 2 s s_i=r(\alpha^i),1\le i\le 2s si=r(αi),1≤i≤2s。
- 利用Berlekamp算法定位错误。
- 然后就可以利用前面的算法恢复出消息。