【Reed-Solomon 擦除码 Python 实现 一 (上):多项式编码的原理】 https://www.bilibili.com/video/BV1CC4y1S7CL/?share_source=copy_web&vd_source=04259c9260832797bf08914e26e438d5
想象一下这样的场景:你在网上输入银行卡号“6225 8866 1234 5678”,但网络传输过程中,其中一个数字被干扰成了“6225 8766 1234 5678”。接收方如何发现并纠正这个错误?
最简单的纠错方法是重复传输。例如:
重复两次:发送方发送两次卡号。若两次结果不一致(如“6225 8866”与“6225 8766”),接收方知道存在错误,但无法确定哪次正确。
重复三次:发送方发送三次卡号。接收方采用“少数服从多数”原则,例如若两次为“8866”、一次为“8766”,则判定正确值为“8866”。
但这种方法效率极低。假设卡号有16位,重复三次需要传输48位数据,冗余量高达200%。在传输高清视频时(约1.5Gbps),这意味着每天额外浪费16TB带宽,这种冗余将成为不可承受之重。我们需要更高效的纠错方法。
在寻找高效纠错方法前,先解决一个数学问题:如何用一条曲线连接一组随机分布的点?
两点成线:给定两个点(x1,y1)和(x2,y2),存在唯一一条直线y=ax+b穿过它们。
三点成圆:给定三个点(不在同一直线上),存在唯一一个圆(x−h)2+(y−k)2=r2穿过它们。
n点成多项式曲线:推广到n个点,存在唯一一个次数不超过n−1的多项式曲线穿过所有点。例如,四个点可用三次多项式f(x)=ax3+bx2+cx+d连接。
这一结论被称为拉格朗日插值定理(Lagrange Interpolation Theorem)。它告诉我们:任意n个横坐标不同的点,可由唯一一个次数小于n的多项式精确穿过。这一数学工具,正是高效纠错的核心。
1960年,欧文·里德(Irving Reed)和古斯塔夫·所罗门(Gustave Solomon)提出了一种革命性思路:将数据编码为多项式系数,通过冗余点实现纠错。
假设需传输16个数字a1,a2,...,a16,构造一个15次多项式:
为添加冗余,额外计算该多项式在更多点x17,x18,...处的值f(x17),f(x18),...,并将这些值一同传输。例如:
添加2个冗余点:可纠正1个错误。
添加4个冗余点:可纠正2个错误。
接收方收到数据后,尝试用拉格朗日插值法重建多项式。若传输无误,所有点应落在同一15次多项式曲线上。若存在错误(如某个点被篡改),则会出现“偏离曲线”的数据点。
例如,若原始数据对应16个点,添加4个冗余点后,即使传输过程中有2个点出错,仍可通过剩余18个正确点重建原多项式。这种方法的冗余率仅为25%(4/16),远低于三次重复法的200%。