Reed-Solomon-RS码详解

一、参数简要介绍

当我们要传输 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,...,mk1,我们可以将其表示为多项式的形式 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+...+mk1xk1。然后我们可以找 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),...(xn1,yn1)
在所有 ( y 0 , . . . y n − 1 ) (y_0,...y_{n-1}) (y0,...yn1)中最多有 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α2s1)
然后我们将我们的消息 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+...+mk1xk1做下面的运算:
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}) (mk1,....,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) (mk1,....,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) (mk1,....,m0,b2s1,...,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α2s1),所以有 α 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 αj2sm(αj)=b(αj),1j2s

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=nk个系数。 m ( x ) m(x) m(x)有k个系数,所以 c ( x ) c(x) c(x) n n n个系数。给定其中k个后,还剩 n − k = 2 s n-k=2s nk=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):

  1. 计算 s i = r ( α i ) , 1 ≤ i ≤ 2 s s_i=r(\alpha^i),1\le i\le 2s si=r(αi),1i2s
  2. 利用Berlekamp算法定位错误。
  3. 然后就可以利用前面的算法恢复出消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

密码猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值