1、大整数基本运算实现研究报告及分析课 程 设 计课程名称 应用密码学题目名称大整数基本运算的实现研究及分析学生学院 应用数学 专业班级 信息安全081班学 号3108008921,3108008945,3108008944学生姓名洪亿鹏,熊邦名,伍尚鹏指导教师 李峰2018 年 12月 19 日广东工业大学课程设计任务书题目名称大整数基本运算的实现研究及分析学生学院应用数学学院专业班级08级信息安全1)班姓 名洪亿鹏,熊邦名,伍尚鹏学 号3108008921,3108008945,3108008944一、课程设计的内容本文介绍了一种这样的大整数在程序设计语言中的表示的方法,并对这种方法表示的大整
2、数的基本运算进行了分析,给出了实现算法,并提供良好的用户界面。二、课程设计的要求与数据1.实现大整数的基本运算;2.提供友好的用户界面;三、课程设计应完成的工作1、查阅相关资料,了解关于大整数基本运算的实现研究及分析;2、在Visual C+6.0进行编程,设计出合乎要求的程序;3、测试程序的正确性和稳定性;4、根据, 写出课程设计说明书。四、课程设计进程安排序号设计各阶段内容地点起止日期1领取课程设计任务课室2018.12.132组员讨论选取课程设计题目课室2018.12.133查阅相关课题的各种资料图书馆,宿舍2018.12.132018.12.144组员直接讨论课题,并且分配各部分任务课
3、室2018.12.145各自编写各部分代码宿舍2018.12.152018.12.176汇集已写好的各部分代码,并进去测试宿舍2018.12.187代码顺利运行,运用MFC可视化方法为程序提供友好的用户界面宿舍2018.12.198分工合作拟写课程设计报告书宿舍2018.12.19五、应收集的资料及主要参考文献1宋震.密码学M.北京:中国水利水电出版社. 2002:87-151.2(美Garlisle Adams Steve Lloyd著 冯登国等译.公开密钥基础设施概念、标准和实施M.北京:人民邮电出版社.2001:71-98.3王永祥. 超高精度超大数算法与程序设计M. 陕西:西安交通大学
4、出版社,1990:75-105.4 胡向东,魏琴芳编著.应用密码学.北京:电子工业出版社,2006.115 谭浩强,C程序设计第三版)北京:清华大学出版社,20056 郑莉,C+语言程序设计33.2用C+编写大整数类33.3本章小结54基本运算的原理和代码实现54.1 加法运算54.11 实现原理54.12 代码实现64.13数据测试结果84.2 减法运算84.21减法运算代码实现84.22数据测试结果104.3乘法运算114.31乘法运算原理114.32乘法运算代码实现124.33数据测试结果144.4除法运算144.41除法运算代码实现144.42数据测试结果16结论17参考文献17附录
5、A171 绪论1.1 大整数的概念“大整数”一般指位数达到十几或成百上千甚至更多的整数,而更准确地说,应该是指普通程序设计语言中的整数类型值集范围以上的整数。如标准的C的Unsigned long 型整数所能处理的整数范围最大,有效数位也最多,为4294967295(占据32 位中的应用前景广泛。微观世界中的许多对象的活动可以进行数字化模拟,而且其活动变化也可以通过大整数的运算来表示,其表达与处理就非常方便了。1.3 大整数处理的研究现状由于“大整数”超出了程序设计语言本身整数类型值集范围,所以它的表达、存储、读取、处理(各种运算、输出等问题用一般编程方法难以解决。一般的程序设计语言数值处理范
6、围均有限。C+及其系列语言的数值处理的有效数位是整型4 个字节,数值型可达到8 个字节。新版的微软操作系统自带的“运算器”的处理能力非常强,但精确数位也只能达到32 个十进制位。因而大整数运算处理系统的研究与开发有极强的实际意义。由于大整数处理系统的复杂性,以及其一般用于高尖新技术领域,所以系统化研究及其开发工作主要集中在一些国家级的计算中心、安全中心。但随着大整数应用领域逐渐扩大及个人计算机处理能力的快速发展,这项工作已经受到越来越多的科技工作者的关注。1.4 本文主要研究内容本文基于MFC应用框架,首先采用模块化的思想建立大整数运算库,利用数组存储不大于310位的大整数,在实现一些辅助函数
7、后在此运算库框架上讨论并实现多精度大整数的基本加法、减法、乘法、除法等基本算法。本文采用C+为主要语言编写程序代码。在保证算法有足够高的效率的同时力求代码清晰易懂,函数接口简单明了,具有可移植性和稳定性。2大整数概述2.1本文研究的大整数特定含义为了系统地研究大整数的处理,本文提到的大整数处理程序中所指的大整数是指最大位数为310位的大整数。采用数组存储方式存储。2.2大整数的存储我们采用数组存储的方式存储,也可以采用字符串的方式存储,但最终还是要转化为“数组”的方式存储,并且存储的位数不能大于310位,否则会发生溢出错误而导致大整数处理错误。2.3大整数的输入与读取如果是从键盘输入大整数,要
8、求连续输入正负号及全部数字,程序将实现专用处理命令自动完成分组。2.4 大整数的基本运算处理本程序可以实现位数少于310位的大整数的加,减,乘,除等运算,输出位数同样不可以大于310位,对于负数,程序将不能处理,并且不能直接输入。3 大整数的类的开发3.1如何表示一个大整数(123456789012345678903.2用C+编写大整数类class CBigIntpublic:/大数在0x100000000进制下的长度 unsigned m_nLength。/用数组记录大数在0x100000000进制下每一位的值 unsigned long m_ulValueBI_MAXLEN。 CBigIn
9、t(。 CBigInt(。/*基本操作与运算Mov,赋值运算,可赋值为大数或普通整数,可重载为运算符“=”Cmp,比较运算,可重载为运算符“=”、“!=”、“=”、“。 void Mov(CBigInt& A。 CBigInt Add(CBigInt& A。 CBigInt Sub(CBigInt& A。 CBigInt Mul(CBigInt& A。 CBigInt Div(CBigInt& A。 CBigInt Add(unsigned long A。 CBigInt Sub(unsigned long A。 CBigInt Mul(unsigned long A。 CBigInt Div
10、(unsigned long A。 int Cmp(CBigInt& A。 void Get(CString& str, unsigned int system=HEX。/Get,从字符串按10进制或16进制格式输入到大数void Put(CString& str, unsigned int system=HEX。/Put,将大数按10进制或16进制格式输出到字符串CBigInt Euc(CBigInt& A。 CBigInt RsaTrans(CBigInt& A, CBigInt& B。3.3本章小结基于面向对象程序设计开发的基本思想,本章介绍了大整数“类”的结构,包括大整数的构造,加,减
11、,乘,除基本运算的函数模块和大整数的获取、赋值函数模块。4基本运算的原理和代码实现4.1 加法运算4.11 实现原理如何进行大整数的加法运算4.12 代码实现CBigInt CBigInt:Add(CBigInt& A/大数相加,调用形式:N.Add(A, 返回值:N+A CBigInt X。 X.Mov(*this。 unsigned carry=0。/进位 unsigned _int64 sum=0。 if(X.m_nLengthX.m_nLength=A.m_nLength。 for(unsigned i=0。i sum=A.m_ulValuei。 sum=sum+X.m_ulValue
12、i+carry。 X.m_ulValuei=(unsigned longsum。 carry=(unsigned(sum32。 X.m_ulValueX.m_nLength=carry。 X.m_nLength+=carry。 return X。CBigInt CBigInt:Add(unsigned long A CBigInt X。 X.Mov(*this。 unsigned _int64 sum。 sum=X.m_ulValue0。 sum+=A。 X.m_ulValue0=(unsigned longsum。 if(sum0xffffffff unsigned i=1。 while(X
13、.m_ulValuei=0xffffffffX.m_ulValuei=0。i+。 X.m_ulValuei+。 if(m_nLength=im_nLength+。 return X。4.13数据测试结果图4.134.2 减法运算4.21减法运算代码实现CBigInt CBigInt:Sub(CBigInt& A/大数相减 调用形式:N.Sub(A 返回值:N-A CBigInt X。 X.Mov(*this。 if(X.Cmp(AX.Mov(0。return X。 unsigned carry=0。 unsigned _int64 num。 unsigned i。 for(i=0。i if(m
14、_ulValueiA.m_ulValuei|(m_ulValuei=A.m_ulValuei&(carry=0 X.m_ulValuei=m_ulValuei-carry-A.m_ulValuei。 carry=0。 else num=0x100000000+m_ulValuei。 X.m_ulValuei=(unsigned long(num-carry-A.m_ulValuei。 carry=1。 while(X.m_ulValueX.m_nLength-1=0X.m_nLength-。 return X。CBigInt CBigInt:Sub(unsigned long A CBigIn
15、t X。 X.Mov(*this。 if(X.m_ulValue0=AX.m_ulValue0-=A。return X。 if(X.m_nLength=1X.Mov(0。return X。 unsigned _int64 num=0x100000000+X.m_ulValue0。 X.m_ulValue0=(unsigned long(num-A。 int i=1。 while(X.m_ulValuei=0X.m_ulValuei=0xffffffff。i+。 X.m_ulValuei-。 if(X.m_ulValuei=0X.m_nLength-。 return X。4.22数据测试结果图4
16、.224.3乘法运算4.31乘法运算原理4.32乘法运算代码实现CBigInt CBigInt:Mul(CBigInt& A/大数相乘 调用形式:N.Mul(A 返回值:N*A if(A.m_nLength=1return Mul(A.m_ulValue0。 CBigInt X。 unsigned _int64 sum,mul=0,carry=0。 unsigned i,j。 X.m_nLength=m_nLength+A.m_nLength-1。 for(i=0。i sum=carry。 carry=0。 for(j=0。j if(i-j=0&(i-j mul=m_ulValuei-j。 m
17、ul*=A.m_ulValuej。 carry+=mul32。 mul=mul&0xffffffff。 sum+=mul。 carry+=sum32。 X.m_ulValuei=(unsigned longsum。 if(carryX.m_nLength+。X.m_ulValueX.m_nLength-1=(unsigned longcarry。 return X。CBigInt CBigInt:Mul(unsigned long A CBigInt X。 unsigned _int64 mul。 unsigned long carry=0。 X.Mov(*this。 for(unsigned
18、 i=0。i mul=m_ulValuei。 mul=mul*A+carry。 X.m_ulValuei=(unsigned longmul。 carry=(unsigned long(mul32。 if(carryX.m_nLength+。X.m_ulValueX.m_nLength-1=carry。 return X。4.33数据测试结果图4.334.4除法运算4.41除法运算代码实现CBigInt CBigInt:Div(CBigInt& A/大数相除 调用形式:N.Div(A 返回值:N/A if(A.m_nLength=1return Div(A.m_ulValue0。 CBigIn
19、t X,Y,Z。 unsigned i,len。 unsigned _int64 num,div。 Y.Mov(*this。 while(Y.Cmp(A=0 div=Y.m_ulValueY.m_nLength-1。 num=A.m_ulValueA.m_nLength-1。 len=Y.m_nLength-A.m_nLength。 if(div=num&(len=0X.Mov(X.Add(1。break。 if(div&lenlen-。div=(div+Y.m_ulValueY.m_nLength-2。 div=div/(num+1。 Z.Mov(div。 if(len Z.m_nLengt
20、h+=len。 for(i=Z.m_nLength-1。i=len。i-Z.m_ulValuei=Z.m_ulValuei-len。 for(i=0。iZ.m_ulValuei=0。 X.Mov(X.Add(Z。 Y.Mov(Y.Sub(A.Mul(Z。 return X。CBigInt CBigInt:Div(unsigned long A CBigInt X。 X.Mov(*this。 if(X.m_nLength=1X.m_ulValue0=X.m_ulValue0/A。return X。 unsigned _int64 div,mul。 unsigned long carry=0。 f
21、or(int i=X.m_nLength-1。i=0。i- div=carry。 div=(div+X.m_ulValuei。 X.m_ulValuei=(unsigned long(div/A。 mul=(div/A*A。 carry=(unsigned long(div-mul。 if(X.m_ulValueX.m_nLength-1=0X.m_nLength-。 return X。4.42数据测试结果图4.42结论一个星期的课程设计结束,通过我们组成员的合作,终于完成了本次课程设计。中间,我们也遇到了很多的问题,例如MFC的应用,数据存储的方式,算法的实现等。通过我们的共同努力,看了不同
22、的资料。总算找到了解决的方案。这次课程设计,我们组员之间分工明确,都很出色的做好了自己的工作。其中,洪亿鹏同学完成了大数算法的乘法部分,并且领导全体组员一起完成了除法部分的算法,在MFC的实现过程中,成为核心角色,而在最后的论文编写中,也给出了也重要的指示,带领大家完成任务;熊邦名同学完成了大数算法的加法部分,协调组员之间的关系,大家团结一致完成认为,并且在论文编写中做出了比较大的贡献;伍尚鹏同学完成了大数算法的减法部分;发扬不怕苦不怕累的精神,拼搏精神感染了大家,为这次课程设计的圆满完成作出了很大的贡献,同时论文编写部分也是以伍尚鹏同学为核心完成的,大家通力合作。本文讨论的主要是大数运算中的
23、基本算法,而要实现一个比较好的大数运算库则除此之外还有很多工作要做。大数算法是一个很大的考验,既要有不错的软件编码知识又要对硬件细节有足够的了解,还要求会根据情况自己推导数学公式,优化算法,同时也需要很强的耐心、足够的细心和大量的时间。参考文献4宋震.密码学M.北京:中国水利水电出版社.2002:87-151.5(美Garlisle Adams Steve Lloyd著 冯登国等译.公开密钥基础设施概念、标准和实施M.北京:人民邮电出版社.2001:71-98.6王永祥. 超高精度超大数算法与程序设计M. 陕西:西安交通大学出版社,1990:75-105.4 胡向东,魏琴芳编著.应用密码学.北京:电子工业出版社,2006.115 谭浩强,C程序设计第三版)北京:清华大学出版社,20056 郑莉,C+语言程序设计返回值:N被赋值为相应大数sys暂时只能为10或16*/void CBigInt:Get(CString& str, unsigned int system int len=str.GetLength(,k。 Mov(0。 for(int i=0。i Mov(Mul(system。 if(stri=0&(strik=stri-48。 else if(str
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1