永远的伽罗华
伽罗华(很多中文翻译也称为伽罗瓦)是一个伟大的数学家,维基百科对其介绍如下:
法国著名的数学家。在他还只有十几岁的时候,他就发现了次多项式可以用根式解的充要条件,解决了长期困扰数学界的问题。他的工作为伽罗瓦理论(一个抽象代数的主要分支)以及伽罗瓦连接领域的研究奠定了基石。他是第一个使用群这一个数学术语来表示一组置换的人。与尼尔斯·阿贝尔并称为现代群论的创始人。在路易·菲利普复辟的时期,他是一个激进的共和主义者,并因此被逮捕、坐牢。二十岁出狱后,他在一次几近自杀的决斗中逝世,引起种种揣测。
编码的本质上是对数据进行加、减、乘、除操作,有限域运算的一个重要特点是运算具有闭包性。即计算的结果一定还是有限域中的某个数。比如在有限域上,,在实数域上应当等于9,而在这里并不等于9,因为9并不是该有限域上的元素。再比如4/5在实数域上,结果应当是个小数,而在这里,其结果仍然是域上的某个数。
常见的网络编码方案均为线性网络编码,源节点和中间节点在进行编码时都是采用线性编码。由于相比实数域运算,有限域上的运算具有闭包性,并且能够回避计算开销大的浮点运算,因此网络编码操作基本都是基于有限域的。因此,做网络编码的应用开发,师兄认为,第一步,必须学会如何在有限域上进行网络编码的运算。
首先,我们需要明白一个概念,即域的尺寸。顾名思义,域的尺寸就是域的大小,域中元素的个数。如上面中的元素个数就是这7个元素。从数学的角度来说,并不是任意尺寸的域都可以作为有限域。只有才能成为有限域,其中必须是素数,为自然数。
由于目前广泛使用的主流计算机的寄存器字长都是2的倍数,所以有限域是使用最为广泛的有限域,通过实践表明,其效率确实也很高。本节简要介绍此类域的生成,运算操作。 我相信一定有很多师弟师妹不能立即看懂我写的是什么。但这并没有关系,能看懂就看,看不懂,也不影响搞开发。因为,有限域的运算,国际上也很多人封装了现成的函数函数运算库供用户编程时调用,我自己也开发过一个效率较高的运算库。大家可以直接include到自己的项目中去,然后就可以使用了。
对于一个阶的有限域,首先需要一个阶的不可约本原多项式。当这个多项式确定以后,就可以用来生成该有限域。例如,一个的生成多项式可以为,则生成的域序列依次为{0,1,2,4,3,6,7,5}。
有限域上的加法操作通常采用异或来实现,这就是说我们在图1.1的蝴蝶模型中对数据和进行加法运算时,其本质上就是进行异或操作。
乘法操作的实现步骤如下:先用两个元素对应的多项式相乘,乘积的结果再模上本原多项式,所得结果即为二者在有限域上运算的结果。我们面向C/C++实现了一个计算速率快的有限域运算库,该运算库的代码量仅为已有运算库的1/3到1/5,而计算速率则比现有的库快10%。该库中,采用二维查表法,所有的计算均采用了宏替换的方式,因而计算速率极高。大家在今后做基于网络编码的应用时,强烈建议采用此库来提高计算性能。
我说过应该会有一些师弟师妹,在看完上面这一段后,仍然不明白上面的伽罗华域是怎么一回事。如果对伽罗华域上的运算法则不知道怎么回事的话,可以先不要管他,下一章,我们将通过实例来讲解。事实上,我们在实际开发中,根本不用管有限域上的运算是怎么实现的。因为在实现时,把我上面封装好的那个库集成到你的项目中即可。凡是对a、b用到加、减、乘、除、指数运算时,直接用gf_add(a, b), gf_add(a, b), gf_mul(a, b), gf_div(a, b), gf_exp(a, b)代替即可,那样你的编码操作就已经工作在有限域,而非实数域上了。简单吧?有些同学纠结想知道底层怎么实现的,可以去阅读我们封装的代码,其实也非常简单。如果不敢想去,可直接略过。想当年,我们在研究有限域运算时,看了不少书,可废了不少脑细胞。