我对GNU MP有疑问,请你帮我解决一下这个问题。 我在Windows上使用“GNU Multiple Precision Arithmetic Library”Edition 5.1.1。 (MinGW \ gcc + MSYS)
存在一个mpz_gcd函数来计算两个整数的“gcd”。
void mpz_gcd (mpz_t rop, mpz_t op1, mpz_t op2);
据我所知,在GNU MP中实现了几种用于计算最大公约数的算法。其中:
使用的算法似乎是根据整数的输入大小自动选择的。
目前,二进制算法仅在N <1时用于GCD。 3。
对于大于GCD_DC_THRESHOLD的输入,GCD通过HGCD(半GCD)函数计算 作为Lehmer算法的推广。
所以,我猜至少有三种不同的方法来获得gcd(a,b)。 对我来说主要问题是:我想指定自己使用哪种算法。 我会在随机大输入(即10 ^ 5位)上比较这些算法的时间执行情况,以找出一些常见趋势:使用“二进制GCD”变得比“Lehmer方法”更差的那一点是“HGCD-Lehmer”概括“真的比简单的Lehmer等好。
有没有简单的方法来指定您想要使用的算法?任何方法从库中提取此算法,任何方式来修改一些“#define”变量。是否可以在没有库重新编译的情况下执行我想要的操作?我只是初学者,我觉得无法弄清楚图书馆里面的各种事情。
P.S。可能有人会对这会产生什么感兴趣。 我在github上有一些代码:https://github.com/int000h/gcd_gcc
答案 0 :(得分:5)
这是阅读源代码的好时机。 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源代码即可。别担心,内部函数似乎是从共享库中导出的(它们通常不应该是,但它们都是,所以你很好)。
无需重新编译库,但您需要在此处进行一些工作。