JErasure庫簡單學習

Ranbo__發表於2020-11-13

JErasure庫提供一般的RS碼和CRS碼兩種編碼方式,是基於C的糾刪碼的類庫。

一、Galois Field

(一)基本概念

1. 域(field)
  域代表一組元素和元素間的四則運算的集合。其中,域內元素的四則運算必須滿足封閉性,也就是說域內元素進行四則運算後得到的結果仍為域內元素。

2. 有限域(finite field)
  有限域即為僅含有有限個元素的域。有限域又稱作伽羅華域(Galois Field)。記為GF。例如,GF(7)的元素為0~6.

  有限域中必須含有加法單位元和乘法單位元。加法單位元即域中的零元,即存在元素e,使得域中任一元素a,有e+a = a。乘法單位元即域中的么元,即存在元素e,使得域中任一元素a,有e*a = a。GF(p)的加法單位元和乘法單位元分別為0和1.

  此外,有限域中的每個元素還應有對應的逆元。乘法逆元與我們常見的倒數類似。即存在元素b,使得b*a = e,則b為a的乘法逆元。其中e為乘法單位元。加法逆元與我們常見的相反數類似。即存在元素b,使得b+a = e,則b為a的加法逆元。其中e為加法單位元。

  有限域中的減法和除法即為加法和乘法的逆過程。GF§的加法和乘法與實數域內的加法和乘法相似,只不過最後要模p。即GF(a+b) = (a+b) mod p, GF(a×b) = (a×b) mod p。

  一般而言,p應為質數,因為如果p非質數,則可能有一些元素找不到乘法逆元。例如GF(9)中,元素3找不到GF(9)中的一個元素a使(3*a mod p = 1),即3沒有乘法逆元。

(二)GF(2w)

1. GF(2w)
  GF(2w)上的加法運算和乘法運算不使用一般的加法和乘法,而是使用多項式的計算。

2. 多項式計算
  GF(2w)上的多項式計算中,多項式的係數為1或0,即只能取GF(2)上的元素;當進行加法運算時,合併同類項時,不是一般的係數相加,而是進行異或計算,且加法和減法的操作一致。例如:

(x 3 + x 2) + (x 4 + x 2) = x 4 + x 3
  GF(2 w)上的多項式的最高次不超過w。例如,在GF(2 3)中,f 1(x) = x 2 + 1為GF(2 3)的多項式,f 2(x) = x 3 + x 2則不是GF(2 3)的多項式。

  但是,多項式的加法計算後的結果一定仍為域中多項式,而對於多項式乘法,若直接按一般的多項式乘法計算的計算結果則可能不再是域中的多項式。與GF(p)類似,需要找到一個多項式對其取模,使之仍然為域中多項式。因此,提出本原多項式的概念。

3. 本原多項式/質多項式(primitive polynomial)
  質多項式與質數的概念類似,質多項式即為不能表示成除么元對應的多項式與該多項式以外的其他多項式的乘積,即不能再進行因式分解的多項式。例如,在GF(24)中,f(x) = x4 + 1不是GF(24)上的質多項式,因為f(x) = (x2 + 1) × (x2 + 1)。g(x) = x4 + x + 1是GF(24)上的質多項式,因為它不可再分解。
  以GF(23)為例,指數小於3的多項式一共有8個,分別是0,1,x,x+1,x2,x2+1,x2+x,x2+x+1,一共有8個多項式。其對應的係數分別可以表示為000001010011100101110111,若用十進位制表示,則正好為01234567。這說明0~7與8個多項式之間有著必然的對映關係,每個多項式會對應一個值。對於GF(23),取素多項式f(x) = x3+x+1,則x+1的乘法逆元為x2+x,因為((x+1) × (x2+x) mod (x3+x+1) = 1),也就是說即使mod 8不能構成一個有限域,但是由質多項式仍然可以為域中每個元素找到一個乘法逆元。
  此時,多項式的乘法即可得到解決。例如,在GF(23)內:

x × (x 2+1) = x × (x 2+1) mod (x 3+x+1) = (x 3 + x) mod (x 3+x+1) = 1

   對於多項式除法,根據r(x) = q(x)t(x) + s(x),其中r(x),q(x),t(x),s(x)均為GF(2w)上的多項式,q(x)表示GF(2w)上的質多項式。易知r(x) mod q(x) = s(x),且顯然有dim s(x) < dim q(x)。(dim f(x)表示的是f(x)的最高次的次數)。

  根據上述理論,即可根據質多項式來得到GF(2w)的所有元素。GF(2w)中元素的生成過程如下:

1. 給定一個初始集合{0, 1, x};
2. 將這個集合的最後一個元素乘以x。如果得到的結果的度(dim) ≥ w,則將結果 mod q(x),將結果加入集合中;
3. 重複2,直到集合中有2^w個元素。此時最後的一個元素乘以x再 mod q(x)的值必定為1.

  舉個例子:
  w = 2時,q(x) = x2 + x + 1,初始集合為{0, 1, x}
  最後一個元素為x,乘以x後為x2,dim (x2) = 2,因此要對q(x)取模,得(x2) mod (x2 + x + 1) = x + 1;此時集合更新為{0, 1, x, x+1}
  再將最後一個元素乘以x,為x2 + x,仍需要對q(x)取模,得(x2 + x) mod (x2 + x + 1) = 1,結束上述過程。即GF(22) = {0, 1, x, x+1}

  也就是說,只需要找到對應GF(2w)上的本原多項式q(x)即可通過x代換得到GF(22),即:

GF(2 w) = GF(2)[x]/q(x)

常用的本原多項式有:

w = 4:   x^4 + x + 1
w = 8:   x^8 + x^4 + x^3 + x^2 + 1
w = 16:  x^16 + x^12 + x^3 + x + 1
w = 32:  x^32 + x^22 + x^2 + x + 1
w = 64:  x^64 + x^4 + x^3 + x + 1

例如,GF(24)的元素生成:(P(x) = x4 + x + 1)
GF(2^4)的元素生成過程
  由上述計算結果,可以構建以下兩個表(正表和反表):

i0123456789101112131415
gflog[i]-01428510314976131112
gfilog[i]124836121151071415139-

  其中,gflog[i]表(反表)是將二進位制對映成多項式,例如將5對映成多項式,即gflog[5] = 8,即x8 = 5;gfilog[i]表(正表)是將多項式對映成二進位制(值),例如將5(即x5)對映成值,即gfilog[5] = 6,即x5 = 6.

  對於乘法和除法,可以由如下方式進行:

x a × x b = x a + b
x a / x b = x a - b

  因此,我們在計算可以a×b時,可以先得到a = xm, b = xn; 則a*b = xm + n, a/b = xm - n.

  即:先將a,b查詢反表(gflog[i])得到m,n;計算m + n或者m - n,然後基於結果查詢正表(gfilog[i])得到乘法和除法的結果。需要注意的是,在計算m + n和m - n時,若結果大於等於15或小於0,則需要對15(2w - 1)取模。因為0是單獨存在的,在GF(2w)中沒有哪個元素的任意次方等於0.

  再舉個例子:
  7 × 9 = gfilog[gflog[7] + gflog[9]] = gfilog[10 + 14] = gfilog[9] = 10
  (7 × 9 =(查反表) x10 × x14 = x10 + 14 = x24 mod 15 = x9 =(查正表) 10)
  13 / 11 = gfilog[gflog[13] - gflog[11]] = gfilog[13 - 7] = gfilog[6] = 12
  (13 / 11 =(查反表) x13 / x7 = x13 - 7 = x6 =(查正表) 12)

  因此,構造正反表之後,可以大大簡化乘法和除法的計算,可以直接通過加法和查表得到結果,而不需要再進行繁瑣的取模等運算。

二、CRS碼

(一)、CRS碼簡介

(碼字太累了,因為最近有GCRS的專案,裡面有用到JErasure庫的介面,因為之前對糾刪碼完全沒有接觸過,在學習的時候查了不少資料,所以整理記錄一下,明後天有考試,考試完了之後繼續寫。。。)

相關文章