|
转载此文仅作参考,并不表示追风同意该文全部观点
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); |
|