在Python的gmpy2扩展模块中,有一个名为mpz的多精度整数类型。它包含一个powmod(x, y, m)
函数,我在Ruby中一直缺少这个函数。我最近意识到Ruby实际上有一个powmod
。它隐藏在OpenSSL模块中。
require 'openssl'
result = a_big_int.to_bn.mod_exp(exponent, modulo)
另一个功能,也是在gmpy2中,我一直缺少的是divm(...)
。
divm(a,b,m)返回x,使得b * x == a modulo m。如果不存在这样的值x,则引发ZeroDivisionError异常。
你知道OpenSSL模块是否还有另外一个惊喜或任何具有这种功能的宝石吗?如果它是一个快速的将是非常有帮助的。
答案 0 :(得分:1)
快速浏览GMP中divm(a, b, m)
的代码,表明它基本上是这样做的
b -1 * a%m
其中b -1 是模乘法逆。当反转调用失败时有一些回退逻辑(当发生这种情况时我不清楚),但是对于大多数目的,你可以在Ruby中这样做(使用与divm
方法签名相同的变量名称):
b.to_bn.mod_inverse(m).mod_mul(a, m).to_i
答案 1 :(得分:0)
我不确定这些在Ruby或Python中的可访问性如何。
它包含
powmod(x, y, m)
...
int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
const BIGNUM *m, BN_CTX *ctx);
divm(a, b, m)
...
int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a,
const BIGNUM *d, BN_CTX *ctx);
您可以在OpenSSL bn(3)找到完整的文档。