找回密码
 欢迎注册
查看: 15361|回复: 15

[转载] 大数运算需要解决的问题

[复制链接]
发表于 2008-7-5 21:08:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
转载此文仅作参考,并不表示追风同意该文全部观点

http://blog.icxo.com/read.jsp?aid=32454&uid=9169

本文适合那些正在或者将要进行大数运算的读者,对于其他读者,意义不大,大可就此打住。

       如果你想要编程序自己实现一套大数运算,通过本文你将了解这一过程中你都需要做些什么;如果你正在使用某一第三方提供的大数运算,也可以通过本文更深入的了解其体系结构。

     这里的大数,指的是超过计算机CPU寄存器表达的数,即超过计算机字长的数。大数运算主要指的是对大数进行数论运算,如加、减、乘、除。出于效率原因,一般的大数运算主要指对无符号类型的数进行数论计算。

     为使用计算机解决大数运算,需要巧妙的做一些安排,以使得运算过程中效率最优、表达简单、转换便捷。下面逐条介绍大数运算需要解决的问题。

一.大数表达


    >大数在计算机中的表示,包括存储方式和存储顺序。
              A :{ 0,1,2...};


二.大数基本运算


     >大数加法。
             w = u + v;
     >大数增量。
             w = u + 1;        
     >大数减法。
             w = u - v;
     >大数减量。
             w = u - 1;        
     >大数乘法。
             w = u * v;
     >大数乘方(含平方)。
             w = u * u ... * u;        
     >大数除法。
             q = u / v;
     >带余大数除法。
             q = u / v ... r;

三.模算术


     >大数模计算。
             r = u mod m;
     >大数模加法。
             r = (u + v) mod m;
     >大数模减法。
             r = (u - v) mod m;
     >大数模乘计算。
             r = (u * v) mod m;
     >大数模乘方。
             r = (u * u * ... * u) mod m;
     >大数模逆。
             r = (u ^ -1) mod m;

四.位运算


     >大数位置0,1。
             w = setbit(u,pos,(0,1));
     >大数位测试。
             bool = testbit(u,pos,(0,1));
     >大数位与。
             w = u and v;
     >大数位或。
             w = u or v;
     >大数位异或。
             w = u xor v;
     >大数左位移。
             w = shl(u,n);
     >大数右位移。
             w = shr(u,n);


五.数论运算


     >大数完全平方检验。
              bool = issql(u);
     >大数开方。
             w = u root v;
     >大数最大公约数。
             w = gcd(u,v);
     >大数最小公倍数。
             w = lcm(u,v);
     >大数素性检验。
              bool = isprime(u);
     >大数素数产生。
              u,v < prime();

六.伪随机数


     >大数随机数初始化。
              initrand(seed);
     >大数随机数产生。
              u = rand(seed);


七.比较


     >大数比较。
             bool = compare(u,v);
     >大数是否是0。
             bool = IsZero(u);


八.赋值


     >大数赋值。
             w = u;
     >大数补码运算。
             w = neg(u);


九.IO


     >大数转换ASCII码。
             w = itoa(u,base);
     >ASCII码转换大数。
             u = atoi(w,base);
     >大数打印。
             print(u);
     >大数输入。
             u = scanf();

十.大数应用

    >大数RSA算法。
             w = rsa(u,v,m);
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-6 13:06:09 | 显示全部楼层
 以前曾看过该文。该文主要是讨论接口的,对算法没有深入,因此也就没再关注它。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-27 14:17:09 | 显示全部楼层
文章在哪
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-27 16:29:24 | 显示全部楼层
无心人已经转载了,内容差不多了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-28 11:28:01 | 显示全部楼层
大数运算中不应强求非要实现“RSA算法”的应用。
如果提供的算法函数模块够丰富,要实现某一具体加解密算法是很简单的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-28 15:34:16 | 显示全部楼层
因为RSA是个经典的应用实例,弄个例子也不错
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-28 18:29:57 | 显示全部楼层
可惜只是罗列了问题,
却没有给出每个问题的具体实现
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-11-18 22:32:53 | 显示全部楼层
关于如何写一个大数库,有很多开源的思想和代码,我比较欣赏的是Tom St Denis(及其团队)弄的个
数据加密的开源站,为了支撑这个Crypt项目,又扩展了对大数库的开发,我仔细的看过其代码和算法思想,并且在学习的过程中一个一个的敲了下来,感受很深。对大数库的编写有了一个详细的了解和全局的把握。
值得注意的是Tom St Denis写了一本关于这个库的书:《BigNum Math: Implementing Cryptographic Multiple Precision Arithmetic 》我看的是中文版,《BigNum Math:加密多精度算法的理论与实现》当你看完此书,一个大数库就实现了。像RSA公钥算法并不属于大数库的范畴,但大数库中的基本的数论算法是RSA必要的组成部分。

其开源站为:http://libtom.org/ 对于开源加免费,Tom St Denis的回答,我表示感触很深。
他说:“我有这个能力,并且我愿意”。

写的很好,好东西要分享,呵呵....Good Luck!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-11-19 10:20:34 | 显示全部楼层
Mark, 有时间好好读一下
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-11-30 16:59:50 | 显示全部楼层
我上个月在学校图书馆就看到了这本书,那本书选择了libtom作为教学,而没有选择GMP,说是因为libtom的代码是平台无关的,而GMP的代码有太多的平台相关的if控制语句。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-24 20:47 , Processed in 0.046457 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表