在數據傳輸過程中難免會遇到部分數據丟失或者受到干擾而出錯,因此利用算法來恢復錯誤的數據,reed Solomon(簡稱RS)便是其中的一種常用的算法。
RS算法是以犧牲帶寬為代價的,編碼過程中會產生一定量的冗余數據。這種增加冗余數據來獲得有效數據的方法在我們日常生活中其實經常會使用。舉個很簡單的例子,比如我們把重要資料保存在電腦硬盤里,但是現在電腦病毒非常厲害,為了防止資料丟失,通常都會把重要數據刻錄成光盤,當硬盤數據丟失的時候我們可以用光盤里的來恢復。但是光盤有時候也不保險,容易損壞,於是我們就多備份幾張,刻錄同樣的數據,這樣我們就不會擔心數據丟失了。我們增加了數據的可靠性,但是另外一個方面來說,我們卻增加了存儲的容量,犧牲了很多光盤。從某種意義上來說,備份其實是一種增加數據可靠性的方法,但還不能算真正意義上的糾錯方法。
還有一種我們比較熟悉的用在數據傳輸上的方法——奇偶校驗。記錄一組數據的“1”(或“0”)的個數,如果有奇個“1”,則最后標記一個“1”,如果有偶數個“1”則標記“0”。這樣接收方根據最后一個bit就可以確定傳輸的數據是否出錯,如果有錯誤就可以要求重發。這是最簡單的校驗方法,但是還不足以糾錯。奇偶校驗,如果將一組數據進行行列多次分組編碼多次校驗就可以具有一定能力的糾錯功能,但是還是太弱,不適於現代通信的要求。數學理論不斷發展,於是RS之類的算法出現了。
一個簡單的整數數學算式:
Z=XY+A
這里我們進行移位得到:
Z-A=XY
可以知道 Z-A 一定可以被 Y 整除,其商是 X ,同樣 Z-A 也能被 X 整除,商為 Y 。 RS 算法也用到了這個簡單原理。對於給定的一個數 Y 和商 X ,只要我們求得其余數 A ,然后構造出 Z-A ,這就完成了編碼。將 Z-A 傳輸,接收方得到的數如果能被 X 整除,而且商也落在我們預期的范圍內,那么我們就可以說這次傳輸沒有錯誤。當然如果我們在整數范圍內來做這樣的算法也僅僅能偵察出錯誤來,還不能成為真正意義上的糾錯。 RS 算法不同,他將所有的運算歸結到有限域中,即通常說的珈羅華域。充分利用了有限域的封閉性。而且我們也不是直接求出商是多少,而是間接地解出錯誤發生的位置和值。有了這些信息,我們就可以實現糾錯了。