Matlab中的有限域计算
姓名:王瑞麟 学号:20011210581
转载自 https://blog.csdn.net/u010450214/article/details/50624059 作者:倾绝
有删改
【嵌牛导读】编码及密码函数设计等领域的工作,常常涉及有限域的构造和计算。用C或C++自行定义有限域元素和域上的运算是可行的,但很多时候没有必要。专用于代数系统处理的软件Magma可有效支持各类有限域上的运算,matlab也自带在 GF(2) 扩域上进行的有限域构造及计算函数库。本次转载的这篇文章的部分章节较为详细地介绍了matlab中涉及计有限域的一些函数及其用法。
【嵌牛鼻子】有限域 matlab
【嵌牛正文】
一、Matlab中的有限域(元素)的生成原理介绍
Matlab 中自带的有限域的计算是在 GF(2^m) 上进行的,即在二元域 GF(2)的扩域中进行计算,其中 1≤m≤16.
Matlab构造有限域元素(结合内置的运算逻辑,也就同时构造了一个有限域)的做法是:
![](https://img.haomeiwen.com/i25080197/825f9aaa376cc80b.png)
这样生成的GF(2^m)中的元素本质上是2^m个次数小于m的GF(2)上的多项式,域上的加法和乘法运算分别为模P(D)的加法和乘法。显然可作如下对应(以GF(2^3)为例,取P(D)=D^3+D+1):
![](https://img.haomeiwen.com/i25080197/4d62f4c2a104db2b.png)
基于上述对应,Matlab将有限域GF(2^m)中的元素(本质上是多项式)显示为0,1,...,2^m-1.但注意这只是视觉效果,这些0,1,...2^m-1的数据类型是gf型,配合接下来要介绍的一些函数会很自然地理解。
二、定义有限域数组
在 Matlab 中,函数 gf 用来定义一个有限域数组,函数申明如下:
X_GF = GF(X,M,PRIM_POLY)
这个函数的作用是以数组的形式创建有限域GF(2^M),选取的本原多项式是PRIM_POLY(填写系数对应的二进制数换算而得的十进制数),且限定M为一个1至16间的整数。数组中的元素将显示为0,1,...2^M-1,数据类型为gf.
用例:生成有限域GF(2^3)中的所有元素,选取的本原多项式为P(D)=D^3+D^2+1
![](https://img.haomeiwen.com/i25080197/fa422e5411d1d2e2.png)
也可不指定本原多项式,Matlab将选取默认的本原多项式,效果如下:
![](https://img.haomeiwen.com/i25080197/d031f79cb9ccf521.png)
生成的有限域中的数组可以参与运算(+、、.、.^、\等). 注意:参与运算的操作数必须来自同一个有限域,用于生成有限域的本原多项式也必须相同!
一个典型的例子是计算有限域的乘法表如下:
>> 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(2^3),得到了2张不同的乘法表。虽然同阶的有限域总是同构的,且有限域的非零元全体关于乘法构成循环群,但得到不同乘法表的结果并不令人奇怪,因为用不同本原多项式定义的2个同阶有限域,它们各自的本原元素及本原元素各幂次(时刻记住这里的元素本质是多项式)的系数本身就不保证是相同的或有强烈的联系。
![](https://img.haomeiwen.com/i25080197/ea065c8816372bf0.png)
三、与本原多项式相关的函数
![](https://img.haomeiwen.com/i25080197/2cbf03b0839bf5e9.png)
![](https://img.haomeiwen.com/i25080197/4fa5788bde51c778.png)
![](https://img.haomeiwen.com/i25080197/79f9b9ddb06bf594.png)
其他还有一些相关函数,可见matlab帮助。