2016-07-02 9 views
0

im довольно новый для множественной арифметики точности, и через несколько дней пытается понять это из-за недостатка. im, пытаясь сделать обратное число к большому количеству мест принятия решений и пытались выяснить, как это сделать, используя GMP или пакет mpz/mpf. Однако я немного потерял с пониманием пример по этой ссылке:Понимание mpz_invert

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); 

Я дублируется этот пример в моем язя выполнил и бегать и им получать правильный выход:

/* rop = 2288              */ 
/* n = 1 

Однако я не понимаю, что такое 2288? то есть вычислить обратное значение op1 по модулю op2 и поместить результат в rop

может ли кто-нибудь объяснить, как это число получается?

или простой пример, чтобы сказать, взяв:

1875^-6

или WRT по следующей ссылке: How does one calculate 2^-18 using GMP?

взятие:

1/(1875^6)

Любая помощь будет высоко оценена!

+0

Используйте 'mpf_ui_div'. –

ответ

3

mpz_invert предназначен для расчета очень специфического значения modular multiplicative inverse of 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 
+0

Спасибо, Джек за ответ. однако я не понимаю, чего пытается достичь этот пример? мы пытаемся найти обратное значение 12682271391376756984 или модульное обратное? то есть о том, как найти инверсию 12682271391376756984 и представить это как поплавок? –

+0

, поэтому я догадываюсь, что вопрос тогда станет тем, как я могу взять инверсию 12682271391376756984 и представить ее как float с точностью до 16d.p. ? –

+0

Вы получаете модульную инверсию. Насколько мне известно, арифметика и поплавки с произвольной точностью (которые ограничены точностью) не работают хорошо вместе ... –

0

ИТАК после некоторой консультации по математике д & кажется, что вычисление Modular мультипликативный обратный будет бесполезен для меня.

Проблема в том, как вычислить инверсию большого целого числа на> 16 d.p. в C? w.r.t приведенном выше примере, как я вычислить 1/12682271391376756984 для значения:

4,263162382267667173889615631246062574813592315276851 × 10^-16

, которые могут быть представлены в расширенном формате поплавка?

 Смежные вопросы

  • Нет связанных вопросов^_^