1 有限域基礎知識
1.1 有限域(Galois域)的構造
令
注:任意一個有限域,其元素的個數一定爲
例1(有限域
GF(p) ) 令p 爲一個素數,集合
GF(p)=Zp={0,1,2,…,p−1}.
在GF(p) 上定義加法⊕ 和乘法⊙ 分別爲模p 加法和模p 乘法,即任意的a,b∈GF(p) ,
a⊕b=(a+b)modp, a⊙b=(a⋅b)modp
則<GF(p),⊕,⊙> 爲一個有p 個元素的有限域,其中零元素爲0 ,單位元爲1 .令
a 爲GF(p) 中的一個非零元素. 由於gcd(a,p)=1 ,因此,存在整數b,c ,使得ab+pc=1 . 由此得到a 的逆元爲a−1=bmodp .域
GF(p) 稱爲一個素域(prime field).
例注1: 給定
例2(有限域
GF(pn) ) 從GF(p) 出發,對任意正整數n ,n≥2 ,我們可以構造元素元素個數爲pn 的有限域GF(pn) 如下:
令g(x) 爲一個GF(p) 上次數爲n 的不可約多項式,集合
GF(pn)=GF(p)[x]/⟨g(x)⟩={a0+a1x+a2x2+⋯+an−1xn−1 | ai∈GF(p),0≤i≤n−1}
在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) 的逆元爲a−1(x)=b(x)modg(x) .域
GF(pn) 稱爲GF(p) 的(n 次)擴域(extension field),而GF(p) 稱爲GF(pn) 的子域(subfield).
例注2.1: 給定
例注2.2:設
其中
1.2 有限域的性質
令
若
並且
定義:設
GF(q) 是一個含有q 個元素的有限域,GF(p) 是GF(q) 的一個含有p 個元素的子域(p 不一定爲素數),α∈GF(q) . 則GF(p) 上以α 爲根,首項係數爲1 ,並且次數最低的多項式稱爲α 在GF(p) 上的極小多項式(minimal polynomial ofα overGF(p) ).特別地,若
α∈GF(q) 爲GF(q) 的一個本原元,則α 在GF(p) 上的極小多項式稱爲GF(p) 上的一個本原多項式(primitive polynomial forGF(q) overGF(p) ).
定義注1:對任意的
定義注2:設
中的元素具有相同的極小多項式. 設
定理:設
GF(q) 是一個含有q 個元素的有限域,GF(p) 是GF(q) 的一個含有p 個元素的子域. 設α∈GF(q) ,r 爲滿足αpr=α 的最小正整數. 則α 在GF(p) 上的極小多項式g(x) 是一個r 次不可約多項式,並且
B(α)={α,αp,αp2,…,αpr−1}
中的元素爲g(x) 在GF(q) 上的所有不同的根,即
g(x)=(x−α)(x−αp)(x−αp2)⋯(x−αpr−1).
注:
在模
推論:設
更進一步,
注:設
例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) 上的首項係數爲1 的3 次本原多項式有兩個,分別爲
(i)α,α2,α4 在GF(2) 上的極小多項式
g(x)=(x+α)(x+α2)(x+α4)=x3+x+1
(ii)α3,α5,α6 在GF(2) 上的極小多項式
g(x)=x3+x2+1
有限域
定理:設
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,d∈GF(2)}.
顯然,x∈GF(24) . 由於x5=1 ,即x 的階爲5 ,因此,x 不是GF(24) 的本原元. 於是,p(x) 不是GF(2) 上的本原多項式. 另外,可以驗證x+1 是GF(24) 的本原元.
2 Matlab 中的有限域計算函數
Matlab 中自帶的有限域的計算是在
由 “1.1 有限域的構造” 的 “例2” 可知,我們只需先找到一個
然而,這樣得到的有限域
Matlab 中
GF(2m) 的元素: 在 Matlab 中GF(2m):=GF(2)[D]/⟨p(D)⟩ ,其中p(D) 爲一個GF(2) 上的m 次本原多項式.
GF(2m)={am−1Dm−1+am−2Dm−2+⋯+a1D+a0, | ai∈GF(2),0≤i≤m−1}
因此,每個GF(2m) 中的元素本質上是一個次數小於m 的多項式,每個元素和多項式之間有“1-1”對應關係. 例如,取m=3 和本原多項式p(D)=D3+D+1 ,則我們得到有限域GF(23) ,其中的元素和多項式之間的對應關係如下:
二進制 | ||
---|---|---|
0 | 000 | |
1 | 001 | |
2 | 010 | |
3 | 011 | |
4 | 100 | |
5 | 101 | |
6 | 110 | |
7 | 111 |
GF(2) 上的多項式由係數組成的二進制所對應的(十進制)數字來表示. 例如,多項式p(D)=D3+D+1 的係數組成的二進制爲1011 ,因此,多項式p(D) 表示爲數字11 .
2.1 定義有限域數組
在 Matlab 中,函數 gf 用來定義一個有限域數組,函數申明如下:
X_GF = GF(X,M,PRIM_POLY)
函數創建有限域
例如,生成有限域
>> 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 使用了
如果不指定次數 M 和本原多項式 PRIM_POLY,則生成二元域
>> 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
在這裏我們用兩個不同的本原多項式構造有限域
注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+1 和D3+D2+1 生成兩個不同的元素個數爲8 的有限域,然而這兩個有限域是同構的. 一般地,我們有如下有限域同構定理:定理: 任意兩個元素個數相同的有限域一定同構.
與本原元多項式相關的函數
primpoly
函數 primpoly 用於計算
PR = PRIMPOLY(M, OPT, 'nodisplay')
其中 M 爲本原多項式的次數,其取值爲
OPT = 'min' 給出一個權值最小的本原多項式
OPT = 'max' 給出一個權值最大的本原多項式
OPT = 'all' 給出所有的本原多項式
OPT = L 給出所有權值爲L的本原多項式
字符串 ‘nodisplay’ 用於關閉默認的本原多項式顯示方式.
例如,輸出
>> 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 用來檢查
CK = ISPRIMITIVE(A)
其中 A 爲一個表示多項式的數字,並且表示的多項式的次數不能超過
例如,檢查多項式
>> isprimitive(13)
ans =
1
>> isprimitive(15)
ans =
0
其它函數
見 Matlab 幫助.