如何使用GMP

时间:2018-12-26 14:30:45

标签: c++ performance gmp bignum

我想对约2048位带符号整数做x = a + b + c。目前我的代码看起来像

mpz_add(x, a, b);
mpz_add(x, x, c);

是否只有一个函数可以执行此操作?这在我的应用程序中发生了很多次。我已经分析了我的代码,并且三向添加步骤占用了运行时的大部分时间。如果有另一种方法可以在一次通过中这样做可能会有所帮助。

2 个答案:

答案 0 :(得分:0)

我已经广泛使用了MPFR,并且阅读了文档的几乎每个部分。我几乎可以肯定,MPFR中没有这样的东西,因此,我几乎可以肯定,GMP中没有这样的东西。

一种解决方案可能是切换到MPFR并使用Pavel Holoborodko's MPFR C++,这会添加MPFR功能的运算符。我无法想象这将有助于提高性能(尽管可能不会对其产生太大影响),它在GPL之下,并且您必须安装另一个库,但是它将结合操作。

我不知道有什么快速算法可以在添加三个数字时不仅仅添加两个,然后在幕后添加最后一个数字。我认为使用任何语言的任何库将这两个操作组合为一个操作都不会提高性能。即使使用GNU MP,精确度也很慢。如果有帮助,我可以在Code Review上比较速度here

答案 1 :(得分:0)

调用两次函数不会产生明显的开销。但是,如果需要,x的重新分配可能会非常缓慢。为避免这种情况,可以测量a,b和c的大小,并确保x分配了三个数字加2的最大大小(在最坏的情况下为1位)。您可以使用

mpz_init2(x, maxsize+2);

或者,如果x已经初始化,

if (mpz_sizeinbase(x, 2) < maxsize+2)
  mpz_realloc2(x, maxsize+2);