2010-01-15 39 views
2

我想知道什么是大数字,以及用于处理它们的一些常用算法。我在Work的编码器中听到过这个词,在一次采访中,有人提出要创建一个图书馆来处理大数据。大数字,常用算法?

+0

相关:http://stackoverflow.com/questions/1653131/what-programming-language-will-enable-me-to-enter-a-very-long-number-without-conv/ – jldupont 2010-01-15 13:00:56

回答

4

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

什么库需要提供是支撑存储这些号码并对其执行计算(例如加法,乘法,整数除法与其余部分)

+0

啊,谢谢。全精度和浮点数之间有什么区别? – cam 2010-01-15 13:10:56

+0

浮点数也有预定义的存储大小,如4或8个字节,其中包含有效数字,全精度意味着真正的无限大小。 – 2010-01-15 13:13:29

+0

本质上,全精度有理R是两个元素N和M之比N/M。这仍然不允许你表示无理数,如e,pi和sqrt(2),但是可以任意接近。 – Vatine 2010-01-18 20:01:44

1

这些是与比特长度可变数字,不同于预定大小的数字(例如4位整数类型)。

使用大数字的快速C++库的一个例子是NTL,它也特别用于数论和密码学应用。另一个着名的工具是unix bc计算器,默认情况下工作的精度不受限制。 Haskell等一些功能语言也使用这种类型的数字。

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

2

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

这些方法与FPU的正常软件仿真非常相似,只是为每个计算迭代更多字节的数据,类似于如何在纸上计算它的操作。如果你有256个字节的整数,它可以被当作一个正常的256个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; 
}