Matlab中的有限域計算

1 有限域基礎知識

1.1 有限域(Galois域)的構造

p 爲一個素數. 則對任意的一個正整數 n ,存在一個特徵爲 p ,元素個數爲 pn 的有限域 GF(pn) .

注:任意一個有限域,其元素的個數一定爲 pn ,其中 p 爲一個素數(有限域的特徵),n 爲一個正整數.

例1(有限域 GF(p)p 爲一個素數,集合

GF(p)=Zp={0,1,2,,p1}.

GF(p) 上定義加法 和乘法 分別爲模 p 加法和模 p 乘法,即任意的 a,bGF(p)
ab=(a+b)modp, ab=(ab)modp

<GF(p),,> 爲一個有 p 個元素的有限域,其中零元素爲 0 ,單位元爲 1 .

aGF(p) 中的一個非零元素. 由於 gcd(a,p)=1 ,因此,存在整數 b,c ,使得 ab+pc=1 . 由此得到 a 的逆元爲 a1=bmodp .

GF(p) 稱爲一個素域(prime field).

例注1: 給定 ap ,例1中的等式 ab+pc=1 可以通過擴展的歐幾里得除法得到,從而求得 GF(p) 中任意非零元素的逆元.

例2(有限域 GF(pn)GF(p) 出發,對任意正整數 nn2 ,我們可以構造元素元素個數爲 pn 的有限域 GF(pn) 如下:
g(x) 爲一個 GF(p) 上次數爲 n不可約多項式,集合

GF(pn)=GF(p)[x]/g(x)={a0+a1x+a2x2++an1xn1 | aiGF(p),0in1}

GF(pn) 上定義加法 和乘法 分別爲模 g(x) 加法和模 g(x) 乘法,即任意的 a(x),b(x)GF(pn)
a(x)b(x)=a(x)+b(x), a(x)b(x)=(a(x)b(x))modg(x)

<GF(pn),,> 爲一個有 pn 個元素,特徵爲 p 的有限域,其中零元素爲 GF(p) 中的 0 ,單位元爲 GF(p) 中的 1 .

a(x)GF(pn) 中的一個非零元素. 由於 gcd(a(x),g(x))=1 ,因此,存在 GF(p) 上的多項式 b(x),c(x) ,使得 a(x)b(x)+g(x)c(x)=1 . 由此得到 a(x) 的逆元爲 a1(x)=b(x)modg(x) .

GF(pn) 稱爲 GF(p) 的(n 次)擴域(extension field),而 GF(p) 稱爲 GF(pn)子域(subfield).

例注2.1: 給定 GF(p) 上的多項式 a(x)g(x) ,例2中的等式 a(x)b(x)+g(x)c(x)=1 可以通過擴展的歐幾里得除法得到,從而求得 GF(pn) 中任意非零元素的逆元.

例注2.2:GF(q) 是一個含有 q 個元素的有限域. 對任意正整數 n , GF(q) 上的 n 次不可約多項式一定存在. 更進一步,GF(q) 上首項係數爲 1n 次不可約多項式的個數爲

Nq(n)=1nd|nμ(nd)qd=1nd|nμ(d)qn/d

其中 μ 爲Moebius函數,定義爲
μ(m)=1(1)k0m=1m=p1p2pk,p1,p2,,pk

1.2 有限域的性質

GF(q) 是一個含有 q 個元素的有限域,Fq=GF(q){0} 爲有限域 GF(q) 中所有非零元素構成的集合. 則在乘法之下 Fq 是一個有限循環羣. 循環羣 Fq 的一個生成元稱爲有限域 GF(q) 的一個本原元.

αGF(q) 爲一個本原元,則

GF(q)={0,1,α,α2,,αq2}

並且 αq1=1 ,即 αq=α .

定義:GF(q) 是一個含有 q 個元素的有限域,GF(p)GF(q) 的一個含有 p 個元素的子域(p 不一定爲素數),αGF(q) . 則 GF(p) 上以 α 爲根,首項係數爲 1 ,並且次數最低的多項式稱爲 αGF(p) 上的極小多項式(minimal polynomial of α over GF(p) ).

特別地,若 αGF(q)GF(q) 的一個本原元,則 αGF(p) 上的極小多項式稱爲 GF(p) 上的一個本原多項式(primitive polynomial for GF(q) over GF(p) ).

定義注1:對任意的 αGF(q)αGF(p) 上的極小多項式存在並且唯一,並且 αGF(p) 上的極小多項式爲 GF(p) 上的一個不可約多項式.

定義注2:αGF(q) , 則 ααpGF(p) 上具有相同的極小多項式. 更進一步,集合

B(α)={α,αp,αp2,αp3,,αpi,}

中的元素具有相同的極小多項式. 設 q=pn ,則 αpn=α . 因此,集合 B(α) 中互不相同的元素的個數(記爲 r )不超過 n . 可以證明,αGF(q) 的一個本原元當且僅當 r=n .

定理:GF(q) 是一個含有 q 個元素的有限域,GF(p)GF(q) 的一個含有 p 個元素的子域. 設 αGF(q)r 爲滿足 αpr=α 的最小正整數. 則 αGF(p) 上的極小多項式 g(x) 是一個 r 次不可約多項式,並且

B(α)={α,αp,αp2,,αpr1}

中的元素爲 g(x)GF(q) 上的所有不同的根,即
g(x)=(xα)(xαp)(xαp2)(xαpr1).

注:r 的計算方法如下:設 αFq 中的階爲 k . 集合

Zk={m | 0mk1,gcd(m,k)=1}

在模 k 乘法運算下是一個含有 φ(k) 個元素的有限羣(其中 φ 爲歐拉(Euler)函數). 則 r 等於 pmodkZk 中的階.

推論:GF(q) 是一個含有 q 個元素的有限域,GF(p)GF(q) 的一個含有 p 個元素的子域. 設 |GF(q)|=pn ,即 q=pn . 設 αGF(q)GF(q) 的一個本原元,則 αGF(p) 上的極小多項式 g(x) 的次數爲 n ,並且

g(x)=(xα)(xαp)(xαp2)(xαpn1).

更進一步,α,αp,αp2,,αpn1 均爲 GF(q) 的本原元.

注:GF(p) 是一個含有 p 個元素的有限域,n 是任意一個正整數,則 GF(p) 上的 n 次本原多項式一定存在. 更進一步,GF(p) 上的首項係數爲 1n 次本原多項式的個數爲 φ(pn1)n ,其中 φ 爲歐拉函數.

例3 考慮二元域 GF(2) 上的不可約多項式 p(α)=α3+α+1 ,構造有限域

GF(23)=GF(2)[α]/p(α)={0,1,α,α+1,α2,α2+1,α2+α,α2+α+1}.

容易驗證,α,α2,α3,α4,α5,α6 都是 GF(23) 的本原元. GF(2) 上的首項係數爲 13 次本原多項式有兩個,分別爲
(i) α,α2,α4GF(2) 上的極小多項式
g(x)=(x+α)(x+α2)(x+α4)=x3+x+1

(ii) α3,α5,α6GF(2) 上的極小多項式
g(x)=x3+x2+1

有限域 GF(p) 上的本原多項式一定是 GF(p) 上的不可約多項式;但是,GF(p) 上的不可約多項式不一定是 GF(p) 上的本原多項式.

定理:GF(q) 是一個含有 q 個元素的有限域,GF(p)GF(q) 的一個含有 p 個元素的子域, g(x)GF(p) 上的一個不可約多項式. 則 g(x)GF(p) 上的本原多項式當且僅當 g(x)GF(q) 上的根都是 GF(q) 的本原元.

下面例子說明不可約多項式不一定是本原多項式.

例4 考慮二元域 GF(2) 上的不可約多項式 p(x)=x4+x3+x2+x+1 ,構造有限域

GF(24)=GF(2)[x]/p(x)={a+bx+cx2+dx3 | a,b,c,dGF(2)}.

顯然,xGF(24) . 由於 x5=1 ,即 x 的階爲 5 ,因此,x 不是 GF(24) 的本原元. 於是, p(x) 不是 GF(2) 上的本原多項式. 另外,可以驗證 x+1GF(24) 的本原元.

2 Matlab 中的有限域計算函數

Matlab 中自帶的有限域的計算是在 GF(2m) 上進行的,即在二元域 GF(2) 的擴域中進行計算,其中 1m16.

由 “1.1 有限域的構造” 的 “例2” 可知,我們只需先找到一個 GF(2) 上的 m 次不可約多項式 g(x) ,得到集合 GF(2)[x]/g(x) ,然後定義其上的加法和乘法分別爲模 g(x) 加法和模 g(x) 乘法,即得到有限域 GF(2m) .

然而,這樣得到的有限域 GF(2m) 中,元素 x 未必是本原元,這將給後面的(乘法)運算帶來很多麻煩. 因此,在不可約多項式 g(x) 的挑選上,我們最好選擇一個本原多項式. 這其實就是 Matlab 中的做法.

Matlab 中 GF(2m) 的元素: 在 Matlab 中 GF(2m):=GF(2)[D]/p(D) ,其中 p(D) 爲一個 GF(2) 上的 m 次本原多項式.

GF(2m)={am1Dm1+am2Dm2++a1D+a0, | aiGF(2),0im1}

因此,每個 GF(2m) 中的元素本質上是一個次數小於 m 的多項式,每個元素和多項式之間有“1-1”對應關係. 例如,取 m=3 和本原多項式 p(D)=D3+D+1 ,則我們得到有限域 GF(23) ,其中的元素和多項式之間的對應關係如下:
GF(23) GF(2)[D]/p(D) 二進制
0 0 000
1 1 001
2 D 010
3 D+1 011
4 D2 100
5 D2+1 101
6 D2+D 110
7 D2+D+1 111

GF(2) 上的多項式由係數組成的二進制所對應的(十進制)數字來表示. 例如,多項式 p(D)=D3+D+1 的係數組成的二進制爲 1011 ,因此,多項式 p(D) 表示爲數字 11 .

2.1 定義有限域數組

在 Matlab 中,函數 gf 用來定義一個有限域數組,函數申明如下:

X_GF = GF(X,M,PRIM_POLY)

函數創建有限域 GF(2M) 上的一個數組,使用的 GF(2) 上的 M 次本原多項式爲 PRIM_POLYM 是一個 116 之間的整數;數組 X 中的元素爲 02M1 之間的數.

例如,生成有限域 GF(23) 中的所有元素,並令本原多項式爲 p(D)=D3+D2+1 .

>> GF8 = gf(0:7,3,13)

GF8 = GF(2^3) array. Primitive polynomial = D^3+D^2+1 (13 decimal)

Array elements = 

   0   1   2   3   4   5   6   7

如果不指定本原多項式,則 Matlab 將使用默認本原多項式. 例如

>> gf(0:7,3)

ans = GF(2^3) array. Primitive polynomial = D^3+D+1 (11 decimal)

Array elements = 

   0   1   2   3   4   5   6   7

在這裏例子中,Matlab 使用了 3 次本原多項式 D3+D+1 .

如果不指定次數 M 和本原多項式 PRIM_POLY,則生成二元域 GF(2) 中的元素.

>> gf(0:1)

ans = GF(2) array. 

Array elements = 

   0   1

生成的有限域中的數組可以參與運算(+、、.、.^、\等). 注意:參與運算的操作數必須來自同一個有限域,用於生成有限域的本原多項式也必須相同!

一個典型的例子是計算有限域的乘法表如下:

>> GF8 = gf(0:7,3)

GF8 = GF(2^3) array. Primitive polynomial = D^3+D+1 (11 decimal)

Array elements = 

   0   1   2   3   4   5   6   7

>> GF8'*GF8

ans = GF(2^3) array. Primitive polynomial = D^3+D+1 (11 decimal)

Array elements = 

   0   0   0   0   0   0   0   0
   0   1   2   3   4   5   6   7
   0   2   4   6   3   1   7   5
   0   3   6   5   7   4   1   2
   0   4   3   7   6   2   5   1
   0   5   1   4   2   7   3   6
   0   6   7   1   5   3   2   4
   0   7   5   2   1   6   4   3

>> GF8 = gf(0:7,3,13)

GF8 = GF(2^3) array. Primitive polynomial = D^3+D^2+1 (13 decimal)

Array elements = 

   0   1   2   3   4   5   6   7

>> GF8'*GF8
Warning: Lookup tables not defined for this order 2^3 and
primitive polynomial 13.  Arithmetic still works
correctly but multiplication, exponentiation, and
inversion of elements is faster with lookup tables.
Use gftable to create and save the lookup tables. 
> In gf.gettables at 35
  In gf.mtimes at 20

ans = GF(2^3) array. Primitive polynomial = D^3+D^2+1 (13 decimal)

Array elements = 

   0   0   0   0   0   0   0   0
   0   1   2   3   4   5   6   7
   0   2   4   6   5   7   1   3
   0   3   6   5   1   2   7   4
   0   4   5   1   7   3   2   6
   0   5   7   2   3   6   4   1
   0   6   1   7   2   4   3   5
   0   7   3   4   6   1   5   2

在這裏我們用兩個不同的本原多項式構造有限域 GF(23) ,得到兩張不同的乘法表.

注1:當我們計算 GF(2)[D]/D3+D2+1 的乘法表時,Matlab 給產生一個警告 “Warning: Lookup tables not defined for this order 2^3 and primitive polynomial 13.” 從警告中我們可以看出,Matlab 中有限域的乘法是通過查表來完成的,這樣可以顯著地提高計算的速度. 我們可以通過命令 gftable 來創建並保存查找表格.
注2:用本原多項式 D3+D+1D3+D2+1 生成兩個不同的元素個數爲 8 的有限域,然而這兩個有限域是同構的. 一般地,我們有如下有限域同構定理:

定理: 任意兩個元素個數相同的有限域一定同構.

與本原元多項式相關的函數

primpoly

函數 primpoly 用於計算 GF(2) 上的本原多項式,函數申明如下:

PR = PRIMPOLY(M, OPT, 'nodisplay')

其中 M 爲本原多項式的次數,其取值爲 216 之間的整數;選項 OPT 的定義如下:

OPT = 'min'  給出一個權值最小的本原多項式
OPT = 'max'  給出一個權值最大的本原多項式
OPT = 'all'  給出所有的本原多項式
OPT = L      給出所有權值爲L的本原多項式

字符串 ‘nodisplay’ 用於關閉默認的本原多項式顯示方式.

例如,輸出 GF(2) 上所有次數爲 3 的本原多項式.

>> primpoly(3,'all')

Primitive polynomial(s) = 

D^3+D^1+1
D^3+D^2+1

ans =

11
13

>> primpoly(3,'all','nodisplay')

ans =

11
13

isprimitive

函數 isprimitive 用來檢查 GF(2) 上的多項式是否爲本原多項式,函數申明如下:

CK = ISPRIMITIVE(A)

其中 A 爲一個表示多項式的數字,並且表示的多項式的次數不能超過 16 . 如果 A 爲本原多項式,則返回 1 ;否則返回 0 .

例如,檢查多項式 D3+D2+1D3+D2+D+1 是否爲本原多項式如下:

>> isprimitive(13)

ans =

 1

>> isprimitive(15)

ans =

 0

其它函數

見 Matlab 幫助.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章