实验二有限域上的运算.docx
- 文档编号:11337847
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:14
- 大小:332.22KB
实验二有限域上的运算.docx
《实验二有限域上的运算.docx》由会员分享,可在线阅读,更多相关《实验二有限域上的运算.docx(14页珍藏版)》请在冰豆网上搜索。
实验二有限域上的运算
实验二:
有限域GF28上的加减乘除运算实现
姓名
韦能龙
班级
11信息安全
学号
11350023
实验目的
通过上机操作,使学生对有限域的概念、性质及运算有一个充分的认识,为接下来现代密码学的学习打好基础。
实验内容及要求
1、学生自己生成一个有限域GF28并输出
2、在生成的有限域中,随机选取两个元素进行加减乘除运算并输出结果
实验结果(可续页)(包括实验代码、实验结果)
思路:
本实验需要解决的几个问题:
1、用什么方法存储多项式最好?
我用的是向量来储存多项式,比如:
ployntemp;
temp.push_back(make_pair(1,0));
说明多项式temp中只有一项,为x^0,
如果再执行temp.push_back(make_pair(1,4));
则多项式temp变为x^0+x^4
make_pair中第一个元素是系数,第二个是次数
2、怎么生生成域?
用递归生成,我们知道成域GFpn会有2的n次方个元素,只要能求出2的n-1个,就可以求出2的n个
因为当为n时,n-1中的每一个多项式添加一个x^n次方就可以了。
3、实现四则运算,尤其是在乘法和除法时,还有一个模运算的?
因为是在二维的情形下啊的,所以实验中的加法减法的答案是同一个,
至于乘法,乘出来的多项式的次数每循环一次都会减小至少1,所以最终会小于8的
除法就是先求逆,因为我们知道域中的每个多项式都会有逆而且逆唯一并就在域中,所以用穷搜素的方法在于中
一个一个试,只要相乘模x^8+x^4+x^3+x+1为1的就是逆。
1、学生自己生成一个有限域GF28并输出,如下图:
2、任选两个多项式进行四则运算:
代码如下:
/*本实验需要解决的几个问题:
1、用什么方法存储多项式最好
我用的是向量来储存多项式,比如:
ployntemp;
temp.push_back(make_pair(1,0));
说明多项式temp中只有一项,为x^0,
如果再执行temp.push_back(make_pair(1,4));
则多项式temp变为x^0+x^4
make_pair中第一个元素是系数,第二个是次数
2、怎么生生成域
用递归生成,我们知道成域GFpn会有2的n次方个元素,只要能求出2的n-1个,就可以求出2的n个
因为当为n时,n-1中的每一个多项式添加一个x^n次方就可以了。
3、实现四则运算,尤其是在乘法和除法时,还有一个模运算的
因为是在二维的情形下啊的,所以实验中的加法减法的答案是同一个,
至于乘法,乘出来的多项式的次数每循环一次都会减小至少1,所以最终会小于8的
除法就是先求逆,因为我们知道域中的每个多项式都会有逆而且逆唯一并就在域中,所以用穷搜素的方法在于中
一个一个试,只要相乘模x^8+x^4+x^3+x+1为1的就是逆。
*/
#include
#include
#include
#include
usingnamespacestd;
intconstN=8;
typedefvector
//V是x^8+x^4+x^3+x+1为1
ploynV;
//用递归方法求出域
vector
{
vector
if(n==0)
{
//如果n=0,说明域只有0和1两个元素
ployntemp;
temp.push_back(make_pair(1,0));
field.push_back(temp);
}
else
{
field=make_field(n-1);//先求得出n-1时的域的多项式的集合
ployntemp1,temp2;
temp1.push_back(make_pair(1,n));
intsize=field.size();
field.push_back(temp1);
for(intj=0;j { temp2=field[j]; temp2.push_back(make_pair(1,n));//在每一项多项式后面添加x^n次方 field.push_back(temp2); } } returnfield; } //输出多项式 voidshow1(ploynp) { for(intj=0;j { if(p[j].second! =0)cout<<"x"<<"^"< elseif(p[j].second==0)cout<<1<<"+"; } cout<<"x"<<"^"< } //输出域 voidshow(vector { cout<<"该域总共有"<<_field.size()+1<<"个元素,它们是: "< cout<<0<<""; cout<<1<<""; for(inti=1;i<_field.size();i++)show1(_field[i]); } ploynaddition(ploynp1,ploynp2) { inti=0,j=0; ploynp3; /*声明一个数组,数组的下标表示项的次数,数组存储的是系数,初始为0 这样只要遍历一下两个多项式,项的次数相同(也就是下标相同的,每遍历一次就加1) */ intaa[15]={0}; for(intp=0;p for(intp=0;p //遍历两个多形式后,这里把系数为不为偶数的项都留下来,就是加法的最后结果 //因为加法次数不会增大,所以不需要进行模运算。 for(inti=0;i<=14;i++) { if(aa[i]%2! =0)p3.push_back(make_pair(1,i)); } returnp3; } ploynSimplify(ploynp) { /*这是个模运算,递归基是多项式次数小于8,我存储的多项式阶从左到右是上升的。 这个函数利用了类似欧几里得算法,每循环一次次数都会下降,直到次数小于8*/ if(p.back().second ploynp5; ploynv1=V; intaa=p.back().second-N; for(inti=0;i { v1[i].second+=aa; } p5=addition(v1,p); returnSimplify(p5); } //乘法的实现类似于加法,只是后面有个模运算 ploynMultiplication(ploynp1,ploynp2) { ploynp3; intaaa[15]={0}; for(inti=0;i { for(intj=0;j { aaa[p1[i].second+p2[j].second]++; } } for(inti=0;i<=14;i++) { if(aaa[i]%2! =0)p3.push_back(make_pair(1,i)); } returnSimplify(p3); } ploynqiu_ni(vector { ployna,b; inti=1; //在域中用穷搜素的方法寻找逆元 for(;i { a=Multiplication(field[i],p); if(a.size()==1&&a[a.size()-1].second==0)returnfield[i]; } } intmain() { srand(time(0)); V.push_back(make_pair(1,0)); V.push_back(make_pair(1,1)); V.push_back(make_pair(1,3)); V.push_back(make_pair(1,4)); V.push_back(make_pair(1,8)); vector field=make_field(N-1); show(field);///输出域 intnum1,num2; num1=rand()%255; num2=rand()%255; ploynp1=field[num1]; ploynp2=field[num2]; ploynp3; cout<<"随机选的两个多项式为: "< show1(p1); show1(p2); p3=addition(p1,p2); cout<<"两个多项式相加为: "< show1(p3); cout<<"两个多项式相减为: "< show1(p3); p3=Multiplication(p1,p2); cout<<"两个多项式相乘为: "< show1(p3); cout< show1(p2); cout<<"的逆多项式为: "< p2=qiu_ni(field,p2); show1(p2); p3=Multiplication(p1,p2); cout<<"两个多项式相除为: "< show1(p3); system("pause"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 有限 运算