GMP如何以任意数量的字节存储其整数?

时间:2010-07-13 23:11:19

标签: c++ c assembly bignum gmp

2 ^ 64距离我的内存/硬盘驱动器无法处理的“无限远”...

首先,我想知道GMP如何与内存/处理器配合使用,因为它可以进行某种阴暗的优化......

我还想知道是否有一种方法可以在任意数量的字节上存储整数(无符号,更容易)。例如,在50个字节上,我的上限为2 ^ 400 -1。 要做的是使用携带以保持数字从一个字节到另一个字节保持一致,我对此有一些了解,但我真的不确定它是最快的方法。我甚至不确定我是不对。

我猜GMP使用这种方式存储其数据,但我只想要一些(甚至很少)解释或某些理论转发(我没有任何博士学位,所以不要太难)

1 个答案:

答案 0 :(得分:19)

GMP动态分配空间来表示数字(并在需要增长时重新分配)。

Integer Internals, in the GMP manual中详细描述了这一点,它描述了如何将表示形式分组为“肢体”并将肢体存储在数组中。

术语“肢体”的描述来自GMP Basics: Nomenclature and Types

  

肢体是指适合单个单词的多精度数字的一部分。 (我们之所以选择这个词,是因为人体的肢体类似于数字,只是更大,并且包含几个数字。)通常肢体包含32或64位。肢体的C数据类型是mp_limb_t。

因此,在GMP中表示一个数字的工作原理是将多个肢体组合在一起以表示整数的大小,并用符号位存储(符号位用于存储肢数)。

这对你意味着什么?好吧,通常int64用64位表示。完成。如果将一堆这些包装在一起,则可以显着增加它。将两个放在一起,2 ^ 64 * 2 ^ 64或2 ^ 128。添加两个肢体,你得到2 ^ 256。这是很多数字,存储在4个单词中(加上表示开销)。

当然,浮点数的表示更复杂(see here),使用尾数(由符号和幅度组成)和指数存储表示。