Понимание mpz_invert
Я довольно плохо знаком с арифметикой множественной точности, и после нескольких дней попыток выяснить это, я в растерянности. Я пытаюсь перевести обратное число в большое количество мест deciaml и пытаюсь понять, как это сделать, используя GMP или пакет mpz/mpf. однако я немного растерялся в понимании примера из этой ссылки:
/* to compute the inverse of op1 modulo op2 and put result in rop */
/* p*x = s*n + 1 ( rop = p, op1 = x, op2 = n ) */
/* */
n = mpz_invert ( rop, op1, op2 );
Я продублировал этот пример в моем ide, соблюдается и выполняется, и я получаю правильный вывод:
/* rop = 2288 */
/* n = 1
Однако я не понимаю, что такое 2288? то есть вычислить обратное значение op1 по модулю op2 и поместить результат в rop
Кто-нибудь может объяснить, как получается это число?
или простой пример, чтобы сказать:
1875 ^ -6
или по следующей ссылке: Как рассчитать 2 ^ -18, используя GMP?
принимая:
1 / (1875 ^ 6)
Любая помощь приветствуется!
2 ответа
mpz_invert
используется для вычисления очень конкретного значения, которое является модульным мультипликативным обратным a mod b
,
В принципе rop
целое число такое, что op1*rop ≡ 1 (mod op2)
что подразумевает, что (op1*rop - 1) mod op2 = 0
,
На самом деле это так, с
op1 = 12682271391376756984
op2 = 3527
rop = 2288
op1 * rop = 29017036943470019979392
(op1 * rop - 1) mod op2 = 29017036943470019979391 % 3527 = 0
Итак, после некоторой консультации по математике, вопросы и ответы, похоже, что вычисление модульного мультипликативного обратного мне не пригодится.
Тогда проблема в том, как рассчитать обратное значение большого целого числа к>16 dp в C? В приведенном выше примере, как рассчитать 1/12682271391376756984 для значения:
4.263162382267667173889615631246062574813592315276851 × 10 ^ -16
что можно представить в расширенном формате float?