我有一个关于gnu-mp的问题,你能帮我怎么做吗?
我在Windows上使用“GNU多精度算术库”5.1.1版。
(明威\GCC+MSYS)
存在计算两个整数的“GCD”的MPZGCD函数。

void mpz_gcd (mpz_t rop, mpz_t op1, mpz_t op2);

据我从文献中了解到,gnu mp中有一些算法是用来计算最大公约数的。其中:
二进制GCD
lehmer算法
次二次gcd
使用的算法似乎是根据整数的输入大小自动选择的。
目前,二进制算法仅在n对于大于GCD_DC_阈值的输入,通过HGCD(半GCD)函数计算GCD
作为Lehmer算法的推广。
所以,我想至少有三种不同的方法得到gcd(a,b)。
对我来说主要的问题是:我想指定自己使用哪种算法。
我将比较这些算法在随机大输入(即10^5位)上的执行时间,找出一些共同的趋势:使用“二进制gcd”变得比“lehmer方法”差的地方是什么,“hgcd-lehmer泛化”确实比直接的lehmer好,等等。
有没有什么简单的方法来指定要使用的算法?从库中提取此算法的任何方法,修改某些“define”变量的任何方法。在不重新编译库的情况下,是否可以做一些我想做的事情我只是一个初学者,我觉得在图书馆里找不到所有的东西。
可能有人会感兴趣的。
我在github上有一些代码:https://github.com/int000h/gcd_gcc

最佳答案

现在是阅读源代码的好时机GMP是开源的,好好利用它吧!
mpn/generic/gcd.c中,您将找到选择gcd算法的函数(这实际上是一个公共函数,它出现在文档中):

mp_size_t
mpn_gcd (mp_ptr gp, mp_ptr up, mp_size_t usize, mp_ptr vp, mp_size_t n)
{
    ...
    if (ABOVE_THRESHOLD (n, GCD_DC_THRESHOLD)) {
        ...

您可以看到函数有三个主要分支,每个分支都以return语句结尾每个分支对应一个不同的gcd算法。您可以将代码复制并粘贴到自己的应用程序中,并对其进行修改,以便可以准确地指定所需的算法提示:
你可以去掉#ifdefs假设未定义TUNE_GCD_P
这是一个mpn_*函数,而不是mpz_*函数。它是低级的:例如,您必须显式地为输出分配空间您可能还希望从更高级别的函数mpz_gcd()复制代码。
您需要提取内部函数的原型,比如mpn_hgcd_matrix_adjust()把原型从gmp源代码中复制出来。别担心,内部函数似乎是从共享库中导出的(它们通常不应该是,但它们是,所以您很好)。
不需要重新编译库,但您需要在这里做一点工作。

08-16 21:16