我对多精度算法相当陌生,在尝试了几天之后,我不知所措。我试着把一个数字的倒数转换成一个很高的小数位数,并且一直在尝试使用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