版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址
http://www.cnblogs.com/Colin-Cai/p/9652019.html
作者:窗户
QQ/微信:6679072
E-mail:6679072@qq.com
前一章,我们知道了使用素域的多项式环的商环构造任意的有限域的方法。这一章里,我们就用程序实现任意有限域里的运算。
我在这里还是同第一章一样,选择用Scheme来描述。
数据表示
首先,我们需要的一个参数就是域的特征,记为 p
根据上章分析,我们还需要一个不可分多项式,称为生成多项式,记为 poly
上一章还有一个重要结论是,如果poly的次数是n, 那么所有的次数小于n的多项式共计pn个,分别属于不同的商集,除此之外并无其他商集,那么也就对应着最后的域的元。
所以,我们这里就以这pn个小于n次的多项式来代表该域的所有元,这种表示是合理的。
现在,我们来考虑不可分多项式以及域里每个元的计法:
我们用一个长度为n+1的list来记录生成多项式poly就可以了(n次多项式一共n+1个系数),这个list的第0项、第1项、...第n-1项、第n项分别对应着poly的n次系数、n-1次系数、...1次系数、0次系数(常数项)。比如,特征2素域下的3次不可分多项式 x3+x+1,记作(1 0 1 1)。
而对于每个域里的元,我们也用上述的写法来记,只是,我们把这个多项式补齐成n-1次,没有的项系数都为0,比如在2特征、生成多项式x3+x+1的域下,元[x+1]记为(0 1 1),也就是一个域下所有的元,记录成list都是生成多项式的次数这么长。
函数定义
我们再来定义函数接口,我们就这样去表示有限域里的加减乘除:
(add poly p a b) 代表p特征、生成多项式为poly时,a+b
(sub poly p a b) 代表p特征、生成多项式为poly时,a-b
(mul poly p a b) 代表p特征、生成多项式为poly时,a*b
(div poly p a b) 代表p特征、生成多项式为poly时,a/b
当然,除法涉及到求逆,
(inv poly p a) 代表p特征、生成多项式为poly时,a的逆
程序设计
有了上述准备,再来看第一章的素域里的加减乘除:
;加法
(define (addp p a b)
(if (>= (+ a b) p) (- (+a b) p)
(+a b)
)
)
;减法
(define (