openssl软件包实现了一个bignum类,具有执行任意大小整数计算的相应算术和比较方法。
在密码学中,模幂x^p %% m
是一种常见的特殊情况,例如RSA。对于大的p
,计算x^p
是不可行的,但可以高效地计算x^p %% m
,OpenSSL在BN_mod_exp()
中实现了这一点。
R是否提供任何机制来实现^.bignum
和%%.bignum
方法,以便在评估x^y %% z
时,我们可以调用这个特殊情况,而不是实际计算x^p
?
openssl软件包实现了一个bignum类,具有执行任意大小整数计算的相应算术和比较方法。
在密码学中,模幂x^p %% m
是一种常见的特殊情况,例如RSA。对于大的p
,计算x^p
是不可行的,但可以高效地计算x^p %% m
,OpenSSL在BN_mod_exp()
中实现了这一点。
R是否提供任何机制来实现^.bignum
和%%.bignum
方法,以便在评估x^y %% z
时,我们可以调用这个特殊情况,而不是实际计算x^p
?
^.bignum
运算符,使其返回一个代理对象,表示“指数运算”,而不是立即计算结果。此代理对象具有特殊覆盖的%%
方法,该方法调用ExpMod实现(例如BM_mod_exp
)。它还定义了一种方法,通过计算实际的x ^ y
操作将其强制转换为bignum
。# Vectorisation left as an exercise for the reader.
`^.bignum` = function (x, y)
structure(c(x, y), class = 'bignum_mod_exp_proxy')
eval_exp = function (x)
call_actual_exp(x[1], x[2])
as.bignum = function (x)
if (inherits(x, 'bignum_mod_exp_proxy'))
eval_exp(x)
else
# … implement other coercions to bignum, e.g. from `numeric`.
`%%.bignum_mod_exp_proxy` = function (x, y)
call_BN_mod_exp(x[1], x[2], y)
# Pretend that a `bignum_mod_exp_proxy` in all other contexts. E.g.:
print.bignum_mod_exp_proxy = function (x, ...)
print(eval_exp(x))
# … etc., for the rest of the `bignum` operations.
=.bignum_mod_exp_proxy
、<-.bignum_mod_exp_proxy
和assign.bignum_mod_exp_proxy
(将assign
转换为S3通用函数),以便将赋值z = x ^ y
急切地评估为bignum
。但是,这可能过于复杂,并且会为每个赋值产生开销。
^
和%%
方法,这样x^y %% z
就能使用例如powm(x,y,z)
而不是mod(pow(x,y),z)
。 - Jeroen Ooms?Ops
。它们是通用的,因此如果您所需的调用未定义这些运算符,则添加特定于类的S3或S4方法不应该很困难。 - IRTFMx OP1 y OP2 z
应该被解释为F(x,y,z)
... - Ben Bolkerx OP1 y
返回所需调度的OP2.class
的同一类对象,则可以获得所需的操作。 - IRTFM