不可约多项式 本源多项式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有限域第一次大作业
一、实验内容
(1)构造有限域202F .
(2)找到有限域202F 上的任意元素的极小多项式;
(3)找到2F 上的一个本原多项式。
二、算法设计
(1)我们知道有限域()n q F q p =的表达有三种形式:()i {}
q q F ααα==,α为 ()q h x x x =-的根;()ii []()()()[],p q p
F x F f x F x n f x =∈的次不可约多项式; ()iii {}0,q q F F αα= 为上的一个生成元;在这里我们主要通过找到2F 上的一个20次可约多项式来构造有限域202F ,并进行相应的运算。由于只要找到一个2F 上的不可约多项式,我们采用的算法:()a 随机生成一个20次2F 上的多项式,()b 判断多项式为不可约的,pari 代码见附录1;通过pari 我们得到了一个20次的不可约多项式()(x)f ,则[]()2(x)F x f 即为我们想要的有限域,在这有限域上可以直接进行相应的代数运算,pari 代码见附录2;
(2)找到有限域202F 上的任意元素α的极小多项式()f x 的思路
第一步:通过元素α的共轭元个数来判断极小多项式()f x 的次数; 第二步:通过α的共轭元生成极小多项式()f x ;
第三步:进一步判断该元素α是否为本原元,若是,则生成的极小多项式()f x 就是2F 上的本原多项式。
pari 代码见附录3;
(3)由于上述方法(2)生成的极小多项式不一定是本原多项式,因此,我们还给出一个能找到上的本原多项式的方法,该方法也是基于随机生成多项式并判断是否为本原多项式,我
们知道一个n 次不可约多项式()f x 是本原多项式的条件是其周期达到最大1n p -,由于
()()
11n p f x x --,所以只要11n k p p p -= 时,若()|f x ()11 1,,n i p p x i k -⎛⎫ ⎪-= ⎪⎝⎭ ,则()f x 就是本原多项式,所用的算法思路如下
第一步:随机产生一个2F 上的20次多项式()f x ;
第二步:利用方法一判断该多项式()f x 是否为不可约的;
第三步:进一步判断该多项式()f x 是否为本原多项式。
pari 代码见附录4;
三、实验结果
(1)第一问产生的不可约多项式
我们选择()20191814136++1f x x x x x x x =++++作为我们的所要的不可约多项式 第一问有限域上元素的运算
(2)第二问中产生的极小多项式
(3)第三问中产生的本原多项式
附录:
(1)**找到20次不可约多项式**
find_irreducible_polynomial (p,deg)={
a=1;
while(a,px=x^deg;
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)**构造有限域F2^20并进行运算**
create_a_finite_filied (fx, fx1, fx2)={ //fx为F2上的20次不可约多项式,fx1及
pol_Mod=Mod(1,2)*fx; fx2 为F2上的次数小于20的多项式,即gg1=fx1*Mod(1,2); 为有限域F2^20里的元素
gg2=fx2*Mod(1,2);
rest=lift(lift(Mod(gg1*gg2,pol_Mod))); //F2^20里的元素进行乘法运算
rest1=lift(lift(Mod(gg1+gg2,pol_Mod))); //F2^20里的元素进行加法运算
rest2=lift(lift(Mod(gg1-gg2,pol_Mod))); //F2^20里的元素进行减法运算
rest3=lift(lift(Mod(gg1/gg2,pol_Mod))); //F2^20里的元素进行除法运算
print("fx1*fx2=",rest);
print("fx1+fx2=",rest1);//输出所有的元素运算的结果
print("fx1/fx2=",rest2);
print("fx1/fx2=",rest3);
}
(3)**找到任意元素的极小多项式并判断是否为本原多项式**
find_a_minimal_polynomial (fy, fy1)={//fy为F2上是不可约多项式,Fy1为域F2^20
pol_Mod=Mod(1,2)*fy;上任意一个元素
gg1=fy1*Mod(1,2);
tty=Mod(gg1,pol_Mod); //将多项式Fy1转化为域F2^20上的元素
n=2^(20)-1;
fa_table=factorint(2^20-1)[,1];//将2^20-1分解得到其素因子
fa_leath=#fa_table;//找到2^20-1的素因子的个数
ppx=1;
for(i=1,20,res = tty^(2^(i-1));ppx*=(x-res);if(i>1&&res==gg1,break;););
//用元素的共轭元判断极小多项式的次数并生成极小多项式
res=lift(lift(ppx));
print("fx="res); //输出极小多项式
for(j=1,fa_leath,if(tty^(n/fa_table[j])==1,print("fx is not primitive polynomial ");return;););
//用元素的阶判断极小多项式的周期并判断出元素是否为本原元及多项式是否为本原多项式
print("fx is primitive polynomial");//输出本原多项式
}
(4)**找到f2^20上的本原多项式**
find_a_primitive_polynomial (p,deg,fx)={//p为任意素数,deg是想找本原多项
pol_Mod=fx*Mod(1,2);式的次数,fx为F2上的20次不可约
a=1;多项式
while(a,px=x^deg;
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=p^deg-1;
fa_table=factorint(n)[,1];
fa_leath=#fa_table;
tty=tty=Mod(res,pol_Mod); //将多项式Fy1转化为域F2^20上的元素
j=1;
flot=1;