数域、有限域(伽罗瓦域)

1.域(Fields)

在抽象代数中,“”是一种可在其上进行加、减、乘和除运算而结果不会超自身的集合(代数结构),其概念是数域以及四则运算的推广。域是环的一种,其区别在于域要求它的元素可以进行除法运算,这等价于每个非零的元素都要有乘法逆元;同时,域中元素关于乘法是可交换的。一句话,域是乘法可交换的除环。即:

1.若数集P中任意两数作某一运算的结果仍在P中,则称P对这个运算是封闭的。

2.数域的等价定义:如果一个包含0、1在内的数集P,对于加、减、乘、除(除数不为0)是封闭的,则称P为一个数域。

常见数域复数域C;实数域R;有理数域Q(注意:自然数集N及整数集Z都不是数域,因为部分除法运算不是封闭的)

2.有限域(伽罗华域Galois Fields):仅含有限个元素的数域

①有限域定义

若域F只包含有限个元素,则称其为“有限域”,又称“伽罗华域”(由伽罗瓦(Galois.E)于18世纪30年代研究代数方程根式求解问题时引出的)。有限域在近代编码、计算机理论、组合数学等各方面有着广泛的应用。

有限域中元素的个数称为有限域的“阶”。阶必为素数的幂(如何证明?),可表示为p^np是素数、n∈Z+),这个素数P就是该有限域的“特征数”,通常用GF(pⁿ)表示pⁿ元的有限域。尽管存在有无限个元素的无限域,但只有有限域在密码编码学中得到了广泛的应用。元素个数相同的有限域是同构的。GF(pⁿ)的乘法群是(pⁿ-1)阶的循环群。

在密码学中,最常用的域是阶为p的素数域GFp)或阶为2^nGF(2^n)域。当n=1时,存在有限域GFp),也称为“素数域”。GF(p)就是mod p,因为一个数模p后,结果在[0p-1]之间,即该域中有p个元素;对于元素a和b,则(a+b) mod p和(a*b)mod p,其结果都是域中的元素;GF(p)里面的加法和乘法都是平时用的加法和乘法,GF(p)的加法和乘法单位元分别是0和1。

为什么p一定要是一个素数呢?这是因为当p为素数时,才能保证集合中的所有元素都有加法和乘法逆元(0除外)假如p等于10,尽管所有元素都有加法逆元,但乘法不行,如元素2,因为找不到一个数a,使得2*a mod 10等于1;若p为素数,那么它就能保证域中的所有元素都有逆元。利用反证法和余数的定义即可证明。

②有限域四则运算规则

若任意a、b、c∈GF(q),则必有:

1.封闭性:a+b∈GF(q),a·b∈GF(q);

2.结合律:(a+b)+c=a+(b+c),(a·b)c=a(b·c);

3.交换律:a+b=b+a,a·b=b·a;

4.乘对加分配律:a(b+c)=a·b+a·c;

5.必有加法恒等元0和乘法恒等元e,使:a+0=a,a·e=a,e可理解为1;

6.必有加法负元-a和乘法逆元a-1,使:a+(-a)=0,a.a-1=e,但0-1无定义。

③有限域定理

定理1  一个有限域E有pⁿ个元素,这里p是E的特征,而n是E在它的素域△上的次数。

定理2  令有限域E的特征是素数p,E所含的素域是△,而E有q=pⁿ个元素,那么E就是多项式xq-x在△上的分裂域。任何两个这样的域都同构。

定理3  令△是特征为p的素域,而q=pⁿ(n≥1),那么多项式xq-x在△上的分裂域E就是一个有q个元的有限域。

定理4  一个有限域E是它的素域△的一个单扩域。

④有限域GF(2^8)多项式运算

这是GF(p^n)的特例,p=2,n=8。例如多项式:f(x)=x^6+x^4+x^2+x+1,但是这里不同于中学的多项式运算。下面是它的一些特点:

特点1:多项式的系数只能是01(即【0,p-1】)。若p=3,那么系数是可以取0,1,2的;

特点2:合并同类项“加法”即“”,对系数进行异或操作,如x^4+x^4=0;

特点3:减法就等于加法(即无所谓的减法),或者负系数。所以,x^4–x^4就等于x^4+x^4,-x^3就是x^3。1

例如,设f(x)=x^6+x^4+x^2+x+1,g(x)=x^7+x+1,则:

f(x)+g(x)=x^7+x^6+x^4+x^2+(1+1)x+(1+1)1=x^7+x^6+x^4+x^2;

f(x)–g(x)=f(x)+g(x);

f(x)*g(x)=(x^13+x^11+x^9+x^8+x^7)+(x^7+x^5+x^3+x^2+x)+(x^6+x^4+x^2+x+1)=x^13+x^11+x^9+x^8+x^6+x^5+x^4+x^3+1;

f(x)/g(x),除法如下图所示,其余数也就是mod操作的结果:

数域、有限域(伽罗瓦域)_第1张图片

伽罗华域的元素可以通过该域上的本原多项式生成。通过本原多项式得到的域,其加法单位元都是0,乘法单位元是1本原多项式是一个素多项式(素多项式不能表示为其他两个多项式相乘的乘积,类似于素数)。以GF(2^3)为例,指数小于3的多项式共8个:0,1,x,x+1,x^2,x^2+1,x^2+x,x^2+x+1。其系数刚好就是000,001,010,011,100,101,110,111,是0到7这8个数的二进制形式。多项式对应一个值,我们可以称这个值为多项式值(有时看成一个向量)GF(2^3)上有不只一个本原多项式,选一个本原多项式x^3+x+1,这8个多项式进行四则运算后 mod (x^3+x+1)的结果都是8个之中的某一个。

设P(x)是GF(2^w)上的某一个本原多项式,GF(2^w)的元素产生步骤是:

1、给定一个初始集合,包含0,1和元素x,即 {0,1,x};

2、将这个集合中的最后一个元素,即x,乘以x,如果结果的度大于等于w,则将结果mod P(x)后加入集合;

3、直到集合有2^w个元素,此时最后一个元素乘以x再mod P(x)的值等于1。

⑥四则运算Python程序

输入:伽罗华域位大小4、8、16、32、64,两个数字。

primitive_polynomial_dict={4:0b10011,#x**4+x+1

8:(1<<8)+0b11101,#x**8+x**4+x**3+x**2+1

16:(1<<16)+(1<<12)+0b1011,#x**16+x**12+x**3+x+1

32:(1<<32)+(1<< 22)+0b111,#x**32+x**22+x**2+x+1

64:(1<<64)+0b11011#x**64+x**4+x**3+x+1

}

class GF:

    def __init__(self, w):

        self.w = w

        self.total =(1<< self.w) -1

        self.gflog = []

        self.gfilog = [1]# g(0) =1

        self.make_gf_dict(self.w, self.gflog, self.gfilog)

    def make_gf_dict(self, w, gflog, gfilog):

        gf_element_total_number =1<< w

        primitive_polynomial = primitive_polynomial_dict[w]

        for i in range(1, gf_element_total_number -1):

            temp = gfilog[i -1]<<1# g(i) = g(i-1) * 2

            if temp & gf_element_total_number:# 判断溢出

                temp ^= primitive_polynomial# 异或本原多项式

            gfilog.append(temp)

      assert(gfilog[gf_element_total_number-2]<<1)^primitive_polynomial

        gfilog.append(None)

        for i in range(gf_element_total_number):

            gflog.append(None)

        for i in range(0, gf_element_total_number -1):

            gflog[gfilog[i]] = i

        print(gflog)

        print(gfilog)

    def add(self, a, b):

        return(a ^ b) % self.total

    def sub(self, a, b):

        return(a ^ b) % self.total

    def mul(self, a, b):

        return self.gfilog[(self.gflog[a]+ self.gflog[b]) % self.total]

    def div(self, a, b):

        return self.gfilog[(self.gflog[a] - self.gflog[b]) % self.total]

你可能感兴趣的:(抽象代数)