大数,常用算法?

时间:2010-01-15 12:58:11

标签: algorithm biginteger

我想知道大数字是什么,以及用于处理它们的常用算法是什么。我听到了Coders at Work中提到的这个术语,在一次采访中有一个人要求创建一个图书馆来处理大数据。

3 个答案:

答案 0 :(得分:4)

大数字通常是全精度整数或小数,而不是浮点数(也可以存储非常大的数字,但精度非常有限)。它们主要用于密码学。以RSA密钥为例:这些是1024或2048位(大约300或600位十进制数字)的整数。他们需要很长时间才能使用强力计算来破解加密是不可行的。

库需要提供的是支持存储这些数字并对它们进行计算(例如加法,乘法,整数除法)

答案 1 :(得分:2)

有像gmp这样的bignum库 - 有些提供任意精度(......就像你的内存可以处理的那样),有些只有极其荒谬的限制 - 256字节基数,256字节尾数的浮点变量。

这些方法与FPU的正常软件仿真非常相似,只是为每次计算迭代更多字节的数据,操作类似于您在纸上计算它的方式。如果你有256字节的整数,它可以被视为普通的25​​6 base256位数......

简单的256字节整数加法(完全未经优化......数字应保持长度等)

unsigned char x[256];
unsigned char y[256];
unsigned char sum[256];
int overflow=0,tmp;
for(unsigned char i=0;i<256;i++)
{
  tmp = x[i] + y[i] + ovr;
  sum[i] = tmp % 256;
  overflow = tmp / 256;
}

答案 2 :(得分:1)

这些是具有可变位长的数字,与具有预定义大小的数字不同(例如,4位整数类型)。

使用大数字的快速C ++库的示例是NTL,也特别用于数论和加密应用程序。另一个众所周知的工具是unix bc计算器,它默认使用无限精度。像Haskell这样的函数语言也使用这种类型的数字。

用于处理大量算术的方法示例是Karatsuba algorithm用于乘法。在NTL的文档中,如果您感兴趣,可以找到更多;)