The openssl package implements a bignum
class with the corresponding methods for arithmetic and comparison to perform calculations on arbitrary sized integers.
In cryptography there is a common special case for the modular exponent x^p %% m
which is used by e.g. rsa. For large p
, calculating x^p
is not feasible, but x^p %% m
can be calculated efficiently which OpenSSL implements in BN_mod_exp()
.
Does R provide any mechanism to implement the ^.bignum
and %%.bignum
methods such that when evaluating x^y %% z
we can call this special case rather than actually calculating x^p
?
Late to the party but yes, this is absolutely possible, and it’s a moderately common programming technique in some languages, such as C++, where the technique is known as expression templates.
R, being weakly typed, cannot quite harness the pattern to the same extent. But a “light” version is still possible.
In a nutshell, you define your ^.bignum
operator so that, instead or computing the result immediately, it returns a proxy object that signifies “exponentiation operation”. This proxy object has a specially overridden %%
method that invokes the ExpMod implementation (e.g. BM_mod_exp
). It also defines a method that coerces it to a bignum
by evaluating the actual x ^ y
operation.
In code this may look as follows:
# 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.
In fact, you could even override =.bignum_mod_exp_proxy
, <-.bignum_mod_exp_proxy
and assign.bignum_mod_exp_proxy
(converting assign
into an S3 generic), so that assignments z = x ^ y
are eagerly evaluated to a bignum
. However, this is probably overkill and would incur an overhead for each assignment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With