meidoufu

导航

伽罗华域(Galois Field)上的四则运算

GF(2m)域

当m=8时,本原多项式为P(x) = x8 + x4 +x3 + x2 + 1 .

这个很重要,因为一切化解都来源与此式。

在伽罗华域中,加法等同于对应位异或,所以

现在把α定义为P(x) = 0的根,即
    α8+α4+α3+α2+1 = 0
    即可以得到 α8=α4+α3+α2+1,因为在珈罗华域中加法为模2加法,实际上是异或操作,所有有此2个等式同时成立。

接着先给出下表付推导过程:

下面就按以下规则进行乘法运算

0=000 就是0
1=001 就是1
2=0010就是x+0=x (此处及下文的x,其实就是表中的primitive element α)
3=0011就是x+1
4=00100就是x^2
然后对于两个变量
u,v
可以先计算两个对应多项式的乘积(需要注意的是加法是模2的,或者说是异或运算),
比如
37=(x+1)(x2+x+1)=xx2+xx+x+x2+x+1=x3+1 (模2运算中x+x=0 and x2+x2=0)
所以37=9 (伽罗华域中乘法运算其实是域中元素对应的多项式的乘法运算,相加时为模2加法)
在乘积得出来的多项式次数大于7时,我们需要对多项式在GF(2)上关于h(x)(h(x)就是本原多项式P(x))求余数,也就是
1295=(x7+1)
(x2+1)=x9+x7+x^2+1
将上面的函数加上xh(x) (h(x)就是本原多项式P(x))可以消去x^9,(其实就是手工除法过程,只是现在每一次商总是0或1),所以
129*5=x9+x7+x2+1+x9+x5+x4+x3+x=x7+x5+x4+x3+x2+x+1
=0010111111=191
查表
首先介绍一个概念,生成元。

生成元是域上的一类特殊元素,生成元的幂可以遍历域上的所有元素。假设g是域GF(2w)上生成元,那么集合 {g0 ,g1 , ……,g(2w-1) } 包含了域GF(2w)上所有非零元素。在域GF(2w)中2总是生成元。

将生成元应用到多项式中, GF(2w)中的所有多项式都是可以通过多项式生成元g通过幂求得。即域中的任意元素a,都可以表示为a = gk。

GF(2w)是一个有限域,就是元素个数是有限的,但指数k是可以无穷的。所以必然存在循环。这个循环的周期是2w-1(g不能生成多项式 0)。所以当k大于等于2w-1时,gk =gk%(2w-1)。

对于gk = a,有正过程和逆过程。知道指数k求a是正过程,知道值a求指数k是逆过程。

对于乘法,假设a=gn,b=gm。那么ab = gn gm = gn+m。查表的方法就是根据a和b,分别查表得到n和m,然后查表gn+m即可。

因此需要构造正表和反表,在GF(2w)域上分别记为gflog和gfilog。gflog是将二进制形式映射为多项式形式,gfilog是将多项式形式映射为二进制形式。

注意:多项式0 ,是无法用生成元生成的。g0等于多项式1,而不是 0。

根据上文的GF(24)的元素表示,生成gflog表和gfilog表如下:

查表进行乘法和除法运算的例子
在GF(24)域上的乘法和除法,已知2w-1 = 24 -1 = 15:

乘法:

7 * 9 = gfilog[gflog[7] + gflog[9]] = gfilog[10 + 14] = gfilog[24 mod 15] = gfilog[9] = 10

除法:

13 / 11 = gfilog[gflog[13] - gflog[11]] = gfilog[13 - 7] = gfilog[6] = 12

生成GF(2w)gflog表和gfilog表的python代码

点击查看代码
# coding=UTF-8  

# key : value => w : primitive_polynomial  
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  
			    }  


def make_gf_dict(w):  
	gf_element_total_number = 1 << w  
	primitive_polynomial = primitive_polynomial_dict[w]  

	gfilog = [1]  # g(0) = 1  
	for i in xrange(1, gf_element_total_number - 1):  
		temp = gfilog[i - 1] << 1  # g(i) = g(i-1) * g  
		if temp & gf_element_total_number:  # if overflow, then mod primitive polynomial  
			temp ^= primitive_polynomial  # mod primitive_polynomial in GF(2**w) == XOR  
		gfilog.append(temp)  

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

	gflog = [None] * gf_element_total_number  
	for i in xrange(0, gf_element_total_number - 1):  
		gflog[gfilog[i]] = i  

	print "{:>8}\t{:>8}\t{:>8}".format("i", "gfilog[i]", "gflog[i]")  
	for i in xrange(0, gf_element_total_number):  
		print "{:>8}\t{:>8}\t{:>8}".format(i, gfilog[i], gflog[i])  


if __name__ == "__main__":  
	make_gf_dict(4)  

posted on 2024-12-17 16:22  霉豆腐  阅读(164)  评论(0)    收藏  举报