我有一个关于 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 < 3 时用于 GCD。
对于大于 GCD_DC_THRESHOLD 的输入,通过 HGCD(Half GCD)函数计算 GCD,作为对 Lehmer 算法的推广。
所以,我想至少有三种不同的方法可以得到 gcd(a, b)。我的主要问题:我想自己指定使用哪种算法。我将比较这些算法在随机大输入(即 10^5 位)上的执行时间,以找出一些常见趋势:使用“二进制 GCD”变得比“Lehmer 方法”更差的点是“HGCD-Lehmer”泛化”确实比直接的 Lehmer 等要好。
有没有简单的方法来指定您要使用的算法?从库中提取此算法的任何方式,修改某些“#define”变量的任何方式。是否可以在不重新编译库的情况下做我想做的事情?我只是那里的初学者,我觉得无法弄清楚图书馆里的所有东西。
PS 可能有人会对此感兴趣。我在 github 上有一些代码:https ://github.com/int000h/gcd_gcc