Понимание mpz_invert

Я довольно плохо знаком с арифметикой множественной точности, и после нескольких дней попыток выяснить это, я в растерянности. Я пытаюсь перевести обратное число в большое количество мест deciaml и пытаюсь понять, как это сделать, используя GMP или пакет mpz/mpf. однако я немного растерялся в понимании примера из этой ссылки:

http://sepwww.stanford.edu/sep/claudio/Research/Prst_ExpRefl/ShtPSPI/intel/mkl/10.0.3.020/examples/gmp/source/mpz_invert_example.c

/* 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?

Другие вопросы по тегам