大整数基本运算的实现 正文.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大整数基本运算的实现 正文

摘要 目前,密码学大量被应用到生活中,而随着计算机信息安全要求的不断提高,为保证安全性,数据安全方面往往采用非常大的数作为密钥,来对数据进行分块加密,例如RSA、ECC等公钥密码算法和数字签名算法都需要建立在大整数运算的基础上,而各种编程语言所提供的各种基本数据类型中,一般整型数所能表示的最大整数只有2^32一1,远远不能满足如此大的数之间的运算要求。本文把大整数用十进制表示,B=n0*10^0+n1*10^1+...+nj*10j+...,只要用整型数组把{n0 n1 n2 ...nj..}一一对应保存就能达到目的,本文的大整数基本运算加、减、乘、除都是采用模拟笔算的方法,易读。 关键字:大整数、数组、笔算 目录 1、绪论 1.1背景 随着计算机和网络的发展,计算机已经深入到了生活中的各个行业中了,在计算机给我们带来方便和提高工作效率的同时也带来越来越多的问题,其中信息安全问题最为突出,而随着计算机信息安全要求的不断提高,计算机必威体育官网网址系统变得越来越重要,而密码学的应用迅速扩大到社会的很多领域当中,RSA、ECC等公钥密码算法和数字签名算法等得到了了快速的发展,但这些算法的实现都是建立在大整数运算的基础上,大整数储存问题以及耗时的大整数基本运算都带来巨大的困难和挑战,如何解决这些问题是公钥密码领域普遍关注的热点。 1.2 本文研究内容 本文采用数组的思想,把大整数用十进制表示,用数组储存对应的系数,如B=n[0]*10^0+n[1]*10^1+...+n[j]*10^j+...,只要用整型数组把{n[0] n[1] n[2] ...n[j]...}一一对应保存就能达到目的,本文的大整数基本运算加、减、乘、除都是采用模拟笔算的方法,易读。 2、大整数的结构分析与存储 2.1 大整数的结构分析 大整数的存储结构有链式存储方式和顺序存储方式,一是采用链表作为存储结构,这种方式可以适应不定长度的大数,这种方式的存储空间包括整数表示部分和链表指针部分,其空间利用率不高,而且其存储空间是离散的,所以随机访问效率也不高,而且频繁的堆操作和引用操作势必大量增加开销,不利于编译器优化速度;另外,根据内存管理方式的不同,顺序存储方式可以再分为静态存储方式和动态存储方式。静态存储方式数组的大小是事先已经知道的,适合知道大小的整数运算。而因其数组长度是固定不变的,在运算的时候容易造成溢出。这也是本文的很大缺点,因为大整数比较大,若每次要输入多少位都数过再动态分配内存比较麻烦。 2.2 大整数存储 数的表示必须有一个基数,b进制表示的基数为b,例如基数为b的大整数x表示为x=x[O]*b^0+x[1]*b^1 +x[2]b^3 +? ,其中O≤ x[i] b,本文我们采用b=10,即十进制来表示,数组的每个元素保存大整数的一个十进制数字,容易理解,虽然效率明显不高,也需要比较多的存储空间,但容易理解。 3.大整数的运算 3.1 两个大整数的比较 两个正整数比较,若两个的length不等时,length大的该数大,若两个的length相等,则从x[1ength]一直比到出现对应数组元素不等,大的该数大,当比到x[O]都相等,则两个数相等。代码如下: int compare(int *numa,int *numb,int lenght_a,int lenght_b) //比较大整//数的大小 大于返回1 小于返回-1 等于返回0 { int i; if (lenght_alenght_b) return 1; //比较numa,numb的位数确定返回值 else if (lenght_alenght_b) return -1; else //位数相等时的比较 { i=lenght_a; while (numa[i]==numb[i]) //逐位比较 i--; if (i==0) return 0; else if (numa[i]numb[i]) return 1; else return -1; } } 3.2 加法运算 由于大整数有正负性,所以两个数相加有四种情况a+b,a+(-b),(-a)+b,(-a)+(

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档