在抽象代数中,“域”是一种可在其上进行加、减、乘和除运算而结果不会超自身的集合(代数结构),其概念是数域以及四则运算的推广。域是环的一种,其区别在于域要求它的元素可以进行除法运算,这等价于每个非零的元素都要有乘法逆元;同时,域中元素关于乘法是可交换的。一句话,域是乘法可交换的除环。即:
1.若数集P中任意两数作某一运算的结果仍在P中,则称P对这个运算是封闭的。
2.数域的等价定义:如果一个包含0、1在内的数集P,对于加、减、乘、除(除数不为0)是封闭的,则称P为一个数域。
常见数域:复数域C;实数域R;有理数域Q(注意:自然数集N及整数集Z都不是数域,因为部分除法运算不是封闭的)。
①有限域定义
若域F只包含有限个元素,则称其为“有限域”,又称“伽罗华域”(由伽罗瓦(Galois.E)于18世纪30年代研究代数方程根式求解问题时引出的)。有限域在近代编码、计算机理论、组合数学等各方面有着广泛的应用。
有限域中元素的个数称为有限域的“阶”。阶必为素数的幂(如何证明?),可表示为p^n(p是素数、n∈Z+),这个素数P就是该有限域的“特征数”,通常用GF(pⁿ)表示pⁿ元的有限域。尽管存在有无限个元素的无限域,但只有有限域在密码编码学中得到了广泛的应用。元素个数相同的有限域是同构的。GF(pⁿ)的乘法群是(pⁿ-1)阶的循环群。
在密码学中,最常用的域是阶为p的素数域GF(p)或阶为2^n的GF(2^n)域。当n=1时,存在有限域GF(p),也称为“素数域”。GF(p)就是mod p,因为一个数模p后,结果在[0,p-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:多项式的系数只能是0或1(即【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操作的结果:
伽罗华域的元素可以通过该域上的本原多项式生成。通过本原多项式得到的域,其加法单位元都是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]