我想知道什么是大数字,以及用于处理它们的一些常用算法。我在Work的编码器中听到过这个词,在一次采访中,有人提出要创建一个图书馆来处理大数据。大数字,常用算法?
2
A
回答
4
大数字通常是全精度整数或小数,而不是浮点数(它也可以存储非常大的数字,但精度非常有限)。它们主要用于密码学。以RSA密钥为例:那些是1024或2048位(大约300或600位十进制数)的整数。他们需要很长时间才能使用强力计算来破解加密,这是不可行的。
什么库需要提供是支撑存储这些号码并对其执行计算(例如加法,乘法,整数除法与其余部分)
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;
}
相关: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