【问题标题】:GCD computation issues with GNU MP LibraryGNU MP 库的 GCD 计算问题
【发布时间】:2013-02-20 00:43:03
【问题描述】:

我有一个关于 GNU MP 的问题,请您帮我解决一下。 我在 Windows 上使用“GNU 多精度算术库”5.1.1 版。 (MinGW\gcc + MSYS)

存在一个 mpz_gcd 函数来计算两个整数的“gcd”。

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

据我从文档中获得的,在 GNU MP 中实现了几种算法,用于计算最大公约数。其中:

  • 二进制 GCD
  • Lehmer 算法
  • 次二次 GCD

使用的算法似乎是根据输入的整数大小自动选择的。

目前,二进制算法仅在 N

对于大于 GCD_DC_THRESHOLD 的输入,通过 HGCD(Half GCD)函数计算 GCD 作为对 Lehmer 算法的推广。

所以,我想至少有三种不同的方法可以得到 gcd(a, b)。 我的主要问题:我想自己指定使用哪种算法。 我将比较这些算法在随机大输入(即 10^5 位)上的执行时间,以找出一些常见趋势:使用“二进制 GCD”比“Lehmer 方法”更差的点是“HGCD-Lehmer”泛化”确实比直接的 Lehmer 等要好。

有没有简单的方法来指定你想使用的算法?从库中提取此算法的任何方式,修改某些“#define”变量的任何方式。是否可以在不重新编译库的情况下做我想做的事情?我只是那里的初学者,我觉得无法弄清楚图书馆里的所有东西。

附:可能有人会对此感兴趣。 我在 github 上有一些代码:https://github.com/int000h/gcd_gcc

【问题讨论】:

    标签: c algorithm gmp greatest-common-divisor


    【解决方案1】:

    现在是阅读源代码的好时机。 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 源代码中复制原型即可。别担心,内部函数似乎是从共享库中导出的(它们通常不应该是,但它们是,所以你很好)。

    无需重新编译库,但您需要在这里做一些工作。

    【讨论】:

    • 我已经尝试过调查。我只是立即感到困惑,为什么这个定义放在“mpn/”而不是“mpz/”和许多其他东西下。至少现在我知道这是可能的,所以我会继续寻找。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多