一种计算机处理大整数的算法

文档序号:8318928阅读:497来源:国知局
一种计算机处理大整数的算法
【技术领域】
[0001] 本发明涉及大整数计算技术,具体涉及一种计算机处理大整数的算法。
【背景技术】
[0002] 现有程序设计语言提供的整数数据类型一般最多为8字节(64位二进制整数),可 表示的非负整数范围为〇~264-1,而264-1 = 18446744073709551615只有20位十进制数 字。所以,针对更大整数的处理和计算问题,必须设计专门的软件来实现有关功能。
[0003] Windows操作系统提供的计算器可以进行32位以内十进制整数的运算。但是当运 算结果超过十进制32位时,只能用科学计数法表示,其小数部分有效数字最多为30位,不 能保证得到正确结果。
[0004] 美国Wolfram Research公司用C语言开发的数学系统软件Mathematica是一个 功能强大的计算机数学系统软件。它不但可以解决数学中的常用的加、减、乘、除、乘方、开 方、阶乘、Euclid除法等数值计算问题,而且可以自动地完成积分、多项式的因式分解等复 杂的计算工作,还可以解决符号演算问题,方便地绘出各种函数图形。
[0005] 美国PTC公司的MathCAD是类似于Mathematica的工程软件,但不如Mathematica 功能强大。它的代数运算模块可以进行整数的基本四则运算和乘方、开方,也可以解四次以 下的代数方程,但能够处理的整数范围不大。
[0006] 另外还有一款Maple软件也类似于MathCAD和Mathematica。
[0007] 这些软件都没有提供Stirling数、Catalan数等特殊数的计算能力,也不能求解 不定方程和同余方程组,不能计算一个正整数关于另外一个正整数的乘法阶和乘法逆。
[0008] 1994年美国Peter Shor提出了在世界上有重大影响的基于量子计算的大整数因 子分解算法。Shor算法成功的关键正是计算一个正整数关于另外一个正整数的乘法阶。可 见美国等西方国家也在研宄大数计算问题,并且在电子计算条件下也没有大的突破。
[0009] 国内未见提供不定方程求解、同余方程组求解和特殊数计算等功能且拥有自主知 识产权的大整数计算技术,国外相应技术也未完全提供这些功能。
[0010] 在国家军事、政治、外交、经济、商业等领域的信息安全问题中,在计算机科学、数 学等领域的科学研宄中,常常涉及或者必须考察"大"到数十位甚至上百位十进制整数的有 关计算,有时候甚至要求计算精度达到小数点后数十位甚至上百位(多位小数的有关计算 都可以化为整数的有关计算)。比如我国"两弹一星"理论设计和实际试验中有些数据要计 算到小数点后数十位。又如在军事信息安全领域中,有的地方要用到RSA、ELGamal或E⑶LP 密码算法或数字签名算法,这些算法都离不开大整数的运算,甚至涉及有关大素数的整数 运算,诸如大整数的加法、乘法、乘法阶、乘法逆、最大公约数、因子分解以及同余等问题,其 它密码算法或数字签名算法也会涉及大大整数的运算。再如军事领域很多地方要用到伪随 机数,而伪随机数一般是用伪随机序列产生或者用同余式计算得到的,这二者都离不开有 关大整数的计算。现有的大整数计算技术不能完全满足这些领域的专门需要或者在一定程 度上制约着这些领域有关课题的研宄和发展。
[0011] 故现有技术亟需发展和改进。

【发明内容】

[0012] 本发明要解决的技术问题是提供一种能够基于字符串而处理大整数的计算机算 法。
[0013] 本发明的技术解决方案是:
[0014] 一种计算机处理大整数的算法,包括以下步骤:
[0015] Sl :采用手工或从文件中输入数据到计算机中存储;
[0016] S2 :通过预处理模块对Sl中输入的数据进行预处理;
[0017] S3 :对S2中预处理后得到的数据,通过计算模块进行计算;
[0018] S4 :对S3中计算得出的结果通过结果处理模块进行处理。
[0019] Sl输入的数据采用动态分配的或者固定长度的字符串作为大整数的存储结构; 输入的数据中每一位十进制数字直接用其ASCII码存储,负整数的负号写在字符串首 位,非负整数不带负号。
[0020] 在面向对象技术编程时,可将Sl中输入的数据单独设计为数据成员。
[0021] 所述预处理模块是用来删除Sl输入数据中所有的空格和删除输入数据前面多余 的数字"〇"以及判断输入的数据是不是整数。
[0022] 所述计算模块包括基本运算模块、乘方与开方模块、阶乘与因子模块、素数模块、 最大公约数模块、特殊数模块、不定方程模块、同余式模块。
[0023] 所述计算模块在计算时不改变Sl中输入的数据。
[0024] 所述结果处理模块是用于对S3的计算结果数据的整数部分从后向前每隔一个固 定的位数就插入一个空格,对计算结果数据的小数部分从前向后每隔一个固定的位数就插 入一个空格。
[0025] 所述S4得到的数据长度应大于Sl输入数据长度的3倍。
[0026] 本发明的有益效果:
[0027] 本发明采用动态分配的或者固定长度的字符串作为大整数的存储结构,可以进行 4000位以上十进制整数的加法、减法、乘法、乘方、开平方、Euclid除法、除法和整除性测 试,除法运算可精确到小数点后1023位以上,其中开平方运算可精确到小数点后3000位以 上,乘方运算可以计算出2的13604次方、3的8583次方、5的5859次方、5的5859次方、7 的4846次方等等;可以计算1493以内十进制正整数的阶乘、4000位以上十进制正整数的 阶乘因子和最大公约数、2000位以上十进制正整数的最小公倍数;可以计算参数在2506以 内的二项式系数、参数在458以内的Stirling数和参数在1254以内的Catalan数;可以计 算斐波那契数到19598项以内;可以求解系数在十进制2000位以上的二元一次、三元一次 不定方程和系数在十进制16位以内的一元二次方程;可以计算十进制2000位以内正整数 的乘法逆,求解系数在十进制2000位以内的一次同余方程和方程组;可以成功地对16位以 内的十进制正整数进行素性判定和因子分解。一元二次方程、素性判定和因子分解等问题 的计算复杂性高,速度一般较慢,因此这里对其范围限制得很小。
【附图说明】
[0028] 图1为本发明步骤方框图;
[0029] 图2是本发明主界面图;
[0030] 图3是"基本运算"菜单;
[0031] 图4是"乘方与开方"菜单;
[0032] 图5是"阶乘与因子"菜单;
[0033] 图6是"素数"菜单;
[0034] 图7是"最大公约数"菜单;
[0035] 图8是"特殊数"菜单;
[0036] 图9是"不定方程"菜单;
[0037] 图10是"同余式"菜单。
[0038] 图11是一个111位正整数与一个123位正整数乘法的计算实例;
[0039] 图12是图11中两个整数除法的计算实例,精确到小数点后1023位;
[0040] 图13是上述两个整数Euclid除法的计算实例;
[0041] 图14是2的13604次方的计算实例,计算结果有4096位;
[0042] 图15是1234567890987654321的因子分解的计算实例,分解结果为 1234567890987654321 = 32X7X19X928163X1111211111 其中 928163 和 1111211111 都 是素数;
[0043] 图16是30位数123456789098765432101234567890的平方根的计算实例,精确到 小数点后3000位;
[0044] 图17是1493 !的计算实例,计算结果有4093位,末尾有370个0 ;
[0045] 图18是14位数42949672971917的最小素因子的计算实例,计算结果表明 42949672971917 是一个素数;
[0046] 图19是计算图11中两个整数最大公约数的计算实例,计算结果表明那两个数是 互素的;
[0047] 图20是计算图11中两个整数最小公倍数的计算实例,可以用乘法验证这个结 果;
[0048] 图21是二项式系数的计算实例,计算结果有753位;
[0049] 图22是第19598个斐波那契数的计算实例,计算结果有4096位;
[0050] 图23是第一类Stirling数s (458, 234)的计算实例,计算结果有656位;
[0051] 图24是第二类Stirling数S (458, 234)的计算实例,计算结果有612位;
[0052] 图25是Catalan数h (1254)的计算实例,计算结果有749位;
[0053] 图26是求解以图11中两个整数为系数、常数项为1的二元一次不定方程的计算 实例;
[0054] 图27是求解二元一次不定方程
[0055] 42949672971917x+1234567890987654321y = 123456789 的计算实例;
[0056] 图28是求解三元一次不定方程
[0057] 42949672971917x+1234567890987654321y+1111211111z = 123456789 的计算实 例;
[0058] 图29是求解一元二次方程
[0059] 1234567890x2+5432112345x+9876543210 = 0 的计算实例;
[0060] 图30是乘法逆的计算实例;
[0061] 图31是一元一次同余方程的计算实例;
[0062] 图32是一元一次同余方程组的计算实例。
【具体实施方式】 [0063] 实施例:
[0064] 一种计算机处理大整数的算法,其特征在于,包括以下步骤:
[0065] Sl :采用手工或从文件中输入数据到计算机中存储;
[0066] S2 :通过预处理模块对Sl中输入的数据进行预处理;
[0067] S3 :对S2中预处理后得到的数据,通过计算模块进行计算;
[0068] S4 :对S3中计算得出的结果通过结果处理模块进行处理。
[0069] Sl输入的数据采用动态分配的或者固定长度的字符串作为大整数的存储结构; 输入的数据中每一位十进制数字直接用其ASCII码存储,负整数的负号写在字符串首 位,非负整数不带负号。按照以上技术方案如手写整数一样自然,从而回避对各种编程语言 现有整型数据类型进行扩展的困难。
[0070] 在面向对象技术编程时,可将Sl中输入的数据单独设计为数据成员。
[0071] 所述预处理模块是用来删除Sl输入数据中所有的空格和删除输入数据前面多余 的数字"〇"以及判断输入的数据是不是整数。
[0072] 1.设输入字符串是STR。下面算法删除STR中的所有空格:
[0073] (1)令字符型指针变量p指向STR[0],字符型指针变量q指向R[0]。
[0074] (2)判断:若 p[0] ='\0',则令 q[0] ='\0',结束。
[0075] (3)判断:若p [0]辛"(空格),则转向第(5)步。
[0
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1