1、有限域第一次大作业一、实验内容(1 )构造有限域 .20F(2 )找到有限域 上的任意元素的极小多项式;20(3 )找到 上的一个本原多项式。二、算法设计(1 )我们知道有限域 的表达有三种形式: , 为nqFpiqqF的根; ;qhxi,q pxfxnf的 次 不 可 约 多 项 式;在这里我们主要通过找到 上的一个i0,qq为 上 的 一 个 生 成 元 2次可约多项式来构造有限域 ,并进行相应的运算。由于只要找到一个 上的不可220FF约多项式,我们采用的算法: 随机生成一个 次 上的多项式, 判断多项式为不a20Fb可约的, 代码见附录 ;通过 我们得到了一个 次的不可约多项式 ,则p
2、ari1pri (x)f即为我们想要的有限域,在这有限域上可以直接进行相应的代数运算,2(x)Ff代码见附录 ;pari2(2 )找到有限域 上的任意元素 的极小多项式 的思路20Ffx第一步:通过元素 的共轭元个数来判断极小多项式 的次数;第二步:通过 的共轭元生成极小多项式 ;fx第三步:进一步判断该元素 是否为本原元,若是,则生成的极小多项式 就是 上fx2F的本原多项式。代码见附录 ;pari3(3 )由于上述方法(2)生成的极小多项式不一定是本原多项式,因此,我们还给出一个能找到上的本原多项式的方法,该方法也是基于随机生成多项式并判断是否为本原多项式,我们知道一个 次不可约多项式 是
3、本原多项式的条件是其周期达到最大 ,由nfx 1np于 ,所以只要 时,若 ,1npfx 1nkp |fx1 ,nipik则 就是本原多项式,所用的算法思路如下f第一步:随机产生一个 上的 次多项式 ;2F0fx第二步:利用方法一判断该多项式 是否为不可约的;f第三步:进一步判断该多项式 是否为本原多项式。x代码见附录 ;pari4三、实验结果(1 )第一问产生的不可约多项式我们选择 作为我们的所要的不可约多项式201981436+fxxx第一问有限域上元素的运算(2 )第二问中产生的极小多项式(3 )第三问中产生的本原多项式附录:(1 ) *找到20次不可约多项式 *find_irreduc
4、ible_polynomial (p,deg)=a=1;while(a,px=xdeg;for(i=2,deg,px+=random(p)*x(i-1););/随机产生一个F2上的20次多项式px+=1;fx=px*Mod(1,p);res=lift(fx);if(polisirreducible(fx)=1,print(res);a=0;);)/若多项式是不可约的,则输出并 /停止循环(2) *构造有限域F220并进行运算*create_a_finite_filied (fx, fx1, fx2)= /fx为F2上的20次不可约多项式,fx1及pol_Mod=Mod(1,2)*fx; fx2
5、 为F2 上的次数小于20的多项式,即gg1=fx1*Mod(1,2); 为有限域F220 里的元素gg2=fx2*Mod(1,2);rest=lift(lift(Mod(gg1*gg2,pol_Mod); /F220里的元素进行乘法运算rest1=lift(lift(Mod(gg1+gg2,pol_Mod); /F220里的元素进行加法运算rest2=lift(lift(Mod(gg1-gg2,pol_Mod); /F220里的元素进行减法运算rest3=lift(lift(Mod(gg1/gg2,pol_Mod); /F220里的元素进行除法运算print(“fx1*fx2=“,rest)
6、;print(“fx1+fx2=“,rest1); /输出所有的元素运算的结果print(“fx1/fx2=“,rest2);print(“fx1/fx2=“,rest3);(3)*找到任意元素的极小多项式并判断是否为本原多项式*find_a_minimal_polynomial (fy, fy1)= /fy为F2上是不可约多项式,Fy1为域F220 pol_Mod=Mod(1,2)*fy; 上任意一个元素gg1=fy1*Mod(1,2);tty=Mod(gg1,pol_Mod); /将多项式Fy1转化为域F220上的元素n=2(20)-1;fa_table=factorint(220-1),
7、1; /将220-1 分解得到其素因子fa_leath= #fa_table; /找到 220-1的素因子的个数ppx=1;for(i=1,20,res = tty(2(i-1);ppx*=(x-res);if(i1););/用元素的共轭元判断极小多项式的次数并生成极小多项式res=lift(lift(ppx);print(“fx=“res); /输出极小多项式for(j=1,fa_leath,if(tty(n/fa_tablej)=1,print(“fx is not primitive polynomial “);return;););/用元素的阶判断极小多项式的周期并判断出元素是否为本原
8、元及多项式是否为本原多项式print(“fx is primitive polynomial“);/输出本原多项式(4) *找到f220上的本原多项式*find_a_primitive_polynomial (p,deg,fx)= /p为任意素数,deg是想找本原多项pol_Mod=fx*Mod(1,2); 式的次数,fx为F2上的20次不可约a=1; 多项式while(a,px=xdeg;for(i=2,deg,px+=random(p)*x(i-1);); /随机生成一个多项式px+=1;fx=px*Mod(1,p);res=lift(fx);if(polisirreducible(res)=1, /判断多项式是否为不可约的n=pdeg-1; fa_table=factorint(n),1; fa_leath=#fa_table; tty=tty=Mod(res,pol_Mod); /将多项式Fy1转化为域F220上的元素j=1;flot=1;while(j=fa_leath,if(tty(n/fa_tablej)=1,flot=0;break;);j+;); /不是本原if(flot=1,print(“fx is primitive polynomial fx=“,res);a=0;););); /是本原多项式并输出