【发布时间】: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