嵌牛IT观察

Matlab中的有限域计算

2020-11-05  本文已影响0人  wrl_30f5

姓名:王瑞麟         学号: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构造有限域元素(结合内置的运算逻辑,也就同时构造了一个有限域)的做法是:

这样生成的GF(2^m)中的元素本质上是2^m个次数小于m的GF(2)上的多项式,域上的加法和乘法运算分别为模P(D)的加法和乘法。显然可作如下对应(以GF(2^3)为例,取P(D)=D^3+D+1):

基于上述对应,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

也可不指定本原多项式,Matlab将选取默认的本原多项式,效果如下:

生成的有限域中的数组可以参与运算(+、、.、.^、\等). 注意:参与运算的操作数必须来自同一个有限域,用于生成有限域的本原多项式也必须相同!

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

>> 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个同阶有限域,它们各自的本原元素及本原元素各幂次(时刻记住这里的元素本质是多项式)的系数本身就不保证是相同的或有强烈的联系。

三、与本原多项式相关的函数

其他还有一些相关函数,可见matlab帮助。

上一篇 下一篇

猜你喜欢

热点阅读