Исходный код C для этой функции можно найти здесь , в GMPy_MPZ_Function_Divm
. Как видите, на самом деле это не взаимно-однозначное сопоставление с базовым кодом C, но когда вы убираете все элементы подсчета ссылок Python, это выглядит довольно просто c:
// 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
для divm(a, b, m)
, конечно, предполагая, что это выражение допустимо (например, b
не равно нулю).