是否有与 python gmpy2 库 divm(...) 函数相同的 c++ gmp 库函数?
Is there a c++ gmp library function that does the same as the python gmpy2 library divm(...) function?
正如标题所说,我正在尝试在 C++ gmp 库中找到一个与 gmpy2 python 库的 divm(...) 函数功能相同的函数。
我无法想象 gmpy2 有这个方法,而 gmp C++ 库没有任何东西可以做同样的计算。
如果这不存在,我将不胜感激关于从头开始制作 divm 函数的任何建议(仍然必须使用 gmp,因为我正在通过 mpz_class 使用大于标准整数的值)。
谢谢!
可以在 GMPy_MPZ_Function_Divm
中找到该函数的 C 源代码 here。如您所见,它并不是真正一对一地映射到底层 C 代码,但是,当您剥离所有 Python 引用计数内容时,它看起来非常基本:
// numz, denz, and modz are copies of the arguments.
// resz, gcdz ar temporaries.
if (mpz_invert(resz, denz, modz)) { // inverse exists?
ok = 1;
} else { // num, den AND mod have a gcd > 1?
mpz_init(gcdz);
mpz_gcd(gcdz, numz, denz);
mpz_gcd(gcdz, gcdz, modz);
mpz_divexact(numz, numz, gcdz);
mpz_divexact(denz, denz, gcdz);
mpz_divexact(modz, modz, gcdz);
mpz_clear(gcdz);
ok = mpz_invert(resz, denz, modz);
}
if (ok) {
mpz_mul(resz, resz, numz);
mpz_mod(resz, resz, modz);
mpz_clear(numz);
mpz_clear(denz);
mpz_clear(modz);
return resz;
} else {
mpz_clear(numz);
mpz_clear(denz);
mpz_clear(modz);
return NULL;
}
在数学上,它只是计算表达式 b<sup>-1</sup> * a % m
for divm(a, b, m)
,当然假设该表达式是有效的(例如,b
是非零的)。
正如标题所说,我正在尝试在 C++ gmp 库中找到一个与 gmpy2 python 库的 divm(...) 函数功能相同的函数。
我无法想象 gmpy2 有这个方法,而 gmp C++ 库没有任何东西可以做同样的计算。
如果这不存在,我将不胜感激关于从头开始制作 divm 函数的任何建议(仍然必须使用 gmp,因为我正在通过 mpz_class 使用大于标准整数的值)。
谢谢!
可以在 GMPy_MPZ_Function_Divm
中找到该函数的 C 源代码 here。如您所见,它并不是真正一对一地映射到底层 C 代码,但是,当您剥离所有 Python 引用计数内容时,它看起来非常基本:
// numz, denz, and modz are copies of the arguments.
// resz, gcdz ar temporaries.
if (mpz_invert(resz, denz, modz)) { // inverse exists?
ok = 1;
} else { // num, den AND mod have a gcd > 1?
mpz_init(gcdz);
mpz_gcd(gcdz, numz, denz);
mpz_gcd(gcdz, gcdz, modz);
mpz_divexact(numz, numz, gcdz);
mpz_divexact(denz, denz, gcdz);
mpz_divexact(modz, modz, gcdz);
mpz_clear(gcdz);
ok = mpz_invert(resz, denz, modz);
}
if (ok) {
mpz_mul(resz, resz, numz);
mpz_mod(resz, resz, modz);
mpz_clear(numz);
mpz_clear(denz);
mpz_clear(modz);
return resz;
} else {
mpz_clear(numz);
mpz_clear(denz);
mpz_clear(modz);
return NULL;
}
在数学上,它只是计算表达式 b<sup>-1</sup> * a % m
for divm(a, b, m)
,当然假设该表达式是有效的(例如,b
是非零的)。