我对多精度算法相当陌生,在尝试了几天之后,我不知所措。我试着把一个数字的倒数转换成一个很高的小数位数,并且一直在尝试使用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中复制了这个示例compiled并运行,得到了正确的输出:
/* rop =  2288                                                       */
/* n = 1

但是我不明白2288是什么?即计算op1模与op2模的逆并将结果放入rop
有人能解释一下这个号码是怎么获得的吗?
或者举个简单的例子:
1875^-6年
或w.r.t以下链接:
How does one calculate 2 ^ -18 using GMP?
拿:
1/(1875^6)
任何帮助都将不胜感激!

最佳答案

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

10-08 18:42